Hashim Amla, AB de Villiers and David Miller all scored half-centuries as South Africa scored 279-8 from 48.2 overs before a storm halted proceedings.
When play resumed, the West Indies were set a revised target of 229 from 33 overs but, after Chris Gayle departed for a typically explosive 41, the innings subsided and they were dismissed for 164 under new skipper Jason Holder.
South Africa chose to bat first after winning the toss but made a terrible start as Jerome Taylor (2-50) bowled Rilee Rossouw and trapped Faf du Plessis in front, both for ducks.
However, opener Amla and captain de Villiers got the innings on track with a stand of 99, during which Amla made it to 5000 one-day international runs, a landmark he has reached in 104 matches, faster than any other batsman.
He reached 66 off the same number of balls before he tried to run two to deep point and was beaten by a brilliant throw from Andre Russell.
However, the hosts shrugged off his departure as De Villiers and Miller added 123, with Miller hitting 70 off 68 balls before he sliced a catch straight to deep point.
That made it 238-4 and the innings lost momentum after that, man of the match De Villiers departing eight runs later for 81 off 94 balls when he holed out to long-on off Sulieman Benn.
Russell (2-51) then took it upon himself to keep the hosts in check, dismissing JP Duminy (12) and Vernon Philander, and bagging his second run-out of the innings in sensational fashion, kicking the ball into the stumps in his follow-through to remove Farhaan Behardien (12).
West Indies began their chase for 229 in big-hitting fashion as Gayle, who was in great form in the recent Twenty20 series, continued in similar vein.
The tourists were 43-0 after just five overs but Gayle continued his extravagant strokeplay when Dale Steyn came on and, after edging one boundary and smashing another through the covers, he was caught behind attempting another big hit.
Leon Johnson then fell lbw to Philander for a duck in the next over when the South Africans chose to review after he was initially given not out.
Marlon Samuels (12) and Dwayne Smith (29) added 32 but Samuels was then made to pay for a slightly lazy piece of cricket, run out by a direct hit from Behardien.
Smith then fell lbw to Imran Tahir (3-30), who went on to bowl Dinesh Ramdin (who made a battling 31) and have Jonathan Carter (17) neatly stumped by De Villiers.
De Villiers also had four catches in the innings, one of them removing Russell, who hit two sixes in his 19 off eight balls before falling to Philander (3-44).
And the typically impressive Steyn returned to wrap things up by removing Holder and Taylor with successive deliveries, to finish with 3-27.
The West Indies will look to bounce back in the second match in Johannesburg on Sunday.