The Proteas bowling unit swarmed over the Sri Lankans to dismiss them for 163, despite 74 from Niroshan Dickwella.
The Wanderers, well-known to produce big totals and chases, saw SA winning the toss with skipper AB de Villiers electing to bowl.
Sri Lanka showed no improvement from the last two ODIs, posting a third-consecutive total below 200. Dwaine Pretorius, who came in for Wayne Parnell, starred for the Proteas picking up his best ODI figures of 3-19.
Dickwella and Upul Tharanga got off to a good start putting on 60 for the first wicket, until Kagiso Rabada (2-39) got the breakthrough dismissing Tharanga (31) on the last ball of the 12th over.
Kusal Mendis (4) was the next to go. The 20-year-old faced seven balls until he edged a brilliantly-shaped delivery from Andile Phehlukwayo (2-26), Hashim Amla taking a superb diving catch to his left at slip, as Sri Lanka found themselves at 80-2 after 15 overs.
Dickwella continued to battle on, as he reached his second career ODI fifty, but the South African bowling attack continued to wipe out his partners at the other end. Phehlukwayo dismissed Chandimal who picked out the safe hands of Chris Morris on the boundary as Sri Lanka went from 60-0 (11.5) to 89-3 (19.0). De Silva was next to fall, Morris (1-38) finding the edge of De Silva into the hands of Amla for 16.
A swarm of bees on the field disrupted the game with Sri Lanka on 117-4 after 26.3 overs, with Dickwella continuing to fight to keep his side in the game. The interruption never took the sting out of the SA bowling attack, as they swarmed over Sri Lanka.
Rabada struck shortly after the bee delay to dismiss Asela Gunaratne (29.1) on two for his second and then Pretorius got the big one of Dickwella in the 33rd over, after an explosive innings of 74 off 80 deliveries (seven fours) saw the hosts struggling at 149-6 (32.2).
On his 100th ODI, Faf Du Plessis took a superman catch to his right at second slip to dismiss debutant Lahiru Madushanka for a duck as Pretorius picked up his second, and Sri Lanka remained stuck on 149-7 after 35 overs. Pretorius picked up another just two overs later, then a magnificent delivery from Imran Tahir (2-21) crashed into the leg stump of Sachith Pathirana (18 off 26).
Tahir wrapped things up with 10.4 overs remaining, as Sri Lanka were bundled out for 163 with a series victory now on the cards for the Proteas.
Photo: Lee Warren/Gallo Images