祥兴二年(1279年)二月初六,张弘范预备猛攻,元军中有人建议先用火炮,张弘范认为火炮打乱宋军的一字阵形,令其容易撤退。第二日,张弘范将其军分成四部,宋军的东、南、北三面皆驻一军;张弘范自领一军与宋军相去里余,并以奏乐为总攻讯号。首先北军乘潮进攻宋军北边失败,李恒等顺潮而退。元军假装奏乐,宋军听后以为元军正在宴会,防备松懈了。
正午时段,张弘范的水师于是正面进攻,接着用布遮蔽预先建成并埋下伏兵的船楼,以鸣金为进攻讯号。各伏兵负盾俯伏,在矢雨下驶近宋船。两边船舰接近,元军鸣金撤布交战,一时间连破七艘宋船。宋师大败,元军一路打到宋军中央。这时张世杰早见大势已去,抽调精兵,和苏刘义带领余部十余只船舰斩断大索突围而去。
赵昺的船在军队中间,四十四岁的陆秀夫见无法突围,便背着八岁的赵昺投海,随行十多万军民亦相继跳海壮烈殉国。不久,张世杰在大风雨中不幸溺卒于平章山下(约今广东省阳江市西南的海陵岛对开海面)。