Mladen Petric got the hosts off to the perfect start in the second minute, but Ukraine were back on level terms 11 minutes later thanks to Andriy Shevchenko before Oleksiy Gai put them in front nine minutes into the second half. Luka Modric was able to rescue a point for Croatia in the 68th minute.
The result leaves Croatia eight points behind Group 6 leaders England following their 4-0 win away to Kazakhstan, albeit with a game in hand. Belarus, third on nine points, and Ukraine, fourth on eight, each have a game in hand and look threatening.
It looked as if it was going to be Croatia's night when Darijo Srna launched a free-kick from 25 yards and Petric pounced on the poor deflection from Andriy Pyatov before the second minute was out. However, undaunted, Ukraine began to dominate in midfield and attack down the flanks, trying to exploit Croatia's weakness at defending crosses.
Joe Simunic misjudged Ruslan Rotan's cross in the 13th minute and Shevchenko came sprinting in to head the ball in past a static Vedran Runje. Croatia seemed to crumple at the equaliser and never looked dangerous as Ukraine kept possession efficiently.
Slaven Bilic's men suffered another shock early in the second half when Sergiy Nazarenko caught the Croatia defence napping and crossed the ball to the near post for Gai to head home under the bar.
It was only after this wake-up call that Croatia turned on some of their old magic and stepped up a gear, as the Ukrainian forces started to wane. And, following a smart one-two with Mario Mandzukic, Tottenham's Modric drove into the area before unleashing a shot that deflected off Dmitry Chigrinsky and fooled Pyatov.
Knowing that a draw was not enough, Croatia kept on pressing and in the 72nd minute Srna called for a penalty after being tripped, but was yellow carded instead for an alleged dive. They were nevertheless unlucky not to snatch all three points as the last six minutes saw Modric and Petric hit the post with magnificent strikes.