It came at the end of a largely disappointing tie - and one that had seen Luka Modric spurn a golden chance to snatch a late winner when his penalty shortly before the end of extra-time was superbly saved by Kasper Schmeichel.
The Leicester City goalkeeper also saved two penalties in the shootout at the Nizhny Novgorod Stadium but he could not prevent Ivan Rakitic slotting home the decisive 10th kick.
The Croatia players charged towards Rakitic after his decisive strike with the look of a team who knew they had survived an almighty scare against a Danish side that seemed to have the momentum with them moving into the shootout.
It was a match that ended in stunningly dramatic fashion - and started that way as well.
Martin Jorgensen capitalised on the chaos caused by a long throw to fire a weak shot beyond Subasic in the opening minute.
A scuffed clearance and an inadvertent header off Danish midfielder Martin Delaney left Mario Mandzukic with a good chance that he gobbled up, shooting beyond Schmeichel as Croatia soon levelled.
Neither side had previously conceded from open play in Russia - but the prospect of an unexpected glut of goals faded as quickly as the tempo.
It was a lacklustre tie played with front of a largely delighted crowd as the local fans inside the stadium revelled in Russia's earlier shootout victory over Spain.