Elgar made 113 and Markram hit 143 as South Africa piled up 428 for three at the close in Bloemfontein.
Hashim Amla was unbeaten on 89 and in sight of his second century of the series, while South African captain Faf du Plessis was on 62 not out.
Markram's maiden century came in his second Test, eight days after he was run out for 97 in his debut innings during the first Test in Potchefstroom.
Bangladesh captain Mushfiqur Rahim won the toss and sent South Africa in, only for his bowlers to be put to the sword in a massive opening partnership.
Also Read
The only major difference was that Bangladesh reshuffled their bowling attack, retaining only Mustafizur Rahman of their front-line bowlers.
The replacements made no significant improvement on those who had played in Potchefstroom.
Although the pitch had more pace and bounce than in the previous match, it only contributed to a faster scoring rate as the ball came on to the bat better.
Elgar followed up his 199 in Potchefstroom with his tenth Test century.
He made his runs off 152 balls, with 17 fours. When he reached 16 he became the first batsman in the world to score 1000 runs in 2017.
Neither batsman gave a chance until Elgar, on 110, gloved an attempted hook off Mustafizur and wicketkeeper Liton Das leapt high and got the tips of his right glove to the ball but could not hold on.
There was a brief lull after tea when Mustafizur and Roy picked up a wicket apiece and kept the scoring under control while Amla and Du Plessis were playing themselves in.
It didn't last long and the pair posted a century partnership off only 111 balls.
It was a day when virtually nothing went right for Bangladesh. After a fruitless morning they went back to their dressing room to find their halal food was still on the way. The resumption of play was delayed by ten minutes to enable them to eat.
Disclaimer: No Business Standard Journalist was involved in creation of this content