Antoine Griezmann scored twice to earn Barcelona a 2-1 comeback win over 10-man Villarreal that keeps the pressure on La Liga leaders Atletico Madrid.
Barca are now unbeaten in 24 league meetings with Villarreal but were made to work hard for their latest victory at Estadio de la Ceramica on Monday (AEST).
Griezmann struck twice in the first half, but only after Samuel Chukwueze had opened the scoring for Villarreal against the run of play with his third goal in as many league appearances.
Manu Trigueros was sent off for a studs-up challenge on Lionel Messi in a quieter second period as Barca made it eight wins from their last nine La Liga outings, moving them to within two points of Atletico.
Frenkie de Jong was presented with a glorious opportunity to open the scoring after 16 minutes when teed up by Jordi Alba for what appeared to be a back-post tap-in, but the Dutchman got his feet in a mix and Sergio Asenjo clawed the shot off the line.
Asenjo was then equal to a Messi shot at his near post and that looked to be a pivotal moment early on as Chukwueze had the ball in the net at the other end eight minutes later, the winger rounding Marc-Andre ter Stegen and tucking in.
But Griezmann levelled things up 87 seconds later with a sublime chipped finish over Asenjo and he doubled his tally soon after with a first-time shot after pouncing on a weak Juan Foyth back-pass that did not reach his keeper.
Griezmann would have had a hat-trick before the midway point if not for a low save from Asenjo, while Etienne Capoue was denied by a ter Stegen save from the game's next big moment just after the hour mark.
Villarreal were in the contest at that point, but Trigueros' red card for catching Messi on the shin with a follow-through challenge left the Europa League semi-finalists with an even tougher task on their hands.
Barca were able to see out the final 25 minutes in a stress-free manner – de Jong failing to beat Asenjo from a one-on-one in the best of the remaining chances – to stay firmly in the title hunt.