Ivan Rakitic scored the winning penalty to spare Croatian blushes after Luka Modric had a spot-kick saved late in extra time, reaching the World Cup quarterfinals via the shoot-out following a 1-1 draw against Denmark.
After saving from Modric, Denmark goalkeeper Kasper Schmeichel produced two saves in the shoot-out but saw opposite number Danijel Subasic keep out three, including from Nicolai Jorgensen to set up Rakitic to seal the 3-2 win.
In a tournament packed with excitement this was no classic, although it looked set to be a thriller after Mathias Jorgensen and Mario Mandzukic scored at either end within the first four minutes.
There was an air of expectation that Croatia's 'golden generation' of players, including Modric, Rakitic and Ivan Perisic, would rise to the occasion but there was little urgency, spark or flair about Zlatko Dalic's team after the early action.
Dalic's side nevertheless booked its place in the last eight alongside Russia, which they will play in Sochi on Saturday, and it will need to find a more incisive cutting edge in attack if it is to break down Stanislav Cherchesov's resilient defence.
Denmark head coach Age Hareide may feel hard done by after his players showed more intent to win the game in normal time, but Feyenoord striker Jorgensen cracked at the vital moment before Rakitic sent it home.
The game exploded into life in the first minute when a long throw into the Croatia penalty area by Jonas Knudsen was allowed to run to Thomas Delaney and he touched the ball on to Mathias Jorgensen, who side-footed it into the net via deflections off goalkeeper Subasic and the post.
The Danes led for just three minutes before Sime Vrsaljko's ball into the box reached Henrik Dalsgaard, whose clearance hit Andreas Christensen in the face and presented Mandzukic with an easy finish, the Juventus striker tucking the ball between Schmeichel and the near post with a shot on the turn from six yards.
Denmark recovered its composure and gave Croatia a scare when its crisp midfield passing crafted an opening for Martin Braithwaite, but the Middlesbrough forward had his low shot saved by Subasic.
Schmeichel was called into action to save Rakitic's long-range drive but Croatia struggled to get into its stride as it had done in the group matches and the 1-1 half-time scoreline was a fair reflection of the play.
Openings were harder to come by for both sides after the interval as the game took on a more cautious feel with fewer risks taken at either end of the field.
Hareide sent on Nicolai Jorgensen for Andreas Cornelius to try and force a breakthrough and he went close with a good chance moments later, firing a low shot from the middle of the penalty area, but Subasic was equal to it.
Rakitic flashed a shot narrowly wide from 25 yards shortly before normal time elapsed but it was Denmark which dominated the first period of extra time, Lasse Schone turning skilfully on the edge of the box before hooking a curling shot just wide of Subasic's goal.
Pione Sisto entered the fray in extra time and he looped a shot towards goal from an angle that bounced just past the post while Croatia sat back.
But then Ante Rebic burst clear of the Denmark defence and was felled by Mathias Jorgensen when he was clean through on goal, only for Schmeichel to save Modric's spot-kick by diving down to his left and clutching the ball to his chest.
In the shoot-out, Christian Eriksen got Denmark off to the worst possible start when Subasic tipped his penalty onto the post but Schmeichel saved from Milan Badelj to make amends.
Simon Kjaer rattled his penalty into the top corner to get Denmark back on track before Andrej Kramaric rolled cheekily into the net, and there were successful shots from Michael Krohn-Dehli and Modric before Schone's was saved by Subasic and Josip Pivaric was denied by an acrobatic Schmeichel stop.
But the Leicester City goalkeeper's heroics were in vain after Nicolai Jorgensen took a staggered run-up that did him no favours as Subasic saved with his feet, before Rakitic coolly slotted the ball into the bottom left corner of the net to settle a tense contest.
- UEFA Champions League: Bayern Munich beats Copenhagen 2-1 to extend group-stage winning run
- Asian Games 2023: Overall medals tally October 4 - LIVE - India stays 4th with 70 medals, 15 gold; Ram Baboo-Manju win bronze; Eyes on Neeraj, 4x400m men’s relay team for gold
- UEFA Champions League: Wahi stars with goal and assist as Lens beats Arsenal 2-1
- Asian Games 2023 Live Updates, October 4: Ram Baboo, Manju Rani win 35km race walk mixed team bronze, Jyothi-Ojas pair reaches compound mixed team final
- UEFA Champions League: Bellingham guides Real Madrid to 3-2 win over Napoli