England, needing an improbable 376 to win, were bowled out for 268 just before tea as their bottom order offered scant resistance to a barrage of pace once South Africa had taken the second new ball.
Kagiso Rabada proved the destroyer-in-chief with 4-103, assisted by Anrich Nortje who took three wickets for 56 runs.
The turning point proved the key wickets of both England captain Joe Root and potential match-winner Ben Stokes, whose presence at the crease at lunch still offered England the chance of a dramatic win.
Stokes, who had led England’s highest ever successful run chase when they scored 362-9 at Headingley to beat Australia earlier this year, was bowled by spinner Keshav Maharaj for 14 just as he and Root were increasing the run rate after England had gone to lunch on 171-3.
The second new ball then accounted for Jonny Bairstow, who hit a boundary off Rabada before edging the second delivery of the 81st over to gully, where Zubayr Hamza took a sharp catch.
Root battled his way to 48 before being caught behind, effectively ending England’s hopes.
He was undone by a fuller delivery from Nortje, playing a poor shot outside off stump and getting a nick through to wicketkeeper Quinton de Kock.
The last four wickets followed quickly thereafter as the tail was swept away by Rabada and Nortje.
The Test had still been delicately poised at lunch, even after Rory Burns and Joe Denly had been dismissed.
Burns had been strangled by the bowling of Vernon Philander, whose first four overs of the morning were maidens. When he was replaced in the attack by Nortje, the England opener saw a chance to begin to add to his run tally, only to sky a hook shot straight up into the air for Rabada at mid-on to bag the catch.
Burns was out for 84 while Denly made 31 before being trapped leg before wicket by debutant Dwaine Pretorius.
The teams now move onto Cape Town for the second Test at Newlands from Jan. 3-7.