当前位置:首页 > 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中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js轮播图实现原理

js轮播图实现原理

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

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…