Marc-Andre Ter Stegen produced a string of top saves to keep Barcelona in the game in the first half, denying Maxi Gomez from the penalty spot after Gerard Pique had brought down Jose Gaya in the area, before tipping another Gomez shot onto the bar.
But Valencia took the game away from them after the break, drawing first blood three minutes into the second half thanks to a Jordi Alba own goal, before Gomez made the points safe 13 minutes before the end.
Barcelona remain top of the table but could be overtaken when second-placed Real Madrid take on Valladolid on Sunday.
The visitors started the game on the front foot, enjoying more than 90 per cent possession in the early stages.
But despite Barca's dominance, it was Valencia who found themselves with a great chance to break the deadlock when Pique was adjudged to have fouled Gaya in the box in the 10th minute.
Goalkeeper Ter Stegen came to the league leaders' rescue, though, producing a stunning save to keep out Gomez's well-struck spot-kick.
Valencia grew into the game in the minutes that followed and a dangerous cross almost caught Barca out – but Ter Stegen did well to prevent Pique from turning the ball beyond him.
After Lionel Messi had sent a free-kick over the bar from around 25 yards in the 28th minute, Ter Stegen made a fine double save at the other end to keep the game goalless – tipping a fierce Gomez effort onto the bar before clawing the ball to safety.
Francis Coquelin tested the Germany international again in the 31st minute but he was equal to his strike from range.
Five minutes later Messi struck a free-kick straight at Jaume Domenech as another chance came to nothing.
Shortly after Barcelona's Ansu Fati had shot narrowly wide, Valencia opened the scoring in the 48th minute when Gomez's effort took a deflection off Alba and landed in the back of Barca's net.
Messi had a good opportunity to level things up for Barca just before the hour mark but he flashed his shot across goal narrowly wide.
The Argentina forward chipped the ball towards goal from the left side of the box in the 68th minute and watched on as it landed on top of the net, before forcing the home keeper to parry his 20-yard free-kick five minutes later.
But Valencia doubled their advantage in the 77th minute, with Gomez sweeping home after a quick break.
The home side thought they had made it 3-0 nine minutes before the end when Gabriel Paulista volleyed home from a corner but his effort was ruled out for a foul.
Messi was denied again late on as Valencia secured a valuable home win.