Tito Vilanova's side predictably started the game the stronger of the two teams and could have been ahead when Lionel Messi forced his way into the box, but the forward uncharacteristically fired wide of the target.
Barcelona were eventually rewarded for their pressure when Pedro broke free and crossed towards the back post for Adriano, who easily converted from close range.
However, the lead only lasted a couple of minutes as Celta Vigo stopped another Barcelona attack before breaking in numbers, with Mario Bermejo tapping in following a block from Victor Valdes.
Celta Vigo looked dangerous at the start of the second period and the hosts did well to keep hold of their lead, with Iago Aspas causing havoc in the Barca defence at times.
Jordi Alba put the result beyond doubt on the hour mark by ghosting into the Celta defence unmarked to convert Villa's dangerous cross.
The goal from Alba ended the away side's stubborn resistance and despite having opportunities to score more goals, Barca easily secured the three points.