Steyn, Morkel put South Africa on top
South Africa's Morne Morkel (R) celebrates with teammates after dismissing Sri Lanka's Dinesh Chandimal during the final day of the opening Test in Galle on July 20, 2014 - by Lakruwan Wanniarachchi
The pace duo grabbed two wickets each while part-time spinner Jean-Paul Duminy sent back Kumar Sangakkara for a well-made 76 to reduce the hosts to 161-6 at lunch.
Skipper Angelo Mathews was batting on eight with Dilruwan Perera yet to open his account at the break.
With just four wickets in hand and 209 more runs needed for win, the hosts would have to fight for two more sessions to save the match.
Sri Lanka, who had resumed at their overnight 110-1 while chasing 370, added just 51 runs off 24 overs while losing five wickets in the first session.
Steyn, who had taken a five-wicket haul in the first innings, struck in the fourth over of the day to give his side the breakthrough that they desperately needed.
His victim was opener Kaushal Silva (38) who nicked the fast bowler behind the wickets where Quinton de Kock dived to his right to take a stunning catch.
Silva's dismissal ended a 104-run stand that he shared with Sangakkara for the second wicket, the highest of the innings.
Sri Lanka were dealt a bigger blow off the first ball after the drinks break when Morkel had big-hitter Mahela Jayawardene caught behind for 10.
Sangakkara, who was dropped on 65, failed to take advantage of the reprieve, pulling Duminy to short midwicket where new Test skipper Hashim 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 in the visitors, who last won a Test in Sri Lanka way back in 2000.
Lahiru Thirimanne was caught by AB de Villiers off Steyn for 12 while Morkel accounted for Dinesh Chandimal (one) by having him caught behind by de Kock.
The second and final Test will be played in Colombo from July 24-28.