Barca had the chance to inflict a third consecutive defeat on their rivals and increase the pressure on Zinedine Zidane.
Instead, Real’s win earns them a six-point lead over the Catalans, having played one game more.
“They are only three points but we have to enjoy them, especially after everything that has been said about the squad,” said Zidane.
Sergio Ramos’ penalty and a late Luka Modric goal finished Barcelona off after Federico Valverde and Ansu Fati had traded early strikes in a compelling game that defied those expecting further evidence of two heavyweights in decline.
“You always have bad spells in a season and hopefully this one only lasted a week,” said Ramos. “To win in the home of your oldest rivals is always satisfying.”
Atletico Madrid took advantage by beating Real Betis 2-0 to move up to second in the table but Sevilla missed out, slipping to a surprise 1-0 loss at home to Eibar.
Barcelona might feel hard done by, especially as Ramos’ penalty was awarded after a check by VAR and a hugely exaggerated fall by Madrid’s captain after Clement Lenglet tugged his shirt.
“Maybe one day you can explain how VAR works here in Spain,” said Ronald Koeman. “We’ve had five games in the league and VAR has only intervened against Barca.”
But aside from an impressive spell in the first half, when Lionel Messi threatened to win the game on his own, Real were dominant for longer spells and pulled away when it mattered.
This was Koeman’s first Clasico as Barcelona coach and some of the pressure Zidane would have felt from a loss is now transferred to the Dutchman, who has overseen only three wins from his first six games in charge.
Barcelona face Juventus on Wednesday in the Champions League, without the suspended Gerard Pique.
Every Barca set-back now reflects on the future of Messi, for whom this could even have been the last Clasico at Camp Nou. The Argentinian, who failed in his attempt to leave last summer, has still to score from open play this season.
Camp Nou is normally a cauldron for the Clasico. Barcelona’s faithful greet the two sides with enormous mosaics featuring the clubs blue-and-burgundy colors, and use their 90,000-plus lungs to make it as uncomfortable as can be for the visitors. On Saturday, Europe’s biggest stadium was warmed by a glorious sun but empty except for reserve players in face masks.
Koeman’s first Clasico in his mission to rebuild the team that failed to win a trophy last season prompted big decisions to play two teenagers and leave Antoine Griezmann on the bench. Koeman surprised by starting Pedro ‘Pedri’ Gonzalez alongside fellow 17-year-old Fati in attack.
Valverde struck five minutes in for Real when he took a through ball from Karim Benzema and blasted it inside the far post.
Fati hit right back three minutes later. The budding star stabbed home his fifth goal in six games from a pass by Jordi Alba after Messi found the left back with a lob down the left side.
Barcelona took the initiative after the restart but their momentum was checked by Lenglet’s error, a tug in the box clear enough that Ramos’ shirt was stretched, even if the fall was comical. Referee Juan Martinez checked the monitor. Ramos found the corner.
Koeman sent on forwards Griezmann, Ousmane Dembele, Francisco Trincao and Martin Brathwaite late to press for the equaliser.
With his defense exposed, Neto resisted as he could, making three good saves until substitute Modric drew him off his line and fired in Real’s third.
Atletico are only a point behind their city rivals and have a game in hand after goals from Marcos Llorente and Luis Suarez saw off Betis, who had Martin Montoya sent off with 16 minutes left.