Moscow was aiming to complete its conquest of Mariupol in time for Victory Day celebrations on Monday, but its forces continued to face dogged resistance from defenders within the bunkers beneath the factory.
Civilians have been evacuated.
In a sign of the unexpectedly effective defence that has sustained the fighting into its 11th week, Ukraine’s military flattened Russian positions on a Black Sea island that was captured in the war’s first days and has become a symbol of resistance.
Western military analysts also said a Ukrainian counteroffensive was advancing around the country’s second-largest city, Kharkiv.
Ukraine’s military said retreating Russian forces destroyed three bridges on a road north-east of the city to try to slow the Ukrainian advance.
The largest European conflict since the Second World War has developed into a punishing war of attrition that has killed thousands of people, forced millions to flee their homes and destroyed large swathes of some cities.
Ukrainian leaders warned that attacks would only worsen in the lead-up to Victory Day, when Russia celebrates Nazi Germany’s defeat in 1945 with military parades.
Russian President Vladimir Putin is believed to want to proclaim some kind of triumph in Ukraine when he addresses the troops in Red Square on Monday.
US secretary of state Antony Blinken said on Saturday that Ukrainian President Volodymyr Zelensky and his people “embody the spirit of those who prevailed during the Second World War”.
He accused Mr Putin of trying “to twist history to attempt to justify his unprovoked and brutal war against Ukraine”.
“As war again rages in Europe, we must increase our resolve to resist those who now seek to manipulate historical memory in order to advance their own ambitions,” Mr Blinken said in a statement as the United States and United Kingdom commemorate the Allied victory in Europe.
The most intense fighting in recent days has been in eastern Ukraine, where the two sides are entrenched in a fierce battle to capture or reclaim territory.
Moscow’s offensive there has focused on the Donbas, where Russia-backed separatists have been fighting since 2014.
The governor of Luhansk region, one of two that make up the Donbas, said a Russian strike destroyed a school in the village of Bilogorivka where 90 people were seeking safety in the basement.
Governor Serhiy Haidai, who posted pictures of the burning rubble on the Telegram messaging app, said 30 people were rescued.
Rescue work was ongoing.
Mr Haidai also said two boys aged 11 and 14 were killed by Russian shelling in the town of Pryvillia, while two girls aged eight and 12 and a 69-year-old woman were wounded.
In neighbouring Moldova, Russian and separatists troops are on “full alert”, the Ukrainian military warned on Sunday.
The region has increasingly become a focus of worries that the conflict could expand beyond Ukraine’s borders.
Pro-Russian forces broke off the Transnistria section of Moldova in 1992, and Russian troops have been stationed there since, ostensibly as peacekeepers.
Those forces are on “full combat readiness”, Ukraine said, without giving details on how it came to the assessment.
Moscow has sought to sweep across southern Ukraine both to cut off the country from the sea and create a corridor to Transnistria.
But it has struggled to achieve those objectives.
On Saturday, six Russian cruise missiles fired from aircraft hit Odesa, where a curfew is in place until Tuesday morning.
Videos posted on social media showed thick black smoke rising over the Black Sea port city as sirens wailed.
The Odesa city council said four of the missiles hit a furniture company, with the shock waves and debris badly damaging high-rise apartment buildings.
The other two missiles hit the Odesa airport, where the runway had already been taken out in a previous Russian attack.
Air raid sirens sounded several times early on Sunday, the city council said.
Satellite photos analysed by the Associated Press showed Ukraine targeting Russian-held Snake Island in a bid to impede Russia’s efforts to control the Black Sea.
An image taken early on Saturday by Planet Labs PBC showed that most of the island’s buildings had been destroyed by Ukrainian drone attacks, as well as what appeared to be a Serna-class landing craft against the island’s northern beach.
The image corresponds with a Ukrainian military video showing a drone striking the Russian vessel, engulfing it in flames.
Snake Island, located some 35 kilometres (20 miles) off the coast, figured in a memorable incident early in the war when Ukrainian border guards stationed there defied Russian orders to surrender, purportedly using colourful language.
In Mariupol, Ukrainian fighters made a final stand against a complete Russian takeover of the strategically important city, which would give Moscow a land bridge to the Crimean Peninsula, annexed from Ukraine during a 2014 invasion.
Satellite photos shot on Friday by Planet Labs PBC showed vast devastation at the sprawling Azovstal seaside steel mill, the last pocket of Ukrainian resistance in the city.
Buildings had gaping holes in the roofs, including one under which hundreds of fighters were likely to be hiding.
After rescuers evacuated the last civilians on Saturday, Mr Zelensky said in his nightly address that the focus would turn to extracting the wounded and medics, adding: “Of course, if everyone fulfils the agreements. Of course, if there are no lies.”
He added that work would also continue on Sunday on securing humanitarian corridors for residents of Mariupol and surrounding towns to leave.