鸣梁海峡是珍岛与大陆之间的狭窄海峡,水流湍急。每隔3个小时鸣梁海峡内的海流方向会发生逆转。海峡仅宽约294米[3] ,狭窄到可以在两岸拉钢索,方便李发挥龟船、板屋船质量胜于日军船的优势而不让日军的数量优势得以发挥,之后李又动员百艘民船拉上军旗在后以壮声威。
10月26日的清晨,一切准备就绪后,李舜臣派出一艘军舰引诱敌军进入事先设好的圈套。在日舰驶入鸣梁海峡时,李舜臣早已在对面准备好了。等日舰靠近时,隐蔽在山脚的李舜臣海军对日舰发起猛烈的炮轰。由于日军的舰船是尖底的,在湍急的海流中摇晃不定,加之李舜臣海军有山体的遮掩,日军的炮火无法打中目标。而朝鲜海军使用的是平底船,船身平稳因此炮火命中率高。另外李舜臣在海峡内事先已经拉起了钢索使入侵的日舰处境更加悲惨。入侵的日军被打得措手不及,日军将领来岛通总也被击毙。
很快鸣梁海峡的海流开始逆转,日舰开始相互磕磕碰碰,一片混乱。李舜臣趁乱率领朝鲜海军对日军展开猛烈攻势。大量的日舰拥挤在狭窄的鸣梁海峡内,成了极其被动的攻击目标。虽然李舜臣只有12只军舰,凭借着地利天时击沉了倭寇31艘军舰另有大约92日舰被损毁到丧失战斗力。汹涌的海水也使得跳下船的日军因无法游到岸上而被淹死。此次海战朝鲜宣称日军有8000多人阵亡,而朝鲜阵亡人数只有34人。[2] 但是参战的藤堂高虎(2,800)、加藤嘉明(2,400)、胁坂安治(1,200)、来岛通総(600)、菅平右卫门达长(200)加起来总数还没有到八千。李舜臣在鸣梁海峡的胜利,有效地切断了日军从黄海对稷山之战的供给,使日军最终撤退。