England got off to a terrific start in what was their biggest game in 28 years. Dele Alli was brought down on the edge of the area by Luka Modric and the Three Lions took full toll. Kieran Trippier stepped up to take the set-piece over the usual suspects.
The Tottenham Hotspur full-back went on to bury the effort into the top corner, leaving Danijel Subasic stranded.
It was a game of catch-up for Croatia from then on as England looked to protect the lead. Though Harry Kane did have a chance to double the lead in the first-half, a combination of the post and Subasic denied him.
Croatia looked tired and bereft of ideas in the first half as well, perhaps indicative of the two consecutive 120-minute games they played.
But they mounted a spirited response in the second half, aided in no small part by England's refusal to go for the kill. Harry Kane faded out as the game progressed while Marcus Rashford could not force through a goal.
Meanwhile, Croatia grew into the game and got their goal, thanks to the opportunism shown by Ivan Perisic. Sime Vrsaljko swung in a crss from the right wing and the Inter Milan winger made a late run before he stuck his foot out ahead of Kyle Walker to steer his effort into bottom corner.
He should have scored the winner moments after but saw a shot come back off the post. A stunned England never really threatened even after that and Croatia could have won it when Mandzukic saw a close-range effort denied by Jordan Pickford at the end of the first period of extra-time.
But he made amends shortly afterwards as he latched on to a header from Perisic inside the box. John Stones had switched off and he didn't pick up Mandzukic who slotted home past Pickford.
From then on, it was smooth sailing for Croatia who found renewed vigour in their tiring legs to keep out England and book a date with France at Moscow where they will battle it out for the greatest honour in football.