Aidy Boothroyd's side needed a victory by a two-goal margin and for Portugal to beat Switzerland in the group's other game which they did. England were on course for their target with 90 minutes on the clock before Domagoj Bradaric's stoppage-time strike put Croatia through.
Having been unimpressive thus far, England started impressively and took the lead on 12 minutes thanks to Eberechi Eze's penalty, won following a foul on Eddie Nketiah. Despite huge protests by the Croatia players, the decision stood and England took the lead.
As things stood, England were heading out and Croatia were set to qualify on goal difference. England were grateful to goalkeeper Aaron Ramsdale, who pulled off a good save from a Luka Ivanusec shot to keep them in the hunt.
England got the all-important second which temporarily moved them ahead of Croatia on goal difference with Curtis Jones firing home from the edge of the box on 74 minutes after being teed up by Dwight McNeil.
But Bradaric struck in the 91st minute to put Croatia through and England out.
Croatia finished level on points with England and Switzerland but qualified due to their superior goal difference and will face Spain in the last-eight on May 31.