文天祥听说宋帝赵昺即位,上表自劾兵败江西之罪,请求入朝,但不允许,只加封文天祥为少保、信国公。文天祥只得与部将邹沨、刘子俊、杜浒等在潮阳集结。
元朝廷以张弘范为都元帅,李恒为副,率领水军和骑兵,准备消灭最后的残余宋军,文天祥则首当其冲。当时有个土匪陈懿,跟文天祥有仇,便主动充当元军的向导,引领张弘范军到潮阳。文天祥兵少,无力与元军争锋,便率军退出潮阳,转到海丰五坡岭一带。张弘范派军紧追不舍,元军先锋张弘正追到时,文天祥与部将邹沨、刘子俊、杜浒等人正在吃饭,仓促之间来不及应战,便被俘虏。邹沨自杀。文天祥吞脑子(药名,多吃能致死)自杀,却没有死。刘子俊自称是文天祥,与文天祥争着承认。元兵判断出真伪后,将刘子俊放在锅里煮死。杜浒忧愤不食,不久也死去。文天祥则被押到潮阳见张弘范。左右喝令他下跪,文天祥始终不屈。张弘范很仰慕文天祥的人品,亲自为其解开绳缚,以宾客之礼相待。文天祥坚决求死,张弘范不许,将他押在船中。
祥兴二年(1279年)正月,张弘范得知宋军主力在崖山,于是发水军大举进攻。决战前,张弘范要文天祥写信给张世杰劝降,文天祥说:“我不能保护父母,难道还能教别人背叛父母吗?”张弘范不听,一再强迫文天祥写信。文天祥于是将自己前些日子所写的《过零丁洋》一诗抄录给张弘范。诗的最后两句是“人生自古谁无死,留取丹心照汗青”。张弘范见文天祥忠贞不屈,只好不再强迫。张弘范又发现元军中有个姓韩的军官是张世杰的外甥,于是连续三次派他去招降,张世杰不为所动,说:“我知道投降就有富贵,但义不可移!”张弘范又派人到崖山对士民们说:“你们陈丞相(陈宜中)已逃走,文丞相被俘虏,你们还要想怎样呢?”但士民中也没有背叛的。劝降不成,一场大战不可避免。
其实,此时元军只有数万人,且不习水战,而南宋小朝廷有军民二十万人,尚可背水一战。有人向张世杰提出:“海口之地,至关重要,倘若元军以水师扼守海口,则宋军不能进退。不如派兵防守,若能侥幸取胜,即是国家的福气;不胜,还可撤走。”但张世杰担心大军调动会导致士卒离散,再也无力抗战,于是主动放弃对崖门入海口的控制,而是将千余艘战船背山面海,结成一字长阵,中间用大绳连接,联舟为垒,四面围起楼栅,结成水寨方阵。又将行宫焚掉,赵昺也迁到海上,御船居于方阵之中,打算就此死守。
张世杰此举有两大失误,一是放弃了对入海口的控制权,相当于把主动权交给了对方;二是把千余战船用大索结成水寨,丧失了机动性。不久,张弘范果然派水师占领海口,断绝了宋军打柴取水的生命线。宋军没有淡水,吃了十多天干粮,渴得不得了只好喝海水,呕吐不止,士卒疲乏无力,战斗力锐减。
正月底,元军大批战船陆续到达。元将李恒也从广州领兵赶到。
二月初六早晨,暴风雨交加,元军突然发起猛攻。双方都知道这是最后的决战,因此战斗异常激烈,双方均是短兵相接,展开肉搏。元将李恒指挥水军利用早晨退潮、海水南流的时机,渡过平时战舰难以渡过的浅水,从北面对宋军发动了一场突袭。到中午,北面的宋军已被元军击溃。南面的元军又在张弘范的指挥下,利用中午涨潮、海水北流的时机,向宋军发动了另一次进攻。宋军南北受敌,士兵又身心疲惫,无力战斗,全线溃败。宋军将领翟国秀、凌震等解甲降元,张世杰、苏刘义从黎明坚持到黄昏,自知无望,斩断船索,率十六只战船拥杨太妃突围出去。
而赵昺的御船由于过于庞大,被外围的船只阻隔在中间,无法突围,张世杰不得不派小舟前去接应。当时天色已晚,风雨昏雾四起,咫尺不能相辨,陆秀夫唯恐小船为元军假冒,断然拒绝来人将赵昺接走。张世杰无奈,只得率战舰护卫着杨太后杀出崖门。
宋军败局已定,陆秀夫见大势已去,先逼迫自己的妻子儿子跳海自杀,然后对赵昺说:“国事至此,陛下当为国捐躯。德祐皇帝(指宋恭帝)受辱已甚,陛下不可再辱!”随即抱着九岁的宋帝赵昺投海而死。赵昺身边的很多大臣宫人也都投海自尽。这就是著名的崖山之战。宋军还有完好无损的船只八百艘,全部落入张弘范之手。张弘范为了记录自己灭宋的不世之功,派人在崖门的巨石上刻下了“镇国大将军张弘范灭宋于此”十二个大字。后来明朝建国后,有人将张弘范所镌刻的字迹全部铲去。