Preston claimed their third straight win to give themselves a fighting chance of escaping the drop courtesy of two goals from Iain Hume - a third-minute penalty and an 83rd-minute winner - either side of Ashley Williams's equaliser for Swansea.
Leeds United held their nerve to keep their promotion hopes alive and deal a massive blow to those of Nottingham Forest, who had Chris Cohen controversially sent off in the first half in a 4-1 victory for Simon Grayson's side.
Jonny Howson broke 10-man Forest's resistance early in the second period and Luciano Becchio headed a second soon after to put Leeds in command.
But Forest, who will feel aggrieved referee Mark Halsey showed Cohen a straight red card for his full-blooded tackle on George McCartney 10 minutes before half-time, hit back through substitute Gareth McCleary's brilliant curling effort. Leeds were not to be denied victory and Max Gradel scored twice in the last 16 minutes to seal the points.
The Wales striker may have struggled against England's Three Lions last weekend, but he shot down the Tigers with a superb first-half finish.
Morison's 16th goal of the season saw Millwall leapfrog the hosts in the table to keep the Londoners in touch with the top six and still dreaming of back-to-back promotions.
City are just a point behind them but games are running out and they need to turn around the home form which sees them without a win on their own turf since February 12.
Burnley 's own play-off hopes were hit after they were beaten 2-0 at home to Ipswich, courtesy of goals from David Norris and Connor Wickham, while Gary McSheffrey and Lukas Jutkiewicz ensured Coventry beat Watford by the same scoreline.
A hat-trick from Yakubu was not enough to see Leicester win at Middlesbrough, who pegged back the Foxes three times through goals from Marvin Emnes, Luke Williams and Stephen McManus, the last of those goals coming in the 90th minute.
Nicky Maynard scored the only goal in Bristol City's win over Doncaster Rovers, while a James Vaughan penalty sealed a 2-1 win over Barnsley for Crystal Palace after Marlon Harewood had cancelled out Neil Danns's opener.