Zak Crawley's maiden Test half-century gave England a solid foundation before South Africa struck back on the first day of the fourth and final Test at the Wanderers Stadium on Friday.
Holding an unbeatable 2-1 series lead, England were 192 for four when bad light ended a rain-shortened day.
England's youthful opening pair of Crawley (66) and Dom Sibley (39) shared England's first century opening partnership since 2016 and blunted South Africa's fast bowlers on a pitch which both captains expected to be challenging for batsmen.
Crawley, 21, and Sibley, 24, put on 107 before Sibley was caught down the leg side by wicketkeeper Quinton de Kock to give new cap Beuran Hendricks his first Test wicket.
South Africa claimed three more wickets to have England at a slightly precarious 157 for four but captain Joe Root and Ollie Pope took the tourists safely through to the close in deteriorating light.
Rain prevented any play before lunch and the South African bowling was surprisingly unthreatening when it did get under way.
Both teams opted for an all-seam attack on a pitch which usually favours fast bowlers but there was no discernible swing or sharp movement off the surface as England's openers scored at better than three runs an over.
England were 100 for no wicket at tea but South Africa changed their tactics after the interval, bowling more short-pitched deliveries.
Crawley, in his fourth Test, batted confidently from the start and drove strongly off the front foot, although on 56, shortly before tea, he was hit on the helmet when he missed a pull against Anrich Nortje.
He made his runs off 112 balls and hit 11 fours before he provided Rassie van der Dussen with one of three catches at first slip, edging a ball from Vernon Philander which bounced more than usual.
Joe Denly was dropped twice before he was caught by Van der Dussen off Dane Paterson for 27 and Ben Stokes made only two before he played an extravagant drive against Nortje to give Van der Dussen his third catch.