Jose Reyes hustled his way to a run and the Marlins came up with several pivotal defensive plays. Zambrano rebounded from his worst start this year to pitch six innings, and struggling closer Heath Bell finished with a 1-2-3 ninth.
A couple of big swings made a difference, too: Morrison and Giancarlo Stanton homered. As a result, the Marlins beat NL East leader Washington for the first time this season.
"We played well," manager Ozzie Guillen said. "It was two good teams. They're in first place for a reason."
The Marlins are gaining ground, though. They improved to 19-8 since May 1, best in the majors, and tied the franchise record for victories in any month. They're 5-9 against the NL East, while Washington fell to 11-4 within the division.
The key double play came in the seventh to preserve the Marlins' 4-3 lead. Stanton tied the game in the sixth with his 11th home run in May, one short of the Marlins' record for a month.
Morrison, whose late father was in the Coast Guard, hit a Memorial Day homer, his third this year. Hanley Ramirez had three hits and a sacrifice fly.
Reliever Edward Mujica got five outs while facing only four batters, and Bell earned his eighth save in 12 chances. Bell, a Marlins newcomer after three All-Star seasons with San Diego, had failed to finish the ninth in his previous two outings.
"It feels really good to go out there and get the job done like I know I can, and show these boys I can do it," he said. "I've just got to keep earning my keep."
Jordan Zimmermann (3-5) hit his first career homer but couldn't hold a 3-1 lead. He gave up four runs in six innings, including both Miami homers.
Zambrano (3-3) allowed three runs and seven hits in six-plus innings and came away impressed by the Nationals.
"Man, I'll tell you what, I found out why they're in first place," Zambrano said. "Those kids can hit. They're good. The only mistake I made today was to Zimmermann. Otherwise I was in control. I made some good pitches that they hit."
Miami rallied from a 3-1 deficit in the sixth to take the lead. Ramirez singled and Stanton hit his 12th homer of the year, estimated at 412 feet. Morrison doubled and took third on a single by Bryan Petersen, and Chris Coghlan's sacrifice fly put the Marlins ahead.
Morrison tied the score with a leadoff homer in the fourth. He paid tribute to his father, who died in 2010, by pointing upward as he crossed home plate.
"I was definitely getting goose bumps going around the bases," Morrison said. "Giving him the salute was pretty cool."
Zambrano took a 4-3 lead into the seventh but departed after the first two batters reached. Left fielder Coghlan made a difficult running catch of Bryce Harper's fly, and after Mujica entered the game, Ryan Zimmerman grounded into a double play.
"We had the right guys up," Nationals manager Davey Johnson said. "We just didn't get it done."
Reyes produced an insurance run in the seventh. He kept running after hitting a blooper to short center and barely beat Rick Ankiel's throw to second for a double.
"I was a little upset at Ankiel," Johnson said. "He's too good of a player to not know that the guy is going to try to stretch that. You can't assume he's not going for two. That put us in a hole right there."
Reyes took third on a groundout to the left side, then scored without a play when Ankiel juggled Ramirez's shallow fly in his haste to throw home.
"That's the baseball I love," Guillen said. "That was a huge run."
Morrison increased his average in day games to .388. He's batting .159 at night. ... 3B Ramirez, who moved to a new position this season, made only his second error when he threw wildly in the first inning. ... Miami C John Buck ended an 0-for-26 slump when he singled in the second. ... RHP Anibal Sanchez, who is scheduled to start Tuesday, is 7-0 with a 2.18 ERA in 18 starts against Washington. ... Game-time temperature was 78 degrees -- under the retractable roof. Outdoors the heat index was 99.