Buttler's 105 was the main contribution as England piled up 399 for nine, easily their highest one-day total against South Africa and their second highest of all time.
Fellow wicketkeeper-batsman Quinton de Kock hit an even better century, making 138 not out off 96 balls before rain ended play with South Africa on 250 for five in 33.3 overs.
But whereas Buttler was part of a powerful team batting effort, De Kock's only significant support came from Faf du Plessis, who made 55.
"The reason for promoting Jos was because we have a very flexible batting line-up," said England captain Eoin Morgan.
Also Read
"We were flying at around eight-and-a-half (runs per over) at one stage and it felt right to promote him up the order. He's one of our only players who has the capabilties to score a 40 or 50-ball hundred. The timing of it just seemed right."
Alex Hales, Joe Root and Ben Stokes all hit half-centuries after opening batsman Jason Roy set the tone for the innings by striking 48 off 30 balls.
All the South African bowlers took heavy punishment, with four going for 70 runs or more, while Farhaan Behardien and JP Duminy, sharing fifth bowler duties, conceded a total of 93 runs.
South Africa lost Hashim Amla early but De Kock and Du Plessis kept the hosts in touch with the required run rate in a second wicket partnership of 110 off 83 balls.
With storm clouds overhead and a strong wind sending clouds of dust swirling across the ground in a drought-hit city, it seemed that a stoppage might be imminent when Du Plessis was caught on the midwicket boundary off Moeen Ali.
Despite De Kock reaching his ninth one-day international century off 67 balls, South Africa were unable to keep pace with a Duckworth/Lewis target which grew larger with every wicket that fell before rain eventually arrived.
De Kock hit 12 fours and six sixes. Early in his career-best innings he became, at 23, the youngest South African to reach 2,000 runs in one-day internationals.
Ali took three for 43, easily the best figures of a match when most bowlers took a pounding.
Fellow new ball bowler Marchant de Lange was punished for 31 in three overs as Roy and Hales raced to 62 off the first seven overs.
The introduction of Morne Morkel into the attack brought the wicket of Roy, caught at cover, after he had made 48 off 30 balls in an opening stand of 68.
Hales took over as the aggressor as he and Root put on 62 for the second wicket, with Hales making 57 off 47 balls before he sliced De Lange to wide mid-off.
He reached his century off 73 deliveries which, remarkably, was the slowest of his four one-day international hundreds.