Amla scored 109 including eight boundaries to take the Proteas to 304 for five in 50 overs after electing to bat first at R. Premadasa Stadium. De Villiers made 75 off 70 deliveries including five boundaries and a six.
Legspinner Imran Tahir took three wickets while seamers Ryan McLaren, Dale Steyn and Morne Morkel took two each to dismiss Sri Lanka for 229 in the 41st over.
Kumar Sangakkara top scored for the home team with 88.
Sri Lanka started its chase well adding 50 runs for the opening wicket with Kusal Perera leading with 34 off 33 deliveries before being caught by Morkel at short-fine leg.
His opening partner Tillakaratne Dilshan departed for 40 after adding 48 runs with Sangakkara, leaving Sri Lanka on 98 for two.
Mahela Jayawardene (10), Ashan Priyanjan (5) and Angelo Mathews (13) all departed cheaply before Sangakkara paired with Lahiru Thirimanne for a 52-run stand off 48 deliveries again raising Sri Lanka’s hopes.
However with rain clouds looming and the need to keep pace with their opponents’ rate of scoring, the Sri Lankans were dismissed trying to play aggressive shots.
Thirimanne was bowled by McLaren for 15 and Sangakkara was out two deliveries later caught by substitute fielder Faf du Plessis off the same bowler.
Sangakkara’s 84-ball innings included nine boundaries. Amla was named player of the match.
Sri Lanka captain Mathews said the need to keep pace with the Duckworth/Lewis calculation that would have determined the result if play had ended due to rain and poor light contributed to his team’s loss.
He lamented the playing conditions and the fact floodlights could not be used.
“Unfortunately we can’t use the lights, we had to stay ahead of Duckworth/Lewis. We lost a couple of wickets and it was all over for us,” he said.
“If we can use the lights it will be good … I am not sure why we were told at the match referee’s meeting (that the lights can’t be used).”
De Villiers said that the win will serve as motivation for the team to clinch its first one-day series win in Sri Lanka.
“Hopefully on our way, certainly not there yet. Sri Lanka are a very good team at home,” he said.
“We are very motivated to win our first series here, things have started really well and we’ll have to go really hard in the next few games.”
Earlier, South Africa made a steady but cautious start to their innings in scoring 58 for the first wicket off 77 deliveries. Opener Quinton de Kock looked well-set before he chased a wide delivery from Mathews to be bowled off the edge for 27.
Veteran Jacques Kallis, who was playing his first international in seven months, lasted just two deliveries and was out without scoring, trapped lbw by spinner Ajantha Mendis.
He had last played for South Africa in December last year against India.
Kallis’ dismissal brought Amla and De Villiers together and they provided the base for a challenging total.
Mendis picked up three wickets for 61 for the home team.
The second one-day international will be played in Pallekele on Wednesday.