Croatia had the best chances but Ricardo Quaresma was the only man to find the target as Portugal edged into the Euro 2016 quarter-finals.
Ricardo Quaresma struck a dramatic winner late in the second half of extra time as Portugal scraped past Croatia 1-0 in a dour Euro 2016 last-16 encounter in Lens.
Portugal advanced to the knockout stages following an electric 3-3 draw with Hungary in Lyon, but Saturday's game could not have contrasted more starkly.
Although Marcelo Brozovic and Domagoj Vida had decent opportunities in the second half, the regulation 90 minutes finished without a shot on target for the first time at a major tournament since 1980.
Ivan Perisic rattled the upright in the second additional period, but Portugal struck the decisive blow following a swift break emanating from that near miss.
Nani, who became the fourth player to reach 100 caps for his country, scuffed a shot across the box to Cristiano Ronaldo.
The Portugal captain's effort was kept out by Croatia goalkeeper Danijel Subasic, but Quaresma was on hand to head home in the 117th minute.
There was one more agonising miss for Croatia as Vida hooked wide, but Portugal survived to set up a quarter-final clash against Poland in Marseille on Thursday.
The dramatic final five minutes were a far cry from a turgid opening, the first attempt on goal not coming until the 25th minute when Pepe connected with Raphael Guerreiro's free-kick from the left, powering a header over.
A swift break saw Perisic – sporting the pattern and colours of the Croatia shirt in his hair – move inside Guerreiro and drill an effort into the side netting, with neither side going closer before the interval brought an end to a half low on quality.
Croatia had an opportunity to take the lead seven minutes after the restart when a short corner led to Ivan Rakitic teeing up Brozovic, who lifted a wild strike from 12 yards off target.
Renato Sanches, on as a replacement for Andre Gomes, supplied more drive in the midfield and skewed wide from the edge of the box after working an opening through a one-two with Joao Mario.
Croatia quickly responded through Vida, the centre-back flashing a header wide following Darijo Srna's free-kick delivery from the right wing.
Portugal felt they should have had a penalty with 64 minutes on the clock when Nani was caught by a high boot from Ivan Strinic, but referee Carlos Velasco Carballo was unmoved.
Neither goalkeeper was forced into a save before the end of 90 minutes, and Perisic and Nikola Kalinic both spurned chances to do so in the first half of extra time.
Portugal goalkeeper Rui Patricio failed to get anywhere near a corner from Brozovic on the left in the second additional period, but Vida could not get over the ball enough to steer a header on target.
Perisic hit the post with a header from a Srna cross with four minutes of extra time left to play, but Croatia were hit on the counter-attack.
Subasic did well to deny Ronaldo a record-equalling ninth goal at European Championships only for Quaresma to pounce on the rebound.
Vida hooked a last-gasp effort wide as Croatia pushed desperately for an equaliser, but it is Portugal whose campaign in France continues.
Key Opta stats:
- This game saw the longest wait for a shot in a game at Euro 2016 (24:40), beating the previous longest time of 12:13 in Belgium's game with Republic of Ireland.
- It was the first time Cristiano Ronaldo had started a European Championships game and not registered a single shot within 90 minutes.
- Ricardo Quaresma scored the first goal in extra time at the Euros since Andrey Arshavin in 2008 (v Netherlands).
- Portugal have reached the quarter-final in each of their last six European Championships (since 1996).
- Croatia have never scored against Portugal in four games against them (390 minutes without a goal).