Horvat is tied for second in the NHL with 26 goals in 34 games this season.
"It's pretty fun to watch," Canucks forward Brock Boeser said. "Hopefully he can keep it going."
Ilya Mikheyev had a goal and three assists, and Boeser had a goal and two assists for the Canucks (16-15-3), who have won three in a row. Spencer Martin made 24 saves.
"I think the team is starting to believe in themselves a little bit, and I think that's important," Vancouver coach Bruce Boudreau said. "We contained [San Jose] fairly well."
Timo Meier scored twice, and Erik Karlsson had two assists for the Sharks (11-19-6), who have lost four of five (1-3-1). James Reimer made 19 saves.
"That's three times we've played these guys, and obviously they've got skill, but to give them six every time we play against them isn't a recipe for success," San Jose captain Logan Couture said.