Real Madrid may not even challenge for the title let alone win it as a shock 2-0 defeat at home to Real Sociedad left them 10 points behind Barcelona in La Liga.
Barca took their advantage over their fiercest rivals into double figures by beating Getafe 2-1 while Atletico Madrid and Sevilla also gained on the European champions, despite earlier sharing a 1-1 draw.
Lionel Messi and Luis Suarez's goals were enough for Barca, for whom the weekend could hardly have gone better.
Antoine Griezmann's stunning free-kick earned Atletico a point at the Ramon Sanchez Pizjuan.
Madrid played with 10 men for half an hour after Lucas Vazquez was sent off but by then they already trailed to Willian Jose's early penalty.
Ruben Pardo wrapped up a brilliant victory for La Real, who had won this fixture only once in their last 22 attempts.
This was their first victory at the Santiago Bernabeu since 2004 and then, Madrid fired coach Carlos Queiroz a day later.
Santiago Solari is not there yet, even if he was asked afterwards if he deserved to keep his job. "We fight to win the next game," he said.
The honeymoon period Solari enjoyed in November though after replacing Julen Lopetegui is well and truly over.
This loss, coming after the draw away to Villarreal on Wednesday, means Madrid sit fifth, outside even the Champions League places.
"Everything went against us today," Solari said. "We did everything we could but the ball just would not go in."
A stoney-faced Florentino Perez was among the 53,412 watching on, the club's second lowest attendance of the season. "We will try to get them back," Solari said, before making a swift exit.
Barcelona have won seven out of the last 10 La Liga titles and now own a five-point cushion. If they are to slip up in 2019, Atletico or Sevilla would seem the ones able to take advantage.
Gareth Bale was missing with a calf injury but it was the 18-year-old Vinicius Junior that came in, not Isco, who is yet to start a league game under Solari.
La Real's penalty was awarded after 75 seconds and converted after 150. Mikel Merino ghosted past Sergio Ramos and inside Marcelo.
Casemiro tried to cover but bundled Merino to the ground. Willian Jose went high and down the middle.
Karim Benzema spurned the best of Madrid's chances before the break, lashing wide with only Geronimo Rulli to beat.
Rulli was not needed then but he would be, many times. He denied Vinicius, Benzema and Luka Modric in quick succession. Ramos wanted a penalty for a push in his back but the appeal was desperate.
Vazquez clipped the post with a looping cross but that was not enough to hush the angry whistles at the end of the half.
The second period was frantic, with chances at both ends. La Real could have sealed it when Mikel Oyarzabal fired over and the weaving Januzaj twice went close.
Isco replaced Casemiro in the 57th minute and in the 61st Vazquez was sent off. A rash sliding challenge had earned a yellow card towards the end of the first half and even if the chip at Merino's heels seemed harmless, he was foolish to take the risk.
Down to 10, Madrid still pushed and had a more convincing penalty appeal when Vinicius tumbled over the arm of Rulli. Referee Jose Munuera stood firm. The decision was "scandalous", Ramos said later.
Januzaj should have wrapped it up when his shot was saved by the legs of Thibaut Courtois but Pardo did, heading in a cross from Willian Jose, who could even have made it three in injury time.
Barca rode their luck as Getafe missed several chances to snatch a draw. Instead, Messi's 399th La Liga goal and a sumptuous volley from Suarez did the job at the Coliseum Alfonso Perez, despite Jaime Mata giving Getafe hope.