Match ends, Real Madrid 0, Barcelona 1.
Barcelona moved 10 points clear at the top of La Liga after a second El Clasico win in four days, Ivan Rakitic's goal all but ending Real Madrid's faint title hopes.
Rakitic kept his composure to beat Thibaut Courtois after a one-two with Sergi Roberto split Real's defence.
Karim Benzema and Raphael Varane were denied towards the end but Real rarely looked like equalising at the Bernabeu.
They are third in the table, 12 points behind Barcelona with 12 games left.
Atletico Madrid, who are second, will cut Barca's lead at the top to seven points if they win at Real Sociedad on Sunday (17:30 GMT).
Barca closing in on fourth title in five seasons
Barcelona's players formed a huddle as they celebrated on the pitch after the final whistle.
This was their 18th victory in 26 games in the league and, barring a disastrous set of results, they will retain the title they won by 14 points last season.
Having beaten Real in the Copa del Rey on Wednesday, Ernesto Valverde's side inflicted further misery on their bitter rivals.
Barca showed their class all over the pitch. Croatia midfielder Rakitic raced clear of Sergio Ramos to score before Courtois produced a double save to keep out Luis Suarez and Lionel Messi.
At the back, Gerard Pique and Clement Lenglet were solid as Barca clocked up a fifth clean sheet in six games.
This will not go down as a classic but Barcelona emerged with their treble hopes intact.
Barca boss Valverde was not getting carried away though.
"We still have a whole world in front of us. We know Madrid can win a lot of consecutive games, Atletico Madrid are still there too," he said.
"Until it is mathematically secure, we will keep battling. You have to keep fighting, if you think about it, you start losing."
Real's season falling apart
A few days ago Real Madrid were still in the hunt for the Copa del Rey, while victory over Barca on Saturday would have given them a fighting chance in the league.
Instead their season, at least domestically, lies in tatters after another disappointing home performance.
They lacked cutting edge. Gareth Bale replaced having made little impact but he was by no means alone.
Luka Modric wasted a good chance when he headed over on the stroke of half-time and Karim Benzema scuffed wide in front of an open goal early in the second half.
Meanwhile, Ramos' arm connected with Messi's face at the end of the first half in what was a niggly, rather than dirty, game.
This was Real's third successive home defeat and the locals made their feelings clear at the final whistle.
Real's next match is against Ajax in the last 16 of the Champions League on Tuesday, with the Spanish side 2-1 up from the first leg.
The European champions need to keep their season alive. Another defeat could be damaging for Santiago Solari and his players.
"The league is always important. The team will compete until the last date," said Solari.
"We played as a team. It was a game hard fought and we matched them in almost everything. We looked for it in every way and we could not score.
"Football is pretty simple sometimes, it's a good metaphor for life."
Man of the match - Lionel Messi (Barcelona)
While holders Real Madrid host Ajax in the Champions League last 16 on Tuesday (20:00 GMT), Barcelona have a week to prepare for the visit of Rayo Vallecano in La Liga next Saturday (17:30).
- 2CarvajalBooked at 89mins
- 4RamosBooked at 61mins
- 14CasemiroSubstituted forIscoat 75'minutes
- 8KroosSubstituted forValverdeat 55'minutes
- 11BaleSubstituted forAsensioat 61'minutesBooked at 82mins
- 28Vinícius Júnior
- 1ter Stegen
- 15LengletBooked at 63mins
- 5BusquetsBooked at 2minsSubstituted forNélson Semedoat 90+2'minutes
- 8ArthurSubstituted forVidalat 71'minutes
- 11DembéléSubstituted forCoutinhoat 78'minutes
- 2Nélson Semedo
- Alberto Undiano Mallenco
- Shots on Target
Second Half ends, Real Madrid 0, Barcelona 1.
Luis Suárez (Barcelona) wins a free kick on the right wing.
Foul by Sergio Reguilón (Real Madrid).
Attempt missed. Lionel Messi (Barcelona) left footed shot from outside the box is close, but misses to the left. Assisted by Arturo Vidal.
Offside, Barcelona. Lionel Messi tries a through ball, but Coutinho is caught offside.
Substitution, Barcelona. Nélson Semedo replaces Sergio Busquets.
Gerard Piqué (Barcelona) wins a free kick in the defensive half.
Foul by Sergio Ramos (Real Madrid).
Attempt blocked. Vinícius Júnior (Real Madrid) right footed shot from the left side of the box is blocked. Assisted by Isco.
Corner, Real Madrid. Conceded by Sergi Roberto.
Foul by Luis Suárez (Barcelona).
Raphael Varane (Real Madrid) wins a free kick in the defensive half.
Daniel Carvajal (Real Madrid) is shown the yellow card.
Clément Lenglet (Barcelona) wins a free kick in the defensive half.
Foul by Daniel Carvajal (Real Madrid).
Attempt saved. Karim Benzema (Real Madrid) right footed shot from outside the box is saved in the top left corner. Assisted by Vinícius Júnior.
Foul by Lionel Messi (Barcelona).
Daniel Carvajal (Real Madrid) wins a free kick in the defensive half.
Lionel Messi (Barcelona) wins a free kick in the defensive half.