就在前线的帝国军队疯狂逃亡的时候,对前线惨败的消息一无所知的帝国政府还在向朝鲜增兵。9月15日夜,由丁汝昌亲自率领的18艘舰只,护送刘盛休的铭军8个营4000人,分乘招商局5艘轮船从大连港起锚,前去支援平壤战斗。16日,舰队安全到达安东附近的大东沟,中国步兵连夜登陆,北洋舰队返航。17日,返航舰队在鸭绿江口外的黄海海面与日本海军舰队遭遇。
那是中午时分,阳光照射在海面上,海水泛着耀眼的波光。面对迎面而来的日本舰队,12时50分,帝国北洋舰队旗舰“定远”号以32.5厘米主炮首先开炮,炮弹呼啸着从日本舰队吉野舰的上方飞过。几分钟之后,北洋舰队“镇远”号的32厘米主炮的炮弹击中了日本的“先锋”舰。日本舰队用四艘快速舰死死缠住北洋舰队中火力最弱的“超勇”号和“扬威”号穷追猛打,“超勇”号和“扬威”号终于中弹起火。这时,旗舰“定远”号也中了弹,指挥战斗的丁汝昌被巨大的爆炸震落于指挥台下。这位帝国海军将领拒绝进舱避弹,干脆坐在甲板上指挥战斗。然而旗舰上的信号系统被打坏,丁汝昌的指挥口令已无法发出。
这时的战场局势对日本舰队极其不利,因为北洋舰队已经把日本舰队的队形拦腰截断,日军的“比睿”号被击成重伤,正带着大火逃离战场,“赤城”号在北洋舰队猛烈而准确的炮火轰击下包括舰长坂元在内的舰上所有军官几乎全部死亡。14时,北洋舰队开始追击逃跑的“比睿”号,追击中“来远”号被“比睿”号上发射的炮弹击中,燃起大火,追击的其他军舰为此减速。这时,混战中的北洋舰队指挥官发现,日本舰队不知道什么时候绕到了中国舰队的背后,北洋舰队两面受敌了。
但是,和帝国陆军不同的是,北洋舰队的水兵没有怯战。“超勇”号直到沉没的最后时刻,火炮一直没有停止发射。日本舰队的“西京丸”号被击中。这时,北洋舰队炮弹已经打光的“致远”号与日舰“吉野”号迎头相遇。“致远”号管带邓世昌,五短身材,头发稀疏,人称“邓小辫子”,打仗时爱犬跟随身边。他知道“吉野”号是日舰主力,装备精良,于是下达了撞沉“吉野”号的命令。这是中国近代史上极其珍贵的一幅壮烈场面:“致远”舰大副陈金揆亲自操作鼓轮猛冲,那些还活着的衣衫褴褛的中国水兵全部站在前甲板上,他们等待着和日舰同归于尽的时刻。但是,那个时刻没有到来。没等与“吉野”号相撞,“致远”号就中了水雷,全舰除了七名水兵获救外,全部殉国。邓世昌的尸体漂浮于海面,他的爱犬跳海衔住他的辫子不放,直到尸体被打捞上来。
在“致远”号被水雷击中的同时,一发炮弹落在了北洋舰队“经远”号的指挥舱内,正在指挥射击的管带林远升的头颅被炸碎,舰上除了16名水兵获救外,其余的全部随舰沉入海底。更为严重的是,在这个决定帝国海军生死的最关键的时刻,“济远”、“广甲”两舰军心动摇,开始掉头逃跑。
海战进行到15时30分的时候,中国坚持战斗的军舰为四艘,而日舰有九艘,吨位对比为19870∶33834,日舰实力已远远超出北洋舰队。日舰以四艘军舰开始围攻“来远”号和“靖远”号,以五艘军舰包围着“定远”号和“镇远”号。帝国海军的“定远”号和“镇远”号都是当时世界上少有的大型铁甲舰,日本舰队决心把这两艘军舰击沉,以实现“聚歼清国海军于黄海”的预定目标。但是,从“定远”舰上射来的重磅炮弹击中了日军旗舰“松岛”号的弹药舱,黄海海面上响起了令中日水兵都感到震惊和恐怖的大爆炸,“松岛”号上的日本水兵当时就有113人被炸上天空,所有的炮手全部死亡。日本舰队旗舰所遭遇的重创严重挫伤了日本人的士气,指挥官下达了退出战斗归航的命令。
中日黄海海战最后的战果统计是:中国“致远”、“经远”和“超勇”号三舰被击沉,“扬威”号退出战场时搁浅自行焚毁,逃跑的“广甲”号慌乱中触礁,“来远”、“靖远”、“镇远”、“定远”号四舰受伤,其中主力舰“定远”、“镇远”两舰受伤“达数百上千处”。海军军官邓世昌、林履中、林远升殉国,水兵伤亡千余人。日本方面,军舰无一沉没,“松岛”、“比睿”、“赤城”、“西京丸”、“吉野”舰受伤,官兵伤亡六百余人。
至今几乎所有的评论都说帝国北洋海军黄海之战是一场“惨败”。如果指战术指标而言不无道理,但是从战略上看,北洋舰队完成了为陆军护航的任务,且海战掩护了陆军的顺利登陆和安全集结,海战还给予日本舰队以一定的打击,并迫使日本海军企图一举歼灭北洋舰队的目标落空。
就在帝国海军血战的时候,帝国陆军的溃败一发而不可收。
尽管叶志超带领残部逃到了距离平壤90公里的安州,并且与那里的聂士成的部队会合,但是叶志超下达的命令依旧是逃跑,帝国的陆军一口气逃过了中朝边界。面对日军的紧追,李鸿章严令叶志超不准再退:“一溃再溃,大局不保,负咎更重。”(《李文忠公全集》,电稿,卷十七,第21页。)同时,帝国政府开始紧急向中朝边境增兵——朝鲜国王的事情可以不管了,至少要把自己的国土保住。不久,集中在中朝边境上的帝国陆军达到了70个营,4万多人,由人称有勇有谋的“白发将军”宋庆统一指挥。