当前位置:首页 > JavaScript

js实现灯箱

2026-02-02 12:16:29JavaScript

实现灯箱效果的基本方法

灯箱效果通常用于放大显示图片或其他内容,同时覆盖整个页面背景。以下是使用纯JavaScript和CSS实现灯箱效果的步骤:

HTML结构

<div class="lightbox" id="lightbox">
  <div class="lightbox-content">
    <span class="close">&times;</span>
    <img src="" class="lightbox-image" id="lightbox-image">
  </div>
</div>

<!-- 触发灯箱的图片示例 -->
<img src="thumbnail.jpg" class="thumbnail" onclick="openLightbox(this)">

CSS样式

.lightbox {
  display: none;
  position: fixed;
  z-index: 999;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.8);
}

.lightbox-content {
  position: relative;
  margin: auto;
  padding: 20px;
  max-width: 90%;
  max-height: 90%;
  top: 50%;
  transform: translateY(-50%);
}

.lightbox-image {
  display: block;
  max-width: 100%;
  max-height: 80vh;
  margin: 0 auto;
}

.close {
  color: white;
  position: absolute;
  top: 10px;
  right: 25px;
  font-size: 35px;
  font-weight: bold;
  cursor: pointer;
}

JavaScript代码

function openLightbox(element) {
  const lightbox = document.getElementById('lightbox');
  const lightboxImg = document.getElementById('lightbox-image');

  lightbox.style.display = 'block';
  lightboxImg.src = element.src;

  document.addEventListener('keydown', function(event) {
    if (event.key === 'Escape') {
      closeLightbox();
    }
  });
}

function closeLightbox() {
  document.getElementById('lightbox').style.display = 'none';
}

// 绑定关闭按钮事件
document.querySelector('.close').addEventListener('click', closeLightbox);

增强功能实现

支持图片切换

const images = document.querySelectorAll('.thumbnail');
let currentIndex = 0;

function openLightbox(index) {
  const lightbox = document.getElementById('lightbox');
  const lightboxImg = document.getElementById('lightbox-image');

  currentIndex = index;
  lightbox.style.display = 'block';
  lightboxImg.src = images[index].src;

  // 添加键盘导航
  document.addEventListener('keydown', handleKeyDown);
}

function handleKeyDown(event) {
  if (event.key === 'Escape') {
    closeLightbox();
  } else if (event.key === 'ArrowRight') {
    navigate(1);
  } else if (event.key === 'ArrowLeft') {
    navigate(-1);
  }
}

function navigate(direction) {
  currentIndex = (currentIndex + direction + images.length) % images.length;
  document.getElementById('lightbox-image').src = images[currentIndex].src;
}

// 为所有图片添加点击事件
images.forEach((img, index) => {
  img.addEventListener('click', () => openLightbox(index));
});

动画效果优化

添加淡入淡出动画效果:

.lightbox {
  opacity: 0;
  transition: opacity 0.3s ease;
  pointer-events: none;
}

.lightbox.active {
  opacity: 1;
  pointer-events: auto;
}

更新JavaScript:

function openLightbox(index) {
  const lightbox = document.getElementById('lightbox');
  lightbox.classList.add('active');
  // 其余代码...
}

function closeLightbox() {
  const lightbox = document.getElementById('lightbox');
  lightbox.classList.remove('active');
  // 可选:延迟隐藏元素以完成动画
  setTimeout(() => {
    lightbox.style.display = 'none';
  }, 300);
}

响应式设计考虑

确保灯箱在不同设备上表现良好:

@media (max-width: 768px) {
  .lightbox-content {
    max-width: 95%;
    padding: 10px;
  }

  .lightbox-image {
    max-height: 70vh;
  }

  .close {
    font-size: 28px;
    right: 15px;
  }
}

无障碍访问改进

添加ARIA属性提升可访问性:

<div class="lightbox" id="lightbox" role="dialog" aria-hidden="true" aria-labelledby="lightbox-title">
  <div class="lightbox-content">
    <span class="close" role="button" aria-label="Close lightbox">&times;</span>
    <img src="" class="lightbox-image" id="lightbox-image" alt="Enlarged view">
  </div>
</div>

更新JavaScript:

function openLightbox(index) {
  const lightbox = document.getElementById('lightbox');
  lightbox.setAttribute('aria-hidden', 'false');
  // 其余代码...
}

function closeLightbox() {
  const lightbox = document.getElementById('lightbox');
  lightbox.setAttribute('aria-hidden', 'true');
  // 其余代码...
}

js实现灯箱

标签: 灯箱js
分享给朋友:

相关文章

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…