De Villiers and Amla made England's total of 171 look puny as they thrashed 125 runs in a 55-ball opening stand.
De Villiers, on the ground on which he hit the world's fastest one-day international century against the West Indies last season, thrashed 79 off 29 balls with six fours and six sixes.
On the way he reached his fifty off 21 balls, the fastest for South Africa.
Amla was slightly more restrained but played some powerful strokes in making 69 not out off 38 balls with eight fours and three sixes.
More From This Section
England had reached 157 for three and seemed set for a total well in excess of 200.
But Buttler (54) and Morgan were out off successive balls and England lost their last seven wickets for 14 runs after they had looked set to post a total in excess of 200.
South African captain Faf du Plessis said he was pleased with the win but felt his team had only produced a "70 percent" performance with the ball.
Adil Rashid was given out leg-before off Mehedi in the next over but the decision was overturned after review as replays indicated the ball had been missing leg stump.
Rashid made good use of his fortune to score a brisk 26 before a fine diving catch at cover by Sabbir Rahman off Taijul ended his innings.
Broad also profited from the Decision Review System as he was given out by umpire Kumar Dharmasena off Taijul before it was overturned.
In a nightmare Test for the umpires, with eight of their decisions overturned in five sessions, Bangladesh also benefited from the review system at the end of the England innings.