Jacob Markstrom made 26 saves for the Canucks (30-21-5), who have gone four straight without a victory (0-3-1) and had their nine-game home winning streak end.
Vancouver forward Brock Boeser left at 2:30 of the third period with an upper-body injury.
"He is going to be out. I don't know how long. For a little bit," Canucks coach Travis Green said. "We will know more [Sunday]."
Tanner Pearson gave Vancouver a 1-0 lead 34 seconds into the game on the first shot.
"There's no panic there," Ward said. "There's 59-and-a-half minutes left, so we're certainly not going to sag on something like that. Guys were talking about, 'Let's go, let's go, next shift up, let's do something about it.' I thought emotionally our guys were checked in, I thought their engagement was in the right place and they did a good job coming right off that goal."
Ryan tied it 1-1 at 4:20 with a wrist shot through a screen from the top of the face-off circle, and Matthew Tkachuk gave the Flames a 2-1 lead at 12:08 on a breakaway rebound that went in off his skate.
"We got a bit too much into a track meet with that team," Pearson said. "That's the kind of game they wanted. That doesn't give us success. We have to get back to the way we play and nip this losing streak in the bud."
The Canucks tied it 2-2 with 1:47 left in the first period after Tkachuk's pass behind the net took a bounce off the boards to Adam Gaudette in front.