Mahmudul Hasan Joy scored 137 as Bangladesh were bowled out for 298 on day three of the first Test at Kingsmead.
He became the first Bangladesh batsman to score a Test century against South Africa.
The Proteas stretched their first-innings lead of 69 by six runs without losing a wicket before bad light stopped play.
Opening batsman Mahmudul was unruffled in only his third Test match as he calmly picked the right balls to score from.
It took the 21-year-old six hours and 269 balls to reach his hundred and he continued to bat patiently until the eighth wicket fell.
Then he unleashed a flurry of strokes, hitting off-spinner Simon Harmer for a six and a four and a single in one over, then striking four fours in the next over from Wiaan Mulder.
He was last man out, caught at slip off fast bowler Lizaad Williams after an innings lasting 443 minutes. He faced 326 balls and hit 14 fours and two sixes.
Mahmudul shared useful partnerships of 82 with Liton Das (41), 33 with Yasir Ali (22) and 51 with Mehidy Hasan (29) as Bangladesh kept the Proteas in the field for most of the day.
HIGHLIGHTS: Proteas vs Bangladesh (1st Test, Day 3)
It did not seem likely to be a long day for South Africa when nightwatchman Taskin Ahmed was caught at gully off Williams with only three runs added to the overnight total of 98-4.
But mainly due to Mahmudul another 197 runs were added, leaving minimal time for the Proteas to build on their lead before play was brought to an early finish.
Harmer took 4-103 but was unable to add to his wicket haul after taking the first four wickets on Friday.
Williams, earning his first Test cap in the absence of all South Africa’s frontline bowlers, who are playing in the IPL, took 3-54.
“A huge moment.”
“There’s no better feeling.”
Lizaad Williams has his first Test wicket ?
? Stream #SAvBAN live: https://t.co/0BMWdeEYT3 pic.twitter.com/CL6G4jdwK5
— SuperSport ? (@SuperSportTV) April 2, 2022
Mahmudul gave a sharp chance to Sarel Erwee at short leg off Harmer when he was on 64 in his only blemish before reaching his century. Keegan Petersen could not hold a low edge at slip off Harmer when he had 108.
The Proteas twice dropped chances off Liton during the most productive partnership of the innings. Liton survived a straightforward slip chance to Dean Elgar at first slip off Williams when he had 16, and a difficult chance to Mulder at leg slip off Harmer when he had 39.
Although there was no extravagant turn off a slow surface, South Africa’s spinners bowled 78 of the 115.5 overs in the innings, with Keshav Maharaj bleeding from his spinning finger while bowling his 37th and final over shortly before tea.
© Agence France-Presse