Barcelona go back to within four points of leaders Real Madrid – with one of their best performances in recent times.
They took an early lead when Pau Torres turned in Jordi Alba’s cross but Gerard Moreno levelled for Villarreal.
Lionel Messi brilliantly won the ball in midfield before feeding Luis Suarez – who curled in from 20 yards – and the Barca captain then backheeled to Antoine Griezmann, who scored a magnificent chip.
Ansu Fati blasted in a late fourth.
Barca’s front three of Messi, Suarez and Griezmann clicked perfectly in one of their best performances in recent months.
Villarreal XI: Albiol, Asenjo, Cazorla, Iborra, Gaspar, Alcacer, G. Moreno, Moreno, Anguissa, P. Torres, S. Chukwueze
Subs: B.Soriano, Andrés Fernández, Bacca, Moi Gómez, Trigueros, Xavi Quintillà, R.Peña, S. Chakla, Manu Morlanes, Ontiveros, Sergio Lozano, Fer Niño
Barcelona XI: Messi, Suarez, Pique, Vidal, Alba, Busquets, Griezmann, Ter Stegen, Roberto, Lenglet, Semedo
Subs: Rakitic, Neto, Braithwaite, Arthur, Pena, R. Araújo, Jorge Cuenca, Dani Morer, Monchu, Riqui Puig, Álex Collado, Fati