Real Madrid all but relinquished their grip on the La Liga crown as they conceded a late goal to lose 1-0 at home to Villarreal.
The misfiring champions were beaten by an 87th-minute strike from Pablo Fornals at the end of a superb break by the visitors as Real pressed for a winner.
Cristiano Ronaldo was out of sorts as Real toiled in the rain at the Bernabeu, and the forward was left aggrieved when he was denied a penalty after a trip from Mario Gaspar late in the first half.
The defeat leaves Real trailing Barcelona by 16 points, with the leaders due to play Real Sociedad on Sunday.
Real Madrid: Navas (7), Carvajal (7), Varane (7), Nacho (6), Ronaldo (6), Kroos (6), Modric (5), Bale (6), Marcelo (6), Casemiro (5), Isco (6)
Subs: Lucas (6), Asensio (6)
Villarreal: Asenjo (8), Costa (7), Alvaro (7), Bonera (6), Mario (6), Trigueros (7), Rodrigo (7), Castillejo (7), Bacca (7), Fornals (8), Raba (7)
Subs: Cheryshev (8), Unal (7), Rukavina (6)
Man of the match: Pablo Fornals
Real controlled much of the first half, and had the first sight of goal on 17 minutes when Marcelo lashed a strike from distance which Sergio Asenjo turned away with a strong fingertip.
It was the first in a series of excellent saves from the Villarreal 'keeper, and Ronaldo was the next to be denied when his deflected, dipping free-kick was turned against the bar.
Fornals provided the moment of the half when his exquisite through-ball foxed the Real defence and reached Carlos Bacca, but the Colombian was squeezed out by Keylor Navas.
And the visitors should have been made to pay on the stroke of half-time, Isco's neat cut-back finding Ronaldo whose close-range, side-foot was superbly kept out by Asenjo as Real appealed for a penalty for a trip by Gaspar.
The hosts were unhappy, and things nearly got worse in the first few minutes of the second half when substitute and former Real player Denis Cheryshev dispossessed Casemiro and danced through the defence, only to drag his shot wide of Navas' post.
Villarreal continued to threaten as the half wore on with Bacca slamming the ball into the side-netting after 65 minutes, while at the other end a frustrated-looking Ronaldo fired straight into the arms of Asenjo from a decent position 18 yards out.
Ronaldo and Blae both started for Real with Benzema still missing. Bacca started up front for the visitors.
Luka Modric lifted a great chance over the bar from the edge of the box as the minutes ticked away for Real, but, with three minutes to go, Villarreal hit the champions on the break, Cheryshev feeding fellow substitute Enes Unal whose first-time shot rebounded off Navas to Fornals, who kept his cool to lob home.
Man of the match - Pablo Fornals
The Villarreal midfielder provided the moment of the first-half in feeding a stunning ball through to Bacca with the outside of his boot, completely fooling the Real central-defensive pairing and creating an excellent chance for his side to take the lead. He was a constant threat as the visitors held their own in midfield, and the finish to lob Navas and give his side the victory was coolness personified.
Real Madrid now face Leganes in the Copa del Rey on Thursday at 8.30pm, whilst Villarreal face Levante in La Liga on Saturday at 5.30pm.