← 返回个人网站搭建

Project Update

详情页图片灯箱:点击图片查看原图

2026-07-05 · 个人网站搭建 · JavaScript · UI · 媒体展示

为什么需要图片灯箱

Markdown 内容中经常会插入截图、插画或项目素材。

如果图片只在正文里按固定宽度展示,细节可能看不清。点击图片查看原图可以提升阅读体验,尤其适合:

  • 技术截图
  • 项目界面图
  • 设计稿
  • 笔记配图

基本结构

灯箱通常由三部分组成:

  • 遮罩层
  • 大图元素
  • 关闭按钮

页面中可以预先放一个全局灯箱:

<div id="imageLightbox" class="image-lightbox" aria-hidden="true">
  <button class="image-lightbox__close" type="button">×</button>
  <img id="imageLightboxImage" class="image-lightbox__image" alt="" />
</div>

这个结构放在全局 Layout 中,所有详情页都能复用。

监听哪些图片

并不是网站所有图片都需要放大,例如头像、logo、按钮图标就不需要。

本站只监听详情内容中的图片:

.detail-panel
.detail-content
.media-section
.media-grid

这样可以避免误触导航栏或头像。

打开灯箱

点击图片时,把图片地址赋给灯箱里的大图:

lightboxImage.src = image.currentSrc || image.src;
lightboxImage.alt = image.alt || '';
lightbox.classList.add('open');
document.body.classList.add('lightbox-open');

currentSrc 可以兼容响应式图片,优先拿浏览器实际加载的图片地址。

关闭灯箱

关闭方式可以有三种:

  • 点击关闭按钮。
  • 点击背景遮罩。
  • 按 Escape。

关闭时要清空图片地址,并恢复页面滚动:

lightbox.classList.remove('open');
document.body.classList.remove('lightbox-open');
lightboxImage.removeAttribute('src');

样式重点

遮罩层需要固定在视口上:

.image-lightbox {
  position: fixed;
  inset: 0;
  display: none;
  align-items: center;
  justify-content: center;
}

.image-lightbox.open {
  display: flex;
}

大图应该完整显示,而不是裁切:

.image-lightbox__image {
  max-width: 96vw;
  max-height: 90vh;
  object-fit: contain;
}

本站实践总结

图片灯箱是小功能,但能明显提升详情页体验。

实现时最重要的是控制作用范围:只让正文和媒体区图片可点击,不影响头像、导航和普通装饰图。