Centurion: Kagiso Rabada became the youngest South Africa bowler to take seven wickets in an innings as the home side took command of the final Test in Centurion.
The 20-year-old, playing only his sixth Test, claimed 7-112 to help bowl England out for 342, a first-innings deficit of 133.
Alastair Cook and Joe Root made 76 and Moeen Ali was last out for 61.
Hashim Amla was dropped on nought as South Africa reached 42-1- a lead of 175 - before bad light ended play.
James Anderson gave England faint hope of an attainable final innings chase when Dean Elgar was smartly caught behind in the third over, and England's record wicket-taker then saw Amla put down by Alex Hales at fourth slip.
Rabada had decimated the England middle-order before lunch, claiming the big wicket of Ben Stokes (33) during a rain-hit middle session.
England have already wrapped up the series with an unassailable 2-0 lead.
Stokes looked at his fluent best before he was caught at slip by Hashim Amla shortly after South Africa, who posted a first innings total of 475, had taken the new ball.
Chris Woakes (26) was the only other wicket to fall in the session and could count himself unlucky, an edge off the part-time spin of JP Duminy hitting the thigh of wicketkeeper Quinton de Kock and looping to Dean Elgar at slip.
Rabada had removed Joe Root (76), James Taylor (14) and Jonny Bairstow (0) in quick succession in the minutes before lunch.
Root had looked set for a big score but was caught by De Kock having a drive at Rabada after he had brought up his fourth half-century of the series.
Taylor fell to the same combination trying to pull a short ball, before Bairstow got a feather edge through to De Kock.
Rabada is just the second player in history to take six wickets in an innings in both tests and One-Day Internationals before the age of 21, joining Pakistan great Waqar Younis on that short list.
Captain Alastair Cook (76) was the first wicket to fall on day three when he was caught behind by De Kock off the bowling of fast bowler Morne Morkel.
Coming around the wicket to the left-hander, Morkel angled the ball into Cook’s body and induced an edge as it moved away slightly off the wicket.
It left Cook still 41 runs shy of becoming the first England batsman to reach 10,000 test runs after he had put on 99 for the third wicket with Root.
But Rabada's heroics will make the home side extremely confident of ending the series with a consolation victory, having suffered defeats at Durban and Johannesburg.
Brief scores
South Africa - 475 (de Kock 129*, Cook 115, Amla 109, Stokes 4-86) and 42 for 1
England - 342 (Cook 76, Root 76, Ali 61, Rabada 7-122)
Status - South Africa lead by 175 runs