Froome attacked with 4km remaining on the steep final ascent and was able to hold off race leader Simon Yates (Mitchelton-Scott) to claim victory.
>> Struggling to get to the shops? Try 6 issues of Cycling Weekly magazine for just £6 delivered to your door <<
Yates finished six seconds back on Froome after also making a move from the other GC contenders with 3km to go in pursuit of his compatriot, ultimately taking the six second time bonus on the line and extending his overall lead.
His closest rival Tom Dumoulin (Sunweb), who sat 47 seconds down in second place at the start of the stage, put in a well paced performance to lose just 31 seconds to the race leader.
The defending champion retains second place at 1-24 behind Yates, with Froome jumping back into the top-10 in fifth place thanks to his strong performance on the Zoncolan, but still sits at 3-10 to the maglia rosa.
Domenico Pozzovio (Bahrain-Merida) finished third on the stage at 23 seconds and moved into third overall at 1-37, while Thibaut Pinot (Groupama-FDJ) lost time and slips to fourth at 1-46.
How it happened
The peloton of the 2018 Giro set off from San Vito Al Tagliamento in fine conditions with 186km and a nightmare finish to the Zoncolan to come.
There wasn’t a huge fight to get in the breakaway, with a number of riders able to slip away and form a group fairly early on.
Enrico Barbin (Bardiani CSF), Francesco Gavazzi (Androni Giocattoli-Sidermec), Mads Pedersen (Trek-Segafredo), Valerio Conti (UAE Team Emirates), Matteo Montaguti (Ag2r La Mondiale), Laurent Didier (Trek-Segafredo) and Jacopo Mosca (Wilier Triestina-Selle Italia) were the ones to break free, establishing a maximum gap of just over six minutes.
The peloton were perhaps wary of allowing them too much of a gap to compete the stage win, perhaps due to the presence of Conti, who sat at just over 13 minutes down in the GC ahead of the stages.
With things remaining fairly calm through much of the day, the breakaway was down to five riders with the loss of Pedersen and Mosca on the third to last Passo Duron climb with around 44km left, with the remaining breakaway riders carrying just under four minutes advantage over the top of the climb.
Meanwhile the peloton began to try and assemble ready for the finale of the stage, with many of the GC teams coming to front having watched Mitchelton-Scott lead the bunch throughout much of the stage in support of race leader Yates.
At the top of the next climb at 166km gone, the Selle Valcalda Ravascletto, the breakaway had just 1-11 gap with the Zoncolan still to come. Barbin and Conti were now out front as duo, having dropped their fellow breakaway companions in the hunt for mountain points at the top of the category three climb.
By this time, the peloton had now seriously shrunk in size, with predominantly just the GC contenders their team-mates remaining.
The pair out front still had around a minute as they hit the foot of the Zoncolan with around 10km left.
The gap quickly decreased on the early slopes with Conti dropping Barbin, while behind 2011 Zoncolan stage winner Igor Anton (Dimension Data) made the first attack from the peloton.
Anton eventually caught Conti out front with 7.1km to go, with peloton on their tail at 12 seconds.
They were then caught with 6.5km to go by the remaining riders of the bunch, with defending champion Dumoulin hanging at the back as Michael Woods (EF Education) made an attack.
The Canadian was pulled back just 800m later, with Sky’s Wout Poels leading Chris Froome and the bunch (including race leader Yates) up the climb.
The pace from Poels put a number of GC hopefuls in trouble, with the likes of Fabio Aru (UAE Team Emirates) and best young rider Richard Carapaz (Movistar) unable to hold on.
Froome moved to the front and increased the pace with 4.2km to go, dropping Dumoulin and Thibaut Pinot but was tracked by Domenico Pozzovivo, Miguel Angel Lopez (Astana) and Simon Yates at first.
But just 200m Froome was out by a few metres on his own, with no-one able to close the gap to him.
Yates finally tried his luck with 3km to go, immediately dropping Lopez and Pozzovivo, with Froome out front by 12 seconds.
It remained that way until the easier section with just over 1km to go, with Yates gaining to Froome as they went into the first of the three tunnels.
By the time they went into the second tunnel, the race leader had almost caught his fellow Brit, but he couldn’t quite close the gap as they reached the final few hundred metres and as Froome took the final bends the gap grew out again, with the four-time Tour de France winner able to celebrate his first Giro d’Italia stage win.
Yates crossed the line in second to extend his overall lead, while Dumoulin was able to limit his losses with his fifth place finish.
Sunday will see another tough mountain stage for the peloton before the rest day, with 176km from Tolmezzo to Sappada.
Giro d’Italia 2018, stage 14: San Vito Al Tagliamento to Monte Zoncolan (186km)
1 Chris Froome (GBr) Team Sky, in 5-25-31
2 Simon Yates (GBr) Mitchelton-Scott, at 6s
3 Domenico Pozzovivo (Ita) Bahrain-Merida, at 23s
4 Miguel Angel Lopez (Col) Astana Pro Team, at 25s
5 Tom Dumoulin (Ned) Team Sunweb, at 37s
6 Thibaut Pinot (Fra) Groupama-FDJ, at 42s
7 Wout Poels (Ned) Team Sky, 1-07
8 Sébastien Reichenbach (Sui) Groupama-FDJ, at 1-19
9 Pello Bilbao (Esp) Astana Pro Team, at 1-35
10 Michael Woods (Can) EF Education First-Drapac, at 1-43
Overall classification after stage 14
1 Simon Yates (GBr) Mitchelton-Scott, in 61-19-51
2 Tom Dumoulin (Ned) Team Sunweb, at 1-24
3 Domenico Pozzovivo (Ita) Bahrain-Merida, at 1-37
4 Thibaut Pinot (Fra) Groupama-FDJ, at 1-46
5 Chris Froome (GBr) Team Sky, at 3-10
6 Miguel Angel Lopez (Col) Astana Pro Team, at 3-42
7 Richard Carapaz (Ecu) Movistar Team, at 3-56
8 George Bennett (NZl) LottoNL-Jumbo, at 4-04
9 Pello Bilbao (Esp) Astana Pro Team, at 4-29
10 Patrick Konrad (Aut) Bora-Hansgrohe, at 4-43