Sangakkara was dropped on 65 but failed to take advantage of the reprieve, pulling Duminy to short midwicket where Amla took a fine catch.
He hit nine fours and a six in his 145-ball innings.
The dismissal of Sangakkara and Jayawardene in quick succession infused new energy into the visitors.
Lahiru Thirimanne was caught by AB de Villiers off Steyn for 12, while Morkel had Dinesh Chandimal (one) caught behind by de Kock.
Sri Lanka lost Dilruwan Perera (zero) to Steyn in the second over of the post-lunch session, the tailender offering an edge to de Kock who took five catches in the innings.
Rangana Herath (20) was caught by de Villiers as he tried to play the sweep shot against Duminy.
Steyn, who was named man of the match, said it felt great to help his side win the game.
"Every time I come down to the sub-continent, I want to do well," he said.
"Nobody cares if you take five-for on a green top. But on a wicket like this, it really makes a difference.
" Steyn's