Real Madrid will continue to chase Barcelona until the end of the season but the Catalan club are now heavy favourites to lift the La Liga title.
After 16 minutes at the Santiago Bernabéu on Saturday night, Madrid took the lead when Villarreal centre-back Pau Torres put the ball into his own net.
In the 39th minute, Samu Chukwueze danced past Nacho and buried a shot past Thibaut Courtois to equalise for the Yellow Submarine, who last won at the Bernabéu in 2018 when Pablo Fornals scored the only goal of the game.
Vinícius had Madrid ahead again three minutes into the second half when he brushed past Chukwueze and Aïssa Mandi to give the home side the lead again.
José Luis Morales came off the bench for Villarreal and made an immediate impact. The former Levante man’s goal was initially ruled out for offside but after a VAR check, it was given and Quique Setién’s side were back in the game.
Substitute Luka Modric played Marco Asensio in with just over 10 minutes on the clock but veteran shot-stopper Pepe Reina denied the forward’s volley.
Chukwueze then produced a goal that he will never forget, bending an effort into the top corner from 25 yards to give Villarreal a 3-2 win over the current La Liga champions, who are unlikely to retain their title.
Barcelona take on Girona on Monday and have the chance to extend their lead to 15 points over their historic rivals Madrid.