Zack Smith scored, and Corey Crawford made 18 saves for the Blackhawks (10-10-5), who are 1-3-1 in their past five games.
"It was a big divisional game, and we didn't give ourselves a sniff the entire night," Chicago captain Jonathan Toews said. "I don't know if we had as many good chances as they did. I give them credit, they're a good team. We didn't start well enough, gave up a lot a little too early."
MacKinnon gave the Avalanche a 1-0 lead 59 seconds into the game. Compher shot from the top of the left face-off circle, and MacKinnon tipped it in.
The Avalanche made it 2-0 at 3:17. Joonas Donskoi passed from the right corner to MacKinnon, whose point shot was redirected off Crawford by Matt Nieto. Ryan Graves put in the rebound from the bottom of the left circle.
The Blackhawks closed to 2-1 on Smith's goal at 9:14. Ryan Carpenter won a puck battle with Avalanche defenseman Ian Cole behind the net and passed to Smith in the slot.
Colorado increased the lead to 3-1 on Cale Makar's power-play goal at 12:20. MacKinnon passed to Makar at the top of the circles for a screened shot by Crawford's glove.
"I think nowadays, a lot of guys pull in and shoot," Makar said. "It's just more deceptive. You want to change it up, but sometimes it's just like that and I had the defender in front of me, so I decided to pull that one and just shoot it.
"We had some really good offensive opportunities, and it was just a night when we were able to capitalize on more of them than maybe we have been lately."