Just when it seemed Zimbabwe's attack had lost its sting, Elgar clipped the third ball of Jarvis's second spell to Peter Moor at midwicket.
Port Elizabeth: Zimbabwe claimed two wickets in three overs after South Africa made a solid start on the first day of a four-day, day-night Test at St George's Park on Tuesday.
South Africa were 96 for two at tea after stand-in captain AB de Villiers won the toss.
Dean Elgar and Aiden Markram put on 72 for the first wicket after weathering some tight new-ball bowling by Kyle Jarvis and new cap Blessing Muzarabani.
Just when it seemed Zimbabwe's attack had lost its sting, Elgar clipped the third ball of Jarvis's second spell to Peter Moor at midwicket. Chris Mpofu followed up with the wicket of Hashim Amla, who made five before slapping a short ball to point, where Moor held his second catch.
South Africa were without regular captain Faf du Plessis, who had failed to recover fully from lower back and shoulder injuries, and fast bowler Dale Steyn, whose return from a broken shoulder is now likely to be in the first Test against India, starting in Cape Town on January 5.
De Villiers, making a comeback to Test cricket, was 15 not out at tea. He was the captain in his most recent two Tests, against England in January 2016, but then suffered a long-term elbow injury.
Scores: South Africa 96/2 in 30 overs (D. Elgar 31, A. Markram 44*, K. Jarvis 1/22, C. Mpofu 1/35) vs Zimbabwe.