The hosts needed 15 off the final over to win and they managed just that as Reece Topley missed the chance of a run-out which would have sent the match into a super over and possibly extended England's T20 winning streak.
© Getty Images
It was a fast start with the bat for England as Jason Roy and Alex Hales scored a combined 22 runs inside the first two overs of the match.
Hales, who was dropped in the deep by Jean-Paul Duminy on 24, was eventually taken out on 27, and from that point wickets began to tumble.
In response, Amla and AB de Villiers started strongly, but England eventually made the breakthrough by ending the first-wicket partnership in the fifth over.
De Villiers left the field at the hand of Chris Jordan after scoring seven runs off 10 balls and Amla fell to Stokes for 22.
Adil Rashid got himself among the wickets in the 13th over when his delivery to Duminy (23) was caught by Root, leaving the Proteas on 76-3.
The hosts required 38 runs off 26 balls, but England halted their progress when Ali claimed the wicket of Faf du Plessis, who left the field having hit 25 runs off 30 balls.
Jordan finished with T20 career-best figures of 3-23 from his four overs thanks to the dismissals of David Miller and David Wiese, and it was left for Chris Morris and Kyle Abbott to see the Proteas home in the final over.
Abbott got Morris on strike straight away with a single and the latter then smashed a four and a six to move South Africa within touching distance of victory.
A dot ball followed but Morris then managed two runs off both of the final two deliveries as bowler Topley failed with a pair of run-out chances, the second especially bad after a good throw from Root.
The second and final T20 takes place in Johannesburg on Sunday.