Sri Lanka started day three brighter but a big seventh wicket stand from Sikandar Raza and Malcolm Waller swung things back Zimbabwe's way.
Asela Gunaratne and Rangana Herath added 22 runs to the overnight total before the latter was stumped off the bowling of Sean Williams.
Suranga Lakmal made a valuable 14 in a partnership of 21 with the hamstrung Gunaratne.
Lakmal was caught and bowled by Zimbabwe skipper Graeme Cremer before the captain completed his five wicket haul by bowling Gunaratne (45) to end the Sri Lanka innings on 346 giving the tourists a ten run lead.
The job of setting a target got off to a rocky start as Zimbabwe slipped to 23 for 4 as Rangana Herath claimed three early scalps.
Sean Williams (22) and Raza briefly stopped the rot adding 36 for the fifth wicket but things looked dire when the allrounder was bowled by Herath.
Raza was steely in his determination though adding 86 with wicketkeeper Peter Moor (40) before he was joined by Malcolm Waller and the pair put on an unbroken stand of 107.
Waller (57*) recorded his third Test fifty while Raza, playing the innings of his life while battling exhaustion, ended the day three runs short of a maiden Test century.
Raza's mixture of defence and attack and Waller's stroke making ensured that Zimbabwe kept the scoreboard ticking over with the total already sure to Test Sri Lanka.
Zimbabwe reached 252/6 by the close of play for a 262 run lead with plenty of time left in the Test to force a result.