Antonio Candreva put the hosts ahead in the 11th minute when he scored his first international goal but Croatia’s Ivan Perisic equalised four minutes later.
The encounter at the San Siro was temporarily stopped in both halves by Dutch referee Bjorn Kuipers after visiting fans threw fireworks and smoke bombs onto the pitch.
The outcome has left the two sides level on 10 points at the top of Group H after four games with both teams having gone into the encounter on the back of three straight wins in qualifying.
With Liverpool striker Mario Balotelli ruled out because of a hamstring injury, Italy coach Antonio Conte fielded Simone Zaza alongside Ciro Immobile in attack.
The visitors showed plenty of flair and went on the attack early, having the first chance of the game in the sixth minute but Ivan Rakitic’s powerful shot from 30 yards was kept out by Gianluigi Buffon.
Italy then went in front against the run of play when Zaza fed Candreva just outside the area and his right-footed shot beat Croatia goalkeeper Danijel Subasic.
The Azzurri’s joy did not last long, however, as Croatia pulled level following a bad mistake by Buffon.
The veteran keeper allowed Perisic’s powerful angled shot to go under his body and into the back of the net prompting a short delay as flares were thrown onto the pitch.
Conte was forced to make his first substitution in the 28th minute with debutant Roberto Soriano replacing an injured Manuel Pasqual.
Seconds later, Croatia’s Luka Modric sustained a thigh problem and Inter Milan’s Mateo Kovacic took his place in midfield.
Croatia almost went in front before half-time but Andrea Ranocchia made a goal-line clearance from Ivica Olic’s header with Buffon off his line.
The visitors picked up where they left off after the restart and in the 50th minute Buffon had to dive to his right to clear Kovacic’s effort towards the far post.
Croatia kept up the pressure and on the hour mark Perisic came close to scoring his second but nodded Rakitic’s cross just over the bar.
At the other end, substitute Stephan El Shaarawy hit a right-footed shot that went just high.
With 17 minutes remaining, the game was temporarily stopped because of the objects thrown onto the pitch and clashes ensued between supporters and police in the stands.
Once play resumed, Croatia continued to pile on the pressure and could have sealed the win three minutes from time.
A moment of indecisiveness by Italy’s defence allowed Perisic to pounce on a loose ball but his effort from the edge of the box went just wide.