Mario Mandzukic scored in the 109th minute as Croatia came from behind to beat England 2-1 after extra time and reach their first FIFA World Cup final, where they will face France.
England, appearing in their first semi-final since 1990, had looked on course for their first final since 1966 as they led through Kieran Trippier's fifth-minute free kick and totally dominated the opening half.
Look back at how the match unfolded with RNZ's live coverage
Croatia, in their first semi since 1998, levelled through Ivan Perisic after 68 minutes and then looked the more dangerous side.
Read more of our FIFA 2018 coverage:
It stayed level at 90 minutes, meaning Croatia faced extra time for the third successive game, having got past Denmark and Russia on penalties.
But just when it looked as if they would become the first team to appear in three shootouts at a single World Cup, Mandzukic struck with a well-taken low shot.
England's captain Harry Kane said after loss will hurt for a long time.
"It's tough, we're gutted," he said. "We worked so hard, the fans were amazing, it was a tough game, a 50-50 game, when we look back we will think there's stuff we could have done better.
"We worked as hard as we could... it hurts, it hurts a lot and it will hurt for a long time. We have had a fantastic journey, further than we thought," he added.
"We created some good chances when we were 1-0 up, maybe we dropped a little too deep but we didn't get enough pressure on the ball. There are a lot of ifs and buts, in these games it's small margins.
"It's hard to say (what went wrong). There's a lot we could have done better. They played well and made it difficult for us... it's hard to put your finger of it."
England had got off to a flying start when Trippier curled a superb free kick into the top corner.
It was his first goal for his country, England's 12th of the tournament and ninth from a set-piece, but they should have added more from open play as they revelled in the space they were being given in the first half.
Kane shot weakly at Danijel Subasic when through, then forced the rebound against a post and Raheem Sterling was a constant thorn in the Croatia defence, though again his final ball was too often astray.
The best chance for a second goal, however, was wasted by an unmarked Jesse Lingard when he curled wide when a goal looked certain. Croatia had been desperately poor but started to get a foothold in the game as the match rolled past the hour mark and Luka Modric's influence grew.
England paid the price for those early misses when Perisic showed great determination to get in front of Kyle Walker to meet a curling Sime Vrsaljko cross and though his boot was arguably high, Walker was stooping and there were few complaints.
Perisic should have added another three minutes later when ragged defending presented him with a great shooting chance but he cannoned the ball against a post.
It was a different game from then on, with Croatia suddenly playing with accuracy and purpose as England lost their shape and composure, though Kane missed a chance to win it in stoppage time when he headed wide from a free kick.
Vrsaljko cleared a John Stones header off the line midway through the first extra period.
But it was Croatia who struck in the 109th minute when Perisic won a header on the edge of the box and the ball dropped for Mandzukic whose firm low finish beat Pickford.