South Africa were 126 for eight in reply to England's first innings 353, a deficit of 227 runs, at stumps on the second day of the third Test at The Oval on Friday.
England debutant seamer Toby Roland-Jones removed all of South Africa's top four on his way to figures of four for 39 in 11 overs at the close.
Temba Bavuma was 34 not out and Morne Morkel unbeaten on two in what is the 100th Test staged at The Oval.
Earlier, Ben Stokes underlined his prowess as the rarest of all-round talents with his glorious century propelling England to a challenging total of 353.
Not for the first time, Stokes proved the scourge of the Proteas, smashing two consecutive sixes to take him to his fifth Test century. He also struck his next delivery over the ropes before being the last man out for 112 from 153 balls.
Alastair Cook had earlier missed out on a 31st Test hundred, falling for 88, but with a magnificent counter-attack combining watchfulness and remarkable power, Stokes delivered the performance The Oval merited in its 100th Test.
There was a moment when, with Stokes on 91 and down to his last partner James Anderson, it appeared as if he was about to miss out on his richly-deserved ton.
Attempting to smash spinner Keshav Maharaj, he miscued, allowing Faf du Plessis to catch him on the long-on boundary. However, with momentum sending him tumbling backwards, the South African captain fell into the boundary markers and six was awarded much to the delight of a packed crowd.
Stokes celebrated by hoisting the next ball in the same direction, connecting perfectly as the ball sailed into the crowd to take him to three figures off 144 balls.
Stokes made it three sixes in a row over deep mid-wicket, the first time an England batsman had achieved the feat in a Test since Wally Hammond against New Zealand 84 years ago.
Stokes's assault had echoes of his incredible double hundred against the South Africans last year but, going for one blow too many off Morne Morkel, he was caught by Kagiso Rabada.
Earlier, Cook, who had batted throughout the rain-interrupted opening day to anchor his side's struggle to an overnight 171 for four, added six runs before being trapped by Morkel.
He looked dismayed by the lbw decision and called for a review but it showed the ball would have clipped the bails, thus ending his 200-ball vigil.
The dismissal brought together Stokes and Jonny Bairstow, no strangers to putting the Proteas to the sword after their epic stand of 399 in Cape Town, and the pair again combined sweetly in a partnership of 75.
After South Africa had taken the second new ball, Bairstow was quickly snaffled for 36 but Stokes, who went past 2,000 runs in Tests, found another willing partner in Roland-Jones, who enjoyed his six and four fours hugely.
The touring side were again hampered by the absence of key paceman Vernon Philander, who was taken to hospital for tests because of a stomach bug.
SCORES IN BRIEF
ENGLAND: First innings 353 (Cook 88, Westley 25, Root 29. Stokes 112, Bairstow 36, Roland-Jones 25; Morkel 3-70, Philander 2-32, Rabada 3-85)
SOUTH AFRICA: First innings 126 for 8 (Bavuma 34 not out, Rabada 30, de Kock 17; Roland-Jones 4-39, Anderson 2-16, Stokes 1-26)