Root took four for 31 as South Africa slumped to 102 for six after being forced to follow on.
They were still 188 runs short of avoiding an innings defeat, with England seemingly assured of taking an unbeatable 2-1 series lead into the final Test starting in Johannesburg on Friday.
England dominated the day despite a second lengthy rain break in two days.
They needed only 28 balls to dismiss South Africa’s last four batsmen for the addition of a single run at the start of play, with Stuart Broad picking up three of the wickets without conceding a run.
South Africa were all out for 209 and Root immediately enforced the follow-on.
Rain early in South Africa’s second innings threatened to thwart England’s push for victory but fast bowler Mark Wood struck twice when play resumed more than three hours later.
Wood used his extreme pace to send Dean Elgar’s off stump flying out of the ground before he had Zubayr Hamza feeling for a ball outside his leg stump to present a catch to wicketkeeper Jos Buttler.
Then it was over to Root, who in 90 previous Tests had never taken more than two wickets in an innings.
Bowling from the end where fellow off-spinner Dom Bess took five wickets in the first innings, he trapped Pieter Malan leg before wicket in the last over before tea.
Root took three more wickets after the interval.
Rassie van der Dussen was superbly caught at short leg by Ollie Pope and first innings top-scorer Quinton de Kock fell to a leaping catch at backward point by a leaping Wood.
South Africa captain Faf du Plessis was sixth out after making 36, his highest score of what has been a poor series for him. He was another bat-pad victim, giving Pope his fifth catch of the match.
In overcast conditions at the start of play, Broad and Sam Curran achieved some swing with a ball which was almost new, but they were aided by some poor shots by the South African batsmen.
Broad struck with the fourth delivery of the morning when Vernon Philander missed a drive against a full delivery which swung in between bat and pad. He was out for 27.
Curran uprooted De Kock’s middle stump with the fifth ball of the next over with the left-hander missing an extravagant drive against a ball angled in from the left-armed bowler.
De Kock had not added to his overnight score of 63.
Keshav Maharaj was bowled off a bottom edge when he tried to pull a ball from Broad before Kagiso Rabada, who scored the only run in the collapse, hit a simple catch to mid-off to give Broad his third wicket.
Broad finished with three for 30. AFP