Alviro Petersen scored 182, his highest in a test match, as he steered South African to a commanding 419 all out on day two of the second test at Headingley on Friday.
England safely reached 48 without loss when bad light and rain ended play with 22 overs still to be bowled.
Alastair Cook was on 20 and Andrew Strauss 19 after surviving some erratic bowling which mixed accurate and moving deliveries that narrowly missed the outside edge with more wayward balls that were suitably dispatched for boundaries.
South Africa are the team in the control and England will need to bat until Sunday if they are to at least pull level with the tourists' total.
England, 1-0 down in the three-match series, must avoid defeat in the series if they are to prevent South Africa from leapfrogging them to the top of the world test rankings.
Petersen did not appear in the field for South Africa after injuring himself late in his innings.
Petersen's innings, which lasted 530 minutes, surpassed his previous best of 156 against New Zealand as he punished England for dropping him on 29 on the first morning when Cook spilled a straightforward chance at second slip.
Petersen was finally caught behind off Stuart Broad, but only departed after an England review when umpire Rod Tucker initially gave him not out.
It was the third time an original decision was overturned on review, the previous two involving 'out' lbw decisions against Petersen when on 119 and 124.
South Africa had to survive a testing morning, as England began the day with six maidens and they took 25 minutes to score their first run against very accurate and threatening bowling from Broad and James Anderson. But the Proteas came through to maintain their advantage.
JP Duminy scored 48 not out at number eight, shepherding the tail to see the Proteas past the morale-boosting mark of 400.
The first wicket of the day was left-hander Jacques Rudolph, who was stumped from a ripping turner by part-time spinner Kevin Pietersen after the decision was sent to third umpire Asad Rauf.
Petersen was hardly troubled though in his 365-ball innings and he was especially profitable through the square leg and midwicket regions any time England's bowlers' strayed with their line.
Steven Finn had Vernon Philander (13) caught on the square leg boundary, Morne Morkel (19) added 39 precious runs with Duminy for the ninth wicket before he was caught at mid-on off Broad, and Anderson had last man Imran Tahir caught at slip for a duck.
Strauss was almost caught at first slip by Graeme Smith off Philander on six but the ball bounced inches short of the fielder. He responded by playing two elegant straight driven fours to Philander and then Dale Steyn in the next over.