Cape Town: Hashim Amla's unbeaten 157 helped South Africa frustrate England as the tourists took only one wicket on day three of the second Test in Cape Town.
The South Africa captain reached his 24th Test century off 214 balls after he was dropped by James Anderson on 76.
Resuming on 141-2, Amla added another 127 runs with AB de Villiers who was removed by Steven Finn for 88.
Yet Amla proved immovable as Faf du Plessis hit 51 not out, guiding the Proteas to 353-3, trailing by 276 runs.
South Africa require another 72 runs to avoid the follow-on.
Day two saw a record 453 runs scored, the most in a day of Test cricket in South Africa, yet the hosts added just 212 to their overnight score on day three as they made steady inroads into England's first innings total of 629-6 declared.
De Villiers brought up his half-century to go past 8,000 Test runs as he and Amla also recorded South Africa's first century stand in nine Tests, having failed to achieve that feat in 2015.
After Amla's reprieve when facing Joe Root's off-spin, South Africa reached 199-2 at lunch and looked set to complete another session unbeaten until De Villiers picked out Anderson at mid-wicket from a well-directed Finn short ball.
Du Plessis then built on a bright start to bring up his first half-century in 10 innings as England toiled on a flat pitch under hot conditions.
England failed to take their chances after stifling South Africa of runs throughout the day.
The part-time spin of Root drew Amla into a rare flashing drive, but Anderson could not hold on at first slip.
The Proteas skipper was also dropped on 120 by a diving Nick Compton at backward point off Finn, with Root having spilled a chance off De Villiers, then on five, on day two.
Despite those disappointments, England looked threatening with the new ball in the spell before tea, Finn bowling with pace and bounce to finally snare De Villiers into mistiming a pull shot straight to Anderson, who juggled but held on.
England could not sustain the pressure on new man Du Plessis though, with the decision to throw the ball to opening batsman Alex Hales late in the day indicative of a tiring bowling attack on a lifeless wicket.
Yet the last six Tests at Newlands have all produced a positive result and England will hope their 276-run advantage can still inspire them to a second consecutive victory in the four-match series.
Brief scores
England - 629 for 6 dec (Stokes 258, Bairstow 150*, Hales 60, Root 50)
South Africa - 353 for 3 (Amla 157*, de Villiers 88, du Plessis 51*)
Status - South Africa trail by 276 runs