Barca forward Neymar hit the crossbar twice and team mate Lionel Messi did likewise once before hesitation in the defence let in Celta forward Joaquin Larrivey to score 10 minutes after halftime at the Nou Camp.
As the home side strove in vain for an equaliser, Messi, who remains one goal short of La Liga’s scoring record of 251, sent a free kick against the corner of the goal frame in the 80th minute.
Luis Suarez, making his home debut, was then denied by a brilliant save from Sergio, one of a string of superb stops by the inspired Celta goalkeeper.
Barca’s second straight defeat is another blow for new coach Luis Enrique, who was in charge at Celta last season, and means Real take over at the top on 24 points from 10 matches thanks to a 4-0 win at Granada earlier on Saturday.
James Rodriguez struck twice for the European champions, including a superb volley, and the prolific Cristiano Ronaldo scored his 17th goal in nine La Liga appearances this season.
Champions Atletico Madrid, 4-2 winners at home to Cordoba, are second on 23 points.
Sevilla can overtake Real and Atletico with victory at Athletic Bilbao on Sunday while Celta are sixth on 19 points.
“I think we played a bad match and we weren’t comfortable,” Barca centre back Javier Mascherano told Canal Plus television.
“Beyond creating chances we were unable to play our game and that is worrying,” added the Argentine international.
With Wednesday’s trip to Ajax Amsterdam in the Champions League looming, Barca were looking for a morale-boosting win after the setback at Real.
It was not their night, however, as chance after chance went begging through a combination of poor shooting and bad luck and Larrivey clinically converted one of Celta’s few openings.
“We showed a lot of mental strength to survive at the back and have enough oxygen to score the goal,” said Celta coach Eduardo Berizzo.
“We have to be fair and admit that if Barca had scored first the outcome would have been very different,” added the Argentine.
Ronaldo set Real on their way in the second minute at Granada’s Nuevo Los Carmenes stadium when he clipped home a Karim Benzema centre.
Rodriguez made it 2-0 for the European champions in the 31st minute when he crashed a superb, dipping volley into the top corner before Ronaldo’s clever backheel sent Benzema clear for a third in the 53rd.
Granada fluffed their few chances before Rodriguez followed up a scuffed Ronaldo effort to score the fourth with four minutes to go as Real eased to an 11th win in a row in all competitions.
“We played with focus and with a lot of work and sacrifice,” said Real coach Carlo Ancelotti.
“If you fight everything comes off well,” added the Italian whose side host Liverpool in the Champions League on Tuesday.
“We have to keep going in the same way to maintain our good run. We are playing well and winning.”
Cordoba held out until two minutes before halftime at the Calderon stadium when Antoine Griezmann’s effort was deflected in for an own goal by Luso.
The visitors surprised Atletico nine minutes into the second half when Nabil Ghilas headed in at a corner before Griezmann made it 2-1 with another header four minutes later.
Mario Mandzukic nodded Atletico’s third in the 62nd minute before substitute Raul Garcia deflected Koke’s cross into the net nine minutes from time. Ghilas grabbed Cordoba’s second goal with three minutes left after some poor defending.
(Editing by Ian Chadband)