Jonny Bairstow laid down a marker to be England's permanent number three on Friday but Sri Lanka clawed their way back into the final Test with late wickets.
At stumps on day one, England, 2-0 up in the series, were 312-7, Bairstow having made 110 after valuable partnerships with Joe Root and Ben Stokes, who made a half-century.
Batting after Root won his eighth straight toss, England lost both openers cheaply in the morning.
Rory Burns disappointed again, bowled by Dilruwan Perera for 14 as he tried to cut. Keaton Jennings fell three overs later, caught at leg slip off Malinda Pushpakumara for 13.
But Root and Bairstow, England's fourth different number three in the series, steadied the ship, surviving one review each to steer the visitors to 102-2 at lunch.
Bairstow and Root put on a 100-run stand before the captain fell to left-arm wrist spinner Lakshan Sandakan after lunch, top-edging an attempted slog sweep on 46.
Sri Lanka should have had Stokes as well, with umpire Chris Gaffaney incorrectly turning down Perera's lbw appeal when the Durham allrounder was yet to get off the mark.
Stokes and Bairstow then made hay, Stokes hitting five fours and two sixes before Sandakan got the Durham all-rounder to edge to slip, sending him back to the pavillion for 57 off 88 balls.
Bairstow, playing his first Test of the series having been injured at Galle and left out at Kandy, then passed his century, removing his helmet and celebrating with gusto.
But he fell for 110, bowled by Sandakan, and was soon followed by Buttler for 16, caught and bowled by Sandakan, and by Ben Foakes who nicked Malinda Pushpakumara to the keeper for 13.
Moeen Ali, who has had a woeful tour with the bat -- in contrast to with ball in hand -- then survived an lbw review. He ended on 23 and Adil Rashid not out on 13.
England have rested fast bowler James Anderson to give Stuart Broad his first Test of the series.
Sri Lanka also made two changes, bringing in left-arm wrist spinner Lakshan Sandakan to replace Akila Dananjaya who is in Brisbane having his bowling action tested.
Under-performing opener Kaushal Silva was left out in favour of Danushka Gunathilaka.