Verstappen had had a troubled build-up through the three practice sessions leading into qualifying, with his RB20 unbalanced around Barcelona’s combination of mixed-speed corners.
By the pole shootout, however, the Dutchman had found his sweet spot and had taken provisional pole after the first laps.
Norris, however, was peaking at the same time, lapping just 0.123 seconds slower than the reigning champion as the pair embarked on their final laps.
Each pushed the other to a higher level, turning the fight for pole into a private duel.
Verstappen crossed the line first, improving 0.270 seconds to maintain top spot.
Norris replied with the best qualifying lap of his career, shaving 0.413 seconds off his best time to overhaul his rival by just 0.02 seconds to score the second pole position of his career and become the fourth different pole-getter from the last four races.
“It was pretty much a perfect lap,” Norris said. “You know when you’re on a good lap and you’re getting excited; the whole thing went perfectly at the end.
“I’m super, super happy. We’ve been close all weekend, but really this was just about a perfect lap, and that’s what I did today.
“It’s not just this weekend. We’ve been quick the last two months. Since Miami we’ve been very strong.
“We’re here to win now. That’s my plan.”
Verstappen was pleased to have recovered from a tough Friday to contend for pole and remained quietly confident ahead of the grand prix.
“I think in qualifying it was all coming together a bit nicer,” he said. “The whole weekend we’ve been trying to find a connected balance.
“Unfortunately it was just not enough. That’s how it goes sometimes. I think overall we can still be very happy with this performance in qualifying.”
Lewis Hamilton was best of the rest but qualified 0.318s adrift of pole, though the Mercedes driver was pleased just to see his car perform so strongly around a circuit as technically challenging for the cars as Barcelona.
“I’m really happy,” he said. “It’s been quite a difficult year. Finally we’re starting to see those incremental steps.
“I didn’t expect to be fighting for pole necessarily… to just be there, I’m incredibly grateful.”
Teammate George Russell will share the second row with Hamilton, while Ferrari’s Leclerc and Sainz will start fifth and sixth on the third row.
Pierre Gasly was the first of a surprising two Alpine cars in the top 10, the Frenchman qualifying seventh and less than half a second off pole.
Teammate Esteban Ocon will start alongside him in eighth after Sergio Pérez serves his three-place grid penalty for driving a car in a dangerous conditions after crashing out of the preceding Canadian Grand Prix two weeks ago.
Pérez will drop from eighth to 11th, also promoting Oscar Piastri to ninth and Fernando Alonso to 10th.
Pérez will start ahead of Valtteri Bottas, Nico Hülkenberg and Lance Stroll down to 14th.
Zhou Guanyu made it out of Q1 for the first time all season but could do no better than 15th and more than half a second slower than Sauber teammate Bottas. He starts ahead of Kevin Magnussen in 16th.
Yuki Tsunoda pipped teammate Daniel Ricciardo in 17th and 18th on a disappointing day for RB, which has brought a significant update package to Barcelona expecting to compete for Q3 but instead slumping to its worst qualifying result of the season.
Williams teammates Alex Albon and Logan Sargeant will bring up the rear of the grid in 19th and 20th, with the latter also facing a post-session stewards investigation for blocking Stroll.