Match ends, Barcelona 3, Villarreal 2.
Lionel Messi scored the winning goal as Barcelona twice came from behind to beat Villarreal and record their eighth victory in a row.
Barca fell behind when Denis Cheryshev diverted a shot home but Neymar levelled from a rebound.
Luciano Vietto slotted home to put the visitors ahead with the first of three goals in the space of four minutes.
Rafinha equalised from close range before Messi curled home to cut Real Madrid's lead at the top to one point.
Barca made the the early running, with former Liverpool striker Luis Suarez denied by Sergio Asenjo following Dani Alves' cross.
But Villarreal went in front when Cheryshev stuck out a leg and diverted Mario's off-target shot into the net.
A fine move led to Barca equalising as Rafinha's shot following Messi's cross was saved by Asenjo only for Neymar to strike home the rebound.
The visitors regained the lead early in the second half as Gerard Pique lost the ball to Giovani, who ran on and crossed for Vietto to net his 10th goal of the season.
Villarreal's lead lasted just two minutes, though, with Rafinha netting after Victor Ruiz blocked Messi's header following Suarez's cross.
And Barca grabbed the winner as Messi's right-foot curler took him to 32 goals for the season and kept Real Madrid well in sight.
- 22Alves da Silva
- 12RafinhaBooked at 63minsSubstituted forRakiticat 88'minutes
- 5BusquetsSubstituted forMathieuat 71'minutes
- 9SuárezSubstituted forPedroat 79'minutes
- 1ter Stegen
- 20Roberto Carnicer
- 2M Gaspar
- 18Costa Jordá
- 6J dos SantosBooked at 41minsSubstituted forGómez Bardonadoat 84'minutes
- 4PinaSubstituted forTrigueros Muñozat 76'minutes
- 21BrunoBooked at 23mins
- 9G dos SantosSubstituted forUcheat 89'minutes
- 14Trigueros Muñoz
- 16Dorado Ramírez
- 19Gómez Bardonado
- 23Moreno Balagueró
- 25Sánchez Martínez
- Iñaki Vicandi Garrido
- Shots on Target
Second Half ends, Barcelona 3, Villarreal 2.
Andrés Iniesta (Barcelona) wins a free kick in the defensive half.
Foul by Mario (Villarreal).
Foul by Lionel Messi (Barcelona).
Luciano Vietto (Villarreal) wins a free kick in the defensive half.
Lionel Messi (Barcelona) wins a free kick on the right wing.
Foul by Jaume Costa (Villarreal).
Corner, Villarreal. Conceded by Dani Alves.
Substitution, Villarreal. Ikechukwu Uche replaces Giovani dos Santos.
Ivan Rakitic (Barcelona) wins a free kick in the defensive half.
Foul by Denis Cheryshev (Villarreal).
Neymar (Barcelona) wins a free kick on the left wing.
Foul by Mario (Villarreal).
Substitution, Barcelona. Ivan Rakitic replaces Rafinha.
Offside, Villarreal. Manu Trigueros tries a through ball, but Giovani dos Santos is caught offside.
Delay over. They are ready to continue.
Delay in match Rafinha (Barcelona) because of an injury.
Substitution, Villarreal. Moi Gómez replaces Jonathan dos Santos.
Attempt missed. Luciano Vietto (Villarreal) header from the centre of the box is too high. Assisted by Jonathan dos Santos with a cross following a set piece situation.