当前位置:首页 > 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代码

js实现灯箱

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:

js实现灯箱

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实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js防抖和节流实现

js防抖和节流实现

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

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…