使用原生 HTML, CSS 和 JavaScript (最基础)

这是最直接、最轻量级的方法,不需要引入任何外部库,它通过创建一个覆盖全屏的半透明遮罩层和一个居中显示的弹窗内容来实现。

网页中点击图片弹窗源码
(图片来源网络,侵删)

特点:

  • 优点:无依赖,代码量少,加载速度快。
  • 缺点:功能相对简单,如果需要更复杂的效果(如动画、滑动、缩放等),需要自己编写更多 CSS 和 JavaScript。

完整源码示例

你可以直接将以下代码保存为一个 .html 文件,然后用浏览器打开即可看到效果。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">原生图片弹窗示例</title>
    <style>
        /* 基础样式 */
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            padding: 50px;
        }
        /* 图片样式 */
        .gallery img {
            width: 200px;
            height: 150px;
            object-fit: cover; /* 保证图片不变形 */
            margin: 10px;
            cursor: pointer;
            border: 2px solid #ddd;
            transition: border-color 0.3s;
        }
        .gallery img:hover {
            border-color: #007bff;
        }
        /* 遮罩层样式 */
        .modal-overlay {
            display: none; /* 默认隐藏 */
            position: fixed; /* 固定定位 */
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0, 0, 0, 0.7); /* 半透明黑色背景 */
            z-index: 1000; /* 确保在最上层 */
            justify-content: center; /* 水平居中 */
            align-items: center; /* 垂直居中 */
        }
        /* 弹窗内容样式 */
        .modal-content {
            position: relative;
            max-width: 90%;
            max-height: 90%;
        }
        .modal-content img {
            max-width: 100%;
            max-height: 90vh;
            border-radius: 8px;
            box-shadow: 0 4px 20px rgba(0,0,0,0.5);
        }
        /* 关闭按钮样式 */
        .close-btn {
            position: absolute;
            top: -40px;
            right: 0;
            color: white;
            font-size: 30px;
            font-weight: bold;
            cursor: pointer;
            transition: color 0.3s;
        }
        .close-btn:hover {
            color: #ccc;
        }
    </style>
</head>
<body>
    <h1>点击图片查看大图</h1>
    <p>使用原生 JavaScript 实现的弹窗效果</p>
    <div class="gallery">
        <img src="https://via.placeholder.com/200x150?text=图片1" alt="图片1">
        <img src="https://via.placeholder.com/200x150?text=图片2" alt="图片2">
        <img src="https://via.placeholder.com/200x150?text=图片3" alt="图片3">
    </div>
    <!-- 弹窗遮罩层和内容 -->
    <div class="modal-overlay" id="imageModal">
        <div class="modal-content">
            <span class="close-btn">&times;</span>
            <img id="modalImage" src="" alt="大图预览">
        </div>
    </div>
    <script>
        // 获取DOM元素
        const modal = document.getElementById('imageModal');
        const modalImg = document.getElementById('modalImage');
        const closeBtn = document.querySelector('.close-btn');
        const galleryImages = document.querySelectorAll('.gallery img');
        // 为每张图片添加点击事件
        galleryImages.forEach(img => {
            img.addEventListener('click', function() {
                // 点击图片时,将图片的src赋值给弹窗内的img
                modal.style.display = "flex"; // 显示遮罩层
                modalImg.src = this.src;
            });
        });
        // 点击关闭按钮时,隐藏弹窗
        closeBtn.addEventListener('click', function() {
            modal.style.display = "none";
        });
        // 点击遮罩层(非图片区域)时,也隐藏弹窗
        modal.addEventListener('click', function(event) {
            // 如果点击的是遮罩层本身(而不是弹窗内容)
            if (event.target === modal) {
                modal.style.display = "none";
            }
        });
        // 按 ESC 键也可以关闭弹窗
        document.addEventListener('keydown', function(event) {
            if (event.key === 'Escape') {
                modal.style.display = "none";
            }
        });
    </script>
</body>
</html>

使用 Lightbox2 库 (功能强大,推荐)

Lightbox2 是一个非常流行的、专门用于图片弹窗的 JavaScript 库,它提供了丰富的功能,如图片组导航、缩放、视频支持、动画效果等,并且对移动端有很好的支持。

特点:

  • 优点:功能强大,效果专业,易于使用,有大量现成的主题和插件。
  • 缺点:需要引入外部 CSS 和 JS 文件,会增加页面体积。

实现步骤

  1. 引入文件:从 Lightbox2 官网 下载文件,或者使用 CDN。
  2. 准备HTML:给需要弹窗的图片添加特定的 data-lightbox 属性。
  3. 初始化:在页面底部引入 Lightbox 的 JS 文件。

完整源码示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">Lightbox2 图片弹窗示例</title>
    <!-- 1. 引入 Lightbox2 的 CSS 文件 -->
    <link href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/css/lightbox.min.css" rel="stylesheet" />
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            padding: 50px;
        }
        .gallery img {
            width: 200px;
            height: 150px;
            object-fit: cover;
            margin: 10px;
            cursor: pointer;
            border: 2px solid #ddd;
        }
    </style>
</head>
<body>
    <h1>使用 Lightbox2 实现图片弹窗</h1>
    <p>点击图片可以体验导航、缩放等功能。</p>
    <div class="gallery">
        <!-- 2. 给图片添加 data-lightbox 属性 -->
        <!-- 如果是图片组,给它们设置相同的 data-lightbox 值,"mygallery" -->
        <a href="https://picsum.photos/seed/lightbox1/1200/800.jpg" data-lightbox="mygallery" data-title="图片标题 1">
            <img src="https://picsum.photos/seed/lightbox1/200/150.jpg" alt="缩略图1">
        </a>
        <a href="https://picsum.photos/seed/lightbox2/1200/800.jpg" data-lightbox="mygallery" data-title="图片标题 2">
            <img src="https://picsum.photos/seed/lightbox2/200/150.jpg" alt="缩略图2">
        </a>
        <a href="https://picsum.photos/seed/lightbox3/1200/800.jpg" data-lightbox="mygallery" data-title="图片标题 3">
            <img src="https://picsum.photos/seed/lightbox3/200/150.jpg" alt="缩略图3">
        </a>
    </div>
    <!-- 3. 引入 Lightbox2 的 JS 文件,放在 body 底部 -->
    <!-- 注意:jQuery 是 Lightbox2 的一个依赖项 -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/js/lightbox.min.js"></script>
</body>
</html>

使用 Bootstrap 模态框 (如果你已经在用 Bootstrap)

如果你的项目已经使用了 Bootstrap 框架,那么使用它的模态框组件是最佳选择,它与整个 UI 体系无缝集成,样式统一,且响应式支持良好。

特点:

  • 优点:与 Bootstrap 生态完美融合,响应式设计,可定制性强。
  • 缺点:需要引入整个 Bootstrap 框架,对于只想实现一个弹窗功能的页面来说可能过于“重”。

完整源码示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">Bootstrap 模态框图片弹窗示例</title>
    <!-- 1. 引入 Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
        body {
            padding: 50px;
        }
        .gallery img {
            width: 200px;
            height: 150px;
            object-fit: cover;
            margin: 10px;
            cursor: pointer;
            border: 2px solid #ddd;
        }
    </style>
</head>
<body>
    <h1>使用 Bootstrap 模态框实现图片弹窗</h1>
    <div class="gallery">
        <!-- 2. 使用 data-bs-toggle 和 data-bs-target 来触发模态框 -->
        <img src="https://picsum.photos/seed/bootstrap1/1200/800.jpg" alt="图片1" data-bs-toggle="modal" data-bs-target="#imageModal">
        <img src="https://picsum.photos/seed/bootstrap2/1200/800.jpg" alt="图片2" data-bs-toggle="modal" data-bs-target="#imageModal">
        <img src="https://picsum.photos/seed/bootstrap3/1200/800.jpg" alt="图片3" data-bs-toggle="modal" data-bs-target="#imageModal">
    </div>
    <!-- 3. 定义模态框的 HTML 结构 -->
    <div class="modal fade" id="imageModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
        <div class="modal-dialog modal-dialog-centered modal-lg">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="exampleModalLabel">图片预览</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <!-- 动态图片将显示在这里 -->
                    <img id="bootstrapModalImage" src="" class="img-fluid" alt="大图预览">
                </div>
            </div>
        </div>
    </div>
    <!-- 4. 引入 Bootstrap JS (包含 Popper) -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
    <script>
        // 获取模态框和图片元素
        const imageModal = new bootstrap.Modal(document.getElementById('imageModal'));
        const modalImage = document.getElementById('bootstrapModalImage');
        const triggerImages = document.querySelectorAll('.gallery img');
        // 为所有触发图片添加点击事件
        triggerImages.forEach(img => {
            img.addEventListener('click', function() {
                // 点击时,将 src 赋值给模态框内的图片
                modalImage.src = this.src;
                // 显示模态框
                imageModal.show();
            });
        });
    </script>
</body>
</html>

总结与如何选择

方案 优点 缺点 适用场景
原生 JS 无依赖,轻量,灵活 功能简单,需自己处理细节 简单的个人博客、小型项目、学习目的
Lightbox2 功能强大(导航、缩放等),效果好,移动端友好 需要引入外部文件,增加体积 专业图片画廊、作品集、需要丰富交互效果的网站
Bootstrap 与框架集成度高,响应式,样式统一 需要引入整个 Bootstrap 框架 已经在使用 Bootstrap 的项目中,追求快速开发和风格统一

对于大多数需求,方案一(原生JS)足以应对,如果你需要更专业、更丰富的图片浏览体验,方案二(Lightbox2)是绝佳选择,如果你的项目栈是 Bootstrap,那么方案三无疑是最高效的。

网页中点击图片弹窗源码
(图片来源网络,侵删)
网页中点击图片弹窗源码
(图片来源网络,侵删)