You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript实现模态框弹出后按方向键切换画廊图片

你可以通过监听键盘按键事件实现需求,仅需对原有代码做少量调整即可,同时修复了原有代码中ID重复的小问题:

修改说明

  • 打开模态框时绑定键盘事件,关闭时解绑,避免全局触发按键逻辑
  • 左方向键切换上一张,右方向键切换下一张,额外新增ESC键关闭模态框的常用交互
  • 修复多个caption元素共用相同ID的问题,避免DOM获取异常

完整修改后代码

JavaScript代码

function openModal() {
  document.getElementById("myModal").style.display = "block";
  // 绑定键盘事件
  document.addEventListener('keydown', handleKeydown)
}

function closeModal() {
  document.getElementById("myModal").style.display = "none";
  // 解绑键盘事件
  document.removeEventListener('keydown', handleKeydown)
}

// 键盘事件处理
function handleKeydown(e) {
  // 左方向键 上一张
  if(e.keyCode === 37) {
    plusSlides(-1)
  }
  // 右方向键 下一张
  if(e.keyCode === 39) {
    plusSlides(1)
  }
  // ESC键关闭模态框
  if(e.keyCode === 27) {
    closeModal()
  }
}

var slideIndex = 1;
showSlides(slideIndex);

function plusSlides(n) {
  showSlides(slideIndex += n);
}

function currentSlide(n) {
  showSlides(slideIndex = n);
}

function showSlides(n) {
  var i;
  var slides = document.getElementsByClassName("mySlides");
  if (n > slides.length) {
    slideIndex = 1
  }
  if (n < 1) {
    slideIndex = slides.length
  }
  for (i = 0; i < slides.length; i++) {
    slides[i].style.display = "none";
  }
  slides[slideIndex - 1].style.display = "block";
  // 取当前slide下的caption文本
  const currentCaption = slides[slideIndex - 1].querySelector('.caption').innerHTML;
  document.getElementById("modalCaption").innerHTML = currentCaption;
}

CSS代码(仅新增全局caption样式,其余保持不变)

.modal {
  width: 58%;
  height: 100%;
  top: 0;
  position: fixed;
  display: none;
  background-color: rgba(22, 22, 22, 0.5);
  margin-left: 300px;
  max-width: 779px;
  min-width: 779px;
}

.modal-content {
  margin: auto;
  display: block;
  width: 80%;
  max-width: 700px;
}

.mySlides {
  display: none;
}

.close {
  position: relative;
  color: #f1f1f1;
  font-size: 40px;
  font-weight: bold;
  transition: 0.3s;
  left: 584px;
  top: 90px;
}

.close:hover,
.close:focus {
  color: #999;
  text-decoration: none;
  cursor: pointer;
}

.cursor {
  cursor: pointer;
}

.prev {
  cursor: pointer;
  position: relative;
  top: -149px;
  padding: 16px;
  margin-top: -50px;
  color: white;
  font-weight: bold;
  font-size: 20px;
  border-radius: 0 3px 3px 0;
  user-select: none;
  -webkit-user-select: none;
  left: -10%;
}

.next {
  cursor: pointer;
  position: relative;
  top: -149px;
  padding: 16px;
  margin-top: -50px;
  color: white;
  font-weight: bold;
  font-size: 20px;
  border-radius: 0 3px 3px 0;
  user-select: none;
  -webkit-user-select: none;
  left: 600px;
}

/* 新增全局caption展示容器样式 */
#modalCaption {
  padding-bottom: 7px;
  font-size: 17px;
  color: white;
  text-align: center;
  margin-top: 120px;
}

HTML代码(调整了caption结构避免ID重复)

<tr>
  <div class="row">
    <div class="column">
      <td>
        <p align="center"><img src="https://source.unsplash.com/collection/190727/1600x900" width="250" height="164" onclick="openModal();currentSlide(1)" class="hover-shadow cursor" alt="Annual function"></p>
      </td>
    </div>
    <div class="column">
      <td>
        <p align="center"><img src="https://source.unsplash.com/collection/190727/1600x910" width="250" height="164" onclick="openModal();currentSlide(2)" class="hover-shadow cursor" alt="Annual function"></p>
      </td>
    </div>
</tr>

<div id="myModal" class="modal">
  <div class="modal-content">
    <span class="close cursor" onclick="closeModal()">&times;</span>
    <p id="modalCaption"></p>
    <div class="mySlides">
      <img src="https://source.unsplash.com/collection/190727/1600x900" style="width: 98%;position: relative;left: 10px;top: 109px;" alt="Annual function">
      <p class="caption" style="display:none;">Annual function</p>
    </div>

    <div class="mySlides">
      <img src="https://source.unsplash.com/collection/190727/1600x910" style="width: 98%;position: relative;left: 10px;top: 109px;" alt="Annual function">
      <p class="caption" style="display:none;">Annual function</p>
    </div>
    <a class="prev" id="prev1" onclick="plusSlides(-1)">&#10094;</a>
    <a class="next" onclick="plusSlides(1)">&#10095;</a>
  </div>
</div>

内容的提问来源于stack exchange,提问作者Souvik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:30:05