Steyn, 31, unleashed some fiery bowling without much help from a dry and flat track to finish with figures of 5-50, his 23rd five-wicket haul in Tests.
At stumps, Sri Lanka were 283-9, still trailing the visitors by 172 runs with just one wicket in hand.
Sri Lankan skipper Angelo Mathews fought back valiantly with an 89-run knock before being bowled by leg-spinner Imran Tahir.
Mathews, who missed scoring his third Test ton on the trot, also shared 71 runs with Rangana Herath for the eighth wicket, the highest partnership of the innings.
More From This Section
Steyn struck early in the final session, removing Lahiru Thirimanne (38) with an away-moving delivery which the batsman edged behind to wicketkeeper Quinton de Kock.
The lanky fast bowler struck again soon to dismiss Dinesh Chandimal and Dilruwan Perera off his consecutive overs to cap a fiery three-wicket burst.
Chandimal (six) was caught at midwicket while Perera snicked to de Kock without opening his account.
Mathews tried to hit back, smacking Morne Morkel (2-45) for five fours in one over to race to his fifties but that was a rare show of dominance on an otherwise disappointing day for the home team.