Real Madrid deservedly took the lead in the 15th minute when Casemiro headed home from a corner, leaving Atletico behind for the first time in their 11th league game of the season.
Atletico were utterly outplayed by the champions and did not have any attempts on goal in the first half, while they failed to manage a shot on target until the 80th minute, when Saul Niguez's header was saved by Thibaut Courtois.
Atletico still lead the standings on 26 points, while Real climbed to third and closed the gap on their city rivals to three points, although Diego Simeone's side have a game in hand.
The win completed a remarkable week for Real after beating Sevilla in La Liga and Borussia Moenchengladbach to progress in the Champions League and will further ease the pressure on Zidane after his side's relatively poor start to the campaign.
The Spanish champions were boosted by the return of first-choice right back Carvajal but Zidane also rewarded Lucas Vazquez for his outstanding efforts in deputising for the defender and deployed him as a right winger.
The move gave Real extra intensity and work rate and Atletico could barely cope with the hosts' whirlwind start, as Karim Benzema forced Oblak to tip a stinging shot onto the post and moments latter narrowly failed to connect with a cross.
Real continued to dominate the first half and Simeone sprung a triple change at the interval in a bid to give his side some control of a match that was slipping from their grasp.
The move almost bore fruit as substitute Thomas Lemar ghosted in unmarked at the far post from close range to meet a cross but somehow hit the side-netting, Simeone howling in disbelief on the sidelines at a glorious chance gone to waste.
Carvajal then delivered an emphatic counter punch to put the game out of Atletico's reach and although the visitors reacted well they never looked like staging a comeback.