England took charge of the first Test after James Anderson and Stuart Broad took nine wickets between them in favourable conditions for seam bowling to shoot out Sri Lanka for 91 after Jonny Bairstow's excellent knock at Headingley on Friday.
Bairstow's superb knock of 140 on his Yorkshire home ground lifted England to 298 in their first innings.
England captain Alastair Cook enforced the follow-on and the touring side negotiated two deliveries to reach 1 for no wicket before bad light ended play.
Sri Lanka trail by 206 runs in the opening match of the three-Test series.
The tourists made a dreadful start to their reply as experienced fast bowlers Anderson and Broad exploited the conditions superbly.
Dimuth Karunaratne, Kaushal Silva and Kusal Mendis all edged catches to wicketkeeper Bairstow, leaving the Lankans in deep trouble at 12 for three.
Dinesh Chandimal, on 15, was well held by James Vince at third slip off Ben Stokes before Anderson trapped captain Angelo Mathews lbw for 34 and then dismissed Dasun Shanaka first ball with a peach of a delivery that the batsman nicked to Bairstow.
The dismissal of Mathews was Anderson's 435th in Tests, taking him past India's Kapil Dev into sixth place on the all-time list.
Herath was smartly caught by Stokes in the slips off Anderson for one, Chameera (2) drove Broad to Finn at mid-off and Lahiru Thirimanne, on 22, was caught by Finn at mid-on off Broad.
Anderson completed his 19th five-wicket haul in Tests and outstanding figures of five for 16 when he had Shaminda Eranga caught by Bairstow down the leg-side.
England resumed on 171 for five, having collapsed to 83 for five on Thursday.
Alex Hales was 71 not out, with Bairstow unbeaten on 54 after Sri Lanka medium-pacer Dasun Shanaka had taken three top-order wickets on Test debut.
Bairstow was soon into his stride, with the best of his shots today an on-driven four off Shanaka.
It was not long before he had outscored Hales, who was 43 not out when Bairstow came in.
Bairstow, however, should have been out when Nuwan Pradeep dropped a caught and bowled chance off a checked drive.
Hales and Bairstow took their sixth-wicket stand to 141.
But there was no maiden Test century for Nottinghamshire opener Hales.
Dropped on 82, he was out for 86 when, losing patience after nearly five-and-a-half hours' concentration, Hales holed out off left-arm spinner Rangana Herath.
Moeen Ali and Broad both came and went, with Bairstow in danger of running out of partners before he got to three figures.
But an overthrown three saw Bairstow to his second Test century and first in England following the Yorkshireman's 150 not out against South Africa at Cape Town in January.
England were 243 for eight at lunch off 80 overs and Sri Lanka took the new ball straight after lunch.
But Bairstow kept the runs coming in a ninth-wicket stand of 56 with Steven Finn.
Bairstow's 183-ball innings, including 13 fours and a six, ended when he holed out off Chameera to Pradeep at mid-on.
PHOTOS: Hales and Bairstow lead England fightback after Shanaka's triple blow
When Finch asked Kohli to stop 'embarrassing' batsmen...
MCL owners vow to pay overdue wages of retired cricket stars
Mumbai, Gujarat clash in a must-win encounter
Reason for Pak's poor performance: 'Absence of educated players'