Kyle Abbott removed Sri Lankan captain Angelo Mathews for 59 in the third over of the morning to begin the slide as the tourists were dismissed for 281, adding just 41 runs on Day 5 for the loss of those five wickets.
Kagiso Rabada had 3 for 77, fellow seamer Abbott 2 for 38 and spinner Keshav Maharaj 3 for 86 for South Africa, which ended 2016 on course for a third straight series win and on the way back up after losing its No 1 ranking at the start of the year.
The second of three tests begins in Cape Town on Monday. South Africa's victory in Port Elizabeth was set up by its 406-6 declared in its second innings, with 117 from Stephen Cook and half-centuries by Faf du Plessis, Quinton de Kock and Dean Elgar.
With Sri Lanka 240 for 5 overnight, Abbott trapped Mathews lbw in the paceman's second over of the morning, with the Sri Lankan skipper adding just one run to his overnight score, for an early blow.
Abbott also had Dhananjaya de Silva the last recognised batsman out lbw four overs later and the Sri Lankan tail fell away quickly.
Strangely, Sri Lanka ended with a record despite its heavy loss, with its 281 the highest fourth-innings score ever in a Test at St. George's Park.
That will be of no consolation to the Sri Lankans, who face another uphill task having never won a test series in South Africa.
South Africa lost a home series to England at the start of the year and saw Hashim Amla resign as captain, but has dragged itself back with series wins over New Zealand and Australia, and now has an early lead against Sri Lanka.