Croatia moved to the top of Group C with three points. Spain and Italy each have one point after their 1-1 draw in Gdansk.
Croatia took the lead in the third minute when Mandzukic looped a header past a diving Shay Given, but Ireland equalized in the 19th when Sean St. Ledger headed in Aiden McGeady's free kick from the left.
Nikica Jelavic put Croatia back in front in the 43rd minute, scoring his first goal in a competitive match since he made his international debut in 2009.
Mandzukic added the third in the 48th after his header from Ivan Perisic's cross bounced off the post and into the net off Given's head.
''It was unlike us to concede the goals we conceded today,'' St. Ledger said. ''Croatia didn't split us open. From our point of view they were disappointing goals to concede.''
Croatia nearly made it 4-1 in the 77th when Ivan Rakitic's shot curled just wide of Given's right hand post.
The three goals were as many as Ireland had conceded in its previous 14 games.
''It's always nice to get goals, but we lost the game,'' St. Ledger said. ''We need to move on now.''
In rainy conditions, Croatia coach Slaven Bilic reinforced his defense by playing captain Darijo Srna at right back instead of midfield, and moving Vedran Corluka across to center back.
There were no surprises from Ireland coach Giovanni Trapattoni, who had named his starting lineup days before the game.
Ireland: Shay Given; John O'Shea, Richard Dunne, Sean St. Ledger, Stephen Ward; Damien Duff, Keith Andrews, Glenn Whelan, Aiden McGeady (Simon Cox, 54); Robbie Keane (Shane Long, 75), Kevin Doyle (Jon Walters, 53).
Croatia: Stipe Pletikosa; Darijo Srna, Vedran Corluka, Gordon Schildenfeld, Ivan Strinic; Ivan Rakitic (Tomislav Dujmovic, 92), Ognjen Vukojevic, Luka Modric, Ivan Perisic (Eduardo, 89); Nikica Jelavic (Niko Kranjcar, 72), Mario Mandzukic.