Andrej Kramaric drog till och bollen träffade Davide Frattesis hand och efter en VAR-koll pekade domaren på straffpunkten.
Luka Modric stegade fram, men Gianluigi Donnarumma räddade straffen.
Det dröjde dock bara 30 sekunder innan Modric hade tagit revansch då han tryckte upp en skottretur rakt upp i nättaket.
Målet innebar att 38-årige Modric blev EM:s äldsta målskytt genom tiderna då han slog Ivan Vastic, som var några dagar yngre.
Men i matchens 98:e minut kom kvitteringen. Riccardo Calafiori drev fram bollen och hittade Mattia Zaccagni som snyggt placerade in 1-1-målet och blev matchhjälte då han tog Italien vidare till åttondelsfinal.
– Det är en otrolig känsla. Jag är lite känslosam nu. Det är en underbar natt, jag kommer aldrig glömma detta, säger Zaccagni efter matchen.
Italien kommer att ställas mot Schweiz i åttondelsfinalen. Kroatien kommer med största sannolikhet inte gå vidare som en av de bästa grupptreorna på två poäng.
Europamästerskapet
Kroatien
1 - 1
Italien
Första halvlek
- Sucic24'
Halvtid
- 46'FrattesiPellegrini
- BudimirPašalic46'
Andra halvlek
- Modric (Missad straff)54'
- 1 - 0Modric55'
- 57'ChiesaDimarco
- Modric60'
- PerišicSucic70'
- IvanušecKovacic70'
- Ivanušec73'
- 75'ScamaccaRaspadori
- Pongracic78'
- MajerModric81'
- 81'ZaccagniDarmian
- 81'FagioliJorginho
- Stanisic82'
- JuranovicKramaric90'
- Brozovic90'+1'
- 90'+3'Calafiori
- 90'+6'Fagioli
- 90'+8'1 - 1Zaccagni (Calafiori)