此后,元军从海上采取火攻,但宋军早有预防,在一些战船上涂抹海泥,加上将士拼死抵抗,元军并未占到多少便宜。不过经过几次攻打,元军迫使宋军阵形收缩,元军水师则占据了崖门外海,与崖山上的元军一起形成了对宋军的海陆包围。
二月六日(1278年3月19日)凌晨,元军副帅李恒率战船顺着退潮从北面顺流而下,进攻宋军船阵,但战果不大,至中午涨潮时又顺潮北退,而已经布置于南、西、西南三个方向的元军在张弘范的带领下则顺潮水北进,从崖山与汤瓶山之间的崖门水道向宋军船阵展开攻击,很快就夺取了宋军前阵并烧毁了宋军几十艘战船。此时宋军主帅张世杰在慌乱之下又下了一道错误的命令,将两侧战船调往中军,更使宋军阵形大乱。
午后,海面突降大雨,宋军急忙砍断铁索,趁着雨雾开始突围,但仅有张世杰带着十几艘大船冲出元军重围,包括宋帝御船在内的宋军大部被元军越围越紧,陆秀夫在绝望之下先逼妻儿投海自尽,然后自己抱着宋幼帝跳海而亡。逃出重围的张世杰后来在阳江南面的海陵岛附近遇上风暴,船翻人亡。
此役,元军共烧毁、击沉宋军战船二百余艘,缴获八百余艘,俘虏宋军两万多人,宋军战死十万人以上。宋朝皇室在临安(今杭州)向元军统帅伯颜投降后,宋廷残部南逃,经历三年二帝,就此彻底灭亡了。
崖门海战是中国古代最大的一次海战,其参战兵力、舰船和伤亡人数之多,在我国古代海战史上都是空前绝后。双方水军战死人数绝对远超二十万。古时传言,浮尸百里。
当时目睹了海战全过程的南宋将领文天祥(在江西组织抗元义军兵败被俘押解至此)作诗日:
《二月六日海上大战国事不济孤臣天祥坐北舟中》
长平一坑四十万,秦人欢欣赵人怨。
大风扬沙水不流,为楚者乐为汉愁。
兵家胜负常不一,纷纷干戈何时毕。
必有天吏将明威,不嗜杀人能一之。
我生之初尚无疚,我生之后遭阳九。
厥角稽首并二州,正气扫地山河羞。
身为大臣义当死,城下师盟愧牛耳。
间关归国洗日光,白麻重宣不敢当。
出师三年劳且苦,只尺长安不得睹。
非无虓虎士如林,一日不戈为人擒。
楼船千艘下天角,两雄相遭争奋搏。
古来