AC Milan missed the chance to close the gap on fifth-placed Atalanta as they went down 4-1 to Roma at San Siro.
An Edin Dzeko brace inside the first half hour had the visitors sitting comfortable, but Mario Pasalic responded for Milan inside the last 15 minutes to set up a grandstand finish.
Former Rossoneri player Stephan El Shaarawy responded instantly with a curling finish to kill any comeback hopes.
Gabriel Paletta was then sent off for a last-man challenge on Mo Salah, with Daniele de Rossi adding a fourth for the away side.
The result means that Roma are still mathematically in the Scudetto race, while Milan stay three points above Inter but six behind Atalanta.
It didn’t take long for the visitors to find their feet in the game as they went ahead inside six minutes. Diego Perotti fed Dzeko, who swept home emphatically past Donnarumma from the edge of the box.
Roma were knocking on the door again seven minutes later as a cross found its way to Mohammed Salah who controlled and fired over on the bounce.
In the 15th minute Milan had a chance to create something themselves as Gerard Deulofeu led a break, however his shot deflected for a corner, from which Cristian Zapata headed wide from the eventual cross.
Perotti was inches away from doubling the advantage two minutes later as his curling shot from distance was spectacularly tipped onto the post by Donnarumma.
Jose Sosa drew a save from Wojciech Szczesny with a long-range effort.
However, Roma did double their lead just before the half hour mark. A corner was whipped in towards the near post with pace meaning Dzeko needed just the slightest of flicks to make it 2-0.
Radja Nainggolan hit the post eight minutes before the break after Salah fed him inside the area; Donnarumma again getting a vital hand to the low shot.
The second half was a stark contrast to the first; chances were few and far between, partly because Roma knew they could sit deeper, but also because the same levels of quality were not there from either side.
Dzeko had the first real opportunity of the half as he was slipped through in the 67th minute, however he pulled his shot wide of the goal.
Half-time substitute Andrea Bertolacci had a chance of his own a minute later as he fired from distance, though he failed to keep his shot down.
Former AC Milan man Stephan El Shaarawy came of the subs’ bench and tested Donnarumma with a low curling shot with just over 15 minutes remaining.
The Rossoneri were handed a lifeline as Pasalic halved the deficit. A corner from the right side was glanced across goal at the near post by Lucas Ocampos and the Croatian had a simple task to convert from two yards.
The joy was to be short-lived however as El Shaarawy capitalised on being allowed space to shoot on the edge of the box, curling past Donnarumma to make it 3-1 with an almost instant reply.
Gabriel Paletta was then sent off for the fourth time this Serie A season as he hauled down Mo Salah through on goal.
Donnarumma got a hand to Daniele de Rossi’s penalty and tipped it up into the roof of the net, adding the final nail in the coffin.