A ton from Avishka Fernando followed by another good showing from Lasith Malinga meant West Indies could score only 315-9 chasing 339 runs.
West Indies’ hopes of a fast start were dashed when Malinga got rid of both Sunil Ambris and Shai Hope batsmans in quick succession.
Chris Gayle passed Brian Lara to become the highest ODI run-scorer for the West Indies but failed to convert another start and had to walk after holing out to Jeffrey Vandersay off Kasun Rajitha’s bowling.
Shimron Hetmyer was run out by Dhananjaya de Silva but a 61-run stand for the fifth wicket between Nicholas Pooran and Jason Holder revived the flagging run chase.
Holder would depart for a patient 26 but Pooran was would continue to wage a lone battle, even after Carlos Brathwaite was dismissed cheaply.
He put together an 83-run partnership that Fabian Allen that gave them some hope of a win with both players striking the ball too well.
Allen would bring up his half-century but was run out shortly thereafter after a mix-up and his exasperation at being out told the story.
Earlier, Fernando smashed his first one-day international century as Sri Lanka scored an imposing 338-6 in the first innings.