Madrid, meanwhile, had to fight back from 2-0 down with ten men to rescue a point in a 2-2 draw at lowly Osasuna in a game which saw Gareth Bale taken off.
Following on from his first Barça hat-trick in the 6-1 demolition of Celtic in midweek, Neymar made the difference once more as he converted from the spot after Mario Gaspar had blocked Jordi Alba's cross with his hand.
Villarreal were level just three minutes after the interval when Mario Musacchio bulleted home a Manu Trigueros corner.
But Neymar had the final word as he smashed into an empty net from Alexis Sanchez's cut-back 22 minutes from time.
Barça boss Gerardo Martino had made five changes from the side that thrashed Celtic and it was one of those recalled to the side, Alex Song, who had the first opportunity as he smashed a shot off the post from Neymar's corner.
The hosts' dominance in possession throughout the first-half was finally rewarded on the half hour when Mario handled inside his own area and Neymar coolly dispatched the spot-kick for his ninth goal of the season.
Sergio Asenjo then produced a wonderful save from Sanchez to keep his side in the game six minutes before the break.
And it took the visitors just three minutes after the restart to level as Musacchio took advantage of some awful marking to head high past Jose Manuel Pinto.
Cesc Fabregas had a great chance to put Barça back in front 15 minutes later when he was played in by Sanchez, but Asenjo was off his line quickly to turn the midfielder's effort over the bar.
However, the 'keeper was left helpless when Sanchez latched onto Fabregas' pass behind the Villarreal defence and squared for Neymar to finish from close range.
Real's task became even tougher when Sergio Ramos was sent-off for two bookable offences moments later, but Isco halved the deficit a minute before the break to give Madrid hope.
Despite being in desperate need of a goal, Madrid coach Carlo Ancelotti substituted the in-form Bale just ten minutes into the second period.
"We lost a bit of control of the game after the first goal because we had played very well and with a lot of quality in the first 20 minutes," Ancelotti said.
"It was incredible to be 2-0 down with ten men towards the end of the first-half given how we had played.
"The team showed great character and attitude to come back and draw the game."
The hosts went in front with virtually their first attack of the game as Marc Bertran's excellent in-swinging cross was met by the unmarked Riera at the back post.
Six minutes before half-time it was 2-0 as after Diego Lopez had made a fine save from Damia's header, Riera was on hand to nod into an empty net.
Things went from bad to worse for Ancelotti's men moments later when Ramos was harshly sent-off for the 18th time in his Madrid career after clashing with Roberto Torres in midfield.
With his side failing to make much of an impression after the break, Ancelotti surprisingly withdrew Bale with over half an hour still to play as Angel di Maria replaced the Welshman.
The visitors had renewed hope when Silva dived in on Ronaldo and was rightly shown his second yellow card to make it ten against ten.
In Saturday's other La Liga action, Granada won on the road at Rayo Vallecano thanks to goals from Fran Rico and Riki on either side of the half.
A lone goal from Paraguay international Roque Santa Cruz was enough to give Malaga a much-needed 1-0 victory at home to Getafe in the day's final match.