The World Cup threw up yet another surprise as Italy were made to pay for a lacklustre performance in Ibaraki.
Italy looked set to book a place in the second round when Christian Vieri scored his third goal of the World Cup early in the second half.
But Croatia capitalised on some uncharacteristically sloppy Italian defending to scupper those plans.
Giovanni Trapattoni's side were left cursing two controversial disallowed goals in the aftermath of defeat.
They had good reason to complain about the first, Vieri being ruled offside before he headed in from close range, despite having been level with the last defender when he started his run.
The second, when substitute Filippo Inzaghi was penalised for shirt-pulling before a long Italy free-kick found its way into the Croatian net, was more justifiable.
But Italy also had themselves to blame for defeat.
They failed to come out of first gear until they were behind and seemed happy to sit on their lead when they went ahead.
Croatia were unrecognisable from the shambolic outfit that had been beaten by Mexico in their opening match.
They equalised in the 73rd minute when Ivica Olic slotted in from close range and grabbed a winner minutes later when the impressive Milan Rapaic scored with a deflected volley.
Croatia often looked the better side, particularly in the first half, and in Rapaic and Davor Vugrinec had two of the best players on show.
The first-half was a turgid and uninspiring affair.
Italy were content to sit deep and hit Croatia on the break but their solidity suffered when star defender Alessandro Nesta was forced off with a foot injury after 23 minutes.
Keeper Gianluigi Buffon stopped them going behind when he pulled off a smart one-handed save from Rapaic.
Italy were more lively after the break and minutes after having a seemingly good goal disallowed Vieri put them ahead.
Cristiano Doni sent in an excellent cross from the right and Vieri rose majestically above his marker to head home.
It was Vieri's eighth goal in seven World Cup matches.
The Italians looked poised to take control of the game but instead elected to sit back on their lead.
They were punished for the tactic.
Olic got in front of the Italian defence to slot in a Robert Jarni cross and equalise.
Shortly afterwards Rapaic's volley was deflected in by Italian substitute Marco Materazzi.
Totti hit the post with a splendid free-kick near the end, but the Croatians rode their luck to hold on.
Italy: Buffon, Panucci, Nesta (Materazzi 23), Cannavaro,
Maldini, Zambrotta, Zanetti, Tommasi, Doni (Inzaghi 79), Totti,
Subs Not Used: Abbiati, Coco, Del Piero, Delvecchio, Di Biagio,
Di Livio, Gattuso, Iuliano, Montella, Toldo.
Goals: Vieri 56.
Croatia: Pletikosa, Robert Kovac, Simunic, Saric, Jarni, Tomas, Rapaic (Simic 79), Niko Kovac, Soldo (Vranjes 62),
Vugrinec (Olic 57), Boksic.
Subs Not Used: Balaban, Butina, Prosinecki, Seric, Stanic,
Suker, Vasilj, Vlaovic, Zivkovic.
Booked: Robert Kovac.
Goals: Olic 73, Rapaic 76.
Referee: Graham Poll (England).