Seamers Morne Morkel and Dale Steyn took three England wickets each to lift South Africa on the second day of the third Test on Monday.
England, replying to the hosts' 291, reached 241 for seven at the close thanks to battling innings by Alastair Cook, Ian Bell and Matt Prior.
Cook fell just after tea for 65, paddling Morkel to midwicket, and Prior and Bell added 41 for the sixth wicket before Bell cut the nagging seam bowling of Jacques Kallis straight to backward point.
Bell made 48 in nearly three hours at the crease and Prior, who survived several anxious moments, completed his 12th Test half-century two balls before the close. He finished unbeaten on 52 with Graeme Swann on five.
South Africa, resuming on 279 for six, lost four wickets for 12 runs in a dramatic collapse in the morning.
Centurion Jacques Kallis fell to the first ball he faced, the second of the morning, when he edged a superb away-swinger from Graham Onions to wicketkeeper Prior for 108.
Steyn also failed to add to his score of 26 when he edged James Anderson's first ball of the day into the slips, Jonathan Trott taking a sharp catch.
Centurion Jacques Kallis fell to the first ball he faced, the second of the morning, when he edged a superb away-swinger from Graham Onions to wicketkeeper Matt Prior for 108.
Dale Steyn also failed to add to his score of 26 when he edged Anderson's first ball of the day into the slips, Jonathan Trott taking a sharp catch.
Anderson gained reward for his top-class swing bowling throughout the innings when he dismissed Morne Morkel, Graeme Swann taking a superb diving catch at second slip, and Friedel de Wet for ducks.
England were quickly in trouble in their reply when captain Andrew Strauss edged a flatfooted drive at an away-swinger from Morkel to be caught behind for two.
Cook and Trott took the score to 36 for one before Steyn struck twice in his third over.
Trott, who had cruised to 20, chopped a delivery into his stumps and, two balls later, Kevin Pietersen sent an ambitious drive straight back to the bowler, who reacted sharply to take a one-handed catch.
South Africa are 1-0 down in the four-match series having lost by an innings in the second Test in Durban last week.
South Africa (1st innings): (overnight 279-6)
G. Smith c Prior b Anderson 30
A. Prince c Prior b Anderson 0
H. Amla lbw b Onions 14
J. Kallis c Prior b Onions 108
AB de Villiers c Strauss b Swann 36
JP Duminy c Prior b Swann 0
M. Boucher lbw b Broad 51
D. Steyn c Trott b Anderson 26
M. Morkel c Swann b Anderson 0
P. Harris not out 10
F. de Wet lbw b Anderson 0
Extras (b-1, lb-13, w-1, nb-1) 16
Total (all out; 86.1 overs) 291
Fall of wickets: 1-1, 2-46, 3-51, 4-127, 5-127, 6-216, 7-280, 8-280, 9-281, 10-291.
Bowling: Anderson 21.1-1-63-5, Onions 20-4-69-2, Broad 19-6-54-1, Swann 22-1-74-2, Pietersen 4-0-17-0.
England (1st innings):
A. Strauss c Boucher b Morkel 2
A. Cook c Prince b Morkel 65
J. Trott b Steyn 20
K. Pietersen c & b Steyn 0
P. Collingwood lbw b Morkel 19
I. Bell c Duminy b Kallis 48
M. Prior not out 52
S. Broad b Steyn 25
G. Swann not out 5
Extras: (lb-2, w-2, nb-1) 5
Total: (for seven wickets, 82 overs) 241
Fall of wickets: 1-2, 2-36, 3-36, 4-73, 5-133, 6-174, 7-225.
Still to bat: J. Anderson, G. Onions.
Bowling: Morkel 19-3-57-3 (w-1), De Wet 16-3-36-0 (nb-1), Steyn 19-5-64-3, Kallis 14-2-27-1 (w-1), Harris 9-0-39-0, Duminy 5-0-16-0.