使用纯 HTML 和 CSS(最简单,适合轮播图)

这种方法利用了 HTML 的 <label><input type="radio"> 标签,通过 CSS 的 checked 伪类来控制图片的显示,优点是代码量少,无需 JavaScript,性能好。

网页制作切换图片效果html
(图片来源网络,侵删)

实现思路

  1. HTML结构:
    • 创建一个容器 div 包裹所有内容。
    • 为每一张图片创建一个 <input type="radio"> 单选按钮,并给它们一个共同的 name 属性(slide)。
    • 为每一张图片创建一个 <img> 标签,并放在一个 <label> 标签内。labelfor 属性要对应其控制的单选按钮的 id
    • 将所有图片 label 放在一个容器内。
  2. CSS样式:
    • 默认情况下,隐藏所有图片 (opacity: 0display: none)。
    • 当某个单选按钮被选中时 (input[type="radio"]:checked),其对应的 label 中的图片显示出来 (opacity: 1)。
    • 使用 transition 属性让切换效果更平滑。

完整代码示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">CSS 图片切换效果</title>
    <style>
        /* 基础样式 */
        body {
            font-family: sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
        }
        /* 图片轮播容器 */
        .slideshow-container {
            position: relative;
            max-width: 800px;
            max-height: 450px;
            overflow: hidden;
            box-shadow: 0 4px 8px rgba(0,0,0,0.2);
            border-radius: 8px;
        }
        /* 图片容器 */
        .slides {
            display: flex;
            transition: transform 0.5s ease-in-out; /* 关键:平滑切换 */
        }
        .slide {
            min-width: 100%;
            height: 450px;
        }
        .slide img {
            width: 100%;
            height: 100%;
            object-fit: cover; /* 保持图片比例并填满容器 */
        }
        /* 单选按钮控制切换 */
        .slide-control {
            position: absolute;
            bottom: 20px;
            left: 50%;
            transform: translateX(-50%);
            display: flex;
            gap: 10px;
        }
        .slide-control input[type="radio"] {
            display: none; /* 隐藏原始按钮 */
        }
        .slide-control label {
            width: 15px;
            height: 15px;
            border-radius: 50%;
            background-color: rgba(255, 255, 255, 0.5);
            cursor: pointer;
            transition: background-color 0.3s ease;
        }
        /* 当对应的单选按钮被选中时,显示对应的图片 */
        #slide1:checked ~ .slides .slide:nth-child(1),
        #slide2:checked ~ .slides .slide:nth-child(2),
        #slide3:checked ~ .slides .slide:nth-child(3) {
            opacity: 1;
        }
        /* 通用图片隐藏,只显示被选中的 */
        .slide {
            opacity: 0;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
        }
        /* 指示器样式变化 */
        #slide1:checked ~ .slide-control label[for="slide1"],
        #slide2:checked ~ .slide-control label[for="slide2"],
        #slide3:checked ~ .slide-control label[for="slide3"] {
            background-color: white;
        }
        /* 左右箭头样式 (可选) */
        .prev, .next {
            cursor: pointer;
            position: absolute;
            top: 50%;
            width: auto;
            margin-top: -22px;
            padding: 16px;
            color: white;
            font-weight: bold;
            font-size: 18px;
            border: none;
            background-color: rgba(0,0,0,0.3);
            user-select: none;
            transition: background-color 0.3s ease;
        }
        .next {
            right: 0;
            border-radius: 3px 0 0 3px;
        }
        .prev {
            left: 0;
            border-radius: 0 3px 3px 0;
        }
        .prev:hover, .next:hover {
            background-color: rgba(0,0,0,0.8);
        }
    </style>
</head>
<body>
    <div class="slideshow-container">
        <!-- 单选按钮,用于控制切换 -->
        <input type="radio" name="slide" id="slide1" checked>
        <input type="radio" name="slide" id="slide2">
        <input type="radio" name="slide" id="slide3">
        <!-- 图片容器 -->
        <div class="slides">
            <div class="slide">
                <img src="https://picsum.photos/seed/slide1/800/450.jpg" alt="图片 1">
            </div>
            <div class="slide">
                <img src="https://picsum.photos/seed/slide2/800/450.jpg" alt="图片 2">
            </div>
            <div class="slide">
                <img src="https://picsum.photos/seed/slide3/800/450.jpg" alt="图片 3">
            </div>
        </div>
        <!-- 底部指示器 -->
        <div class="slide-control">
            <label for="slide1"></label>
            <label for="slide2"></label>
            <label for="slide3"></label>
        </div>
        <!-- 左右箭头 (可选) -->
        <a class="prev">&#10094;</a>
        <a class="next">&#10095;</a>
    </div>
</body>
</html>

使用 JavaScript(最灵活,功能最强大)

这是最常用和最灵活的方法,可以实现自动播放、点击切换、淡入淡出、滑动等多种复杂效果。

实现思路

  1. HTML结构:
    • 创建一个容器 div
    • 在容器内放置所有 <img>
    • (可选)创建“上一张”、“下一张”按钮和指示器。
  2. CSS样式:
    • 设置容器为 position: relative
    • 将所有图片设置为 position: absolute,这样它们会重叠在一起。
    • 默认只显示第一张图片,其他的隐藏 (display: noneopacity: 0)。
    • 定义切换时的动画效果,例如淡入淡出 (transition: opacity 0.5s ease)。
  3. JavaScript逻辑:
    • 获取所有图片元素和按钮元素。
    • 定义一个变量 currentIndex 来追踪当前显示的是哪张图片。
    • 编写一个切换函数 showSlide(index)
      • 隐藏所有图片。
      • 显示 index 对应的图片。
      • 更新 currentIndex 的值。
      • (可选)更新指示器的状态。
    • 为“上一张”、“下一张”按钮和指示器绑定点击事件,调用 showSlide 函数。
    • (可选)使用 setInterval 实现自动播放。

完整代码示例(带自动播放和淡入淡出效果)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">JavaScript 图片切换效果</title>
    <style>
        body {
            font-family: sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
        }
        .slideshow-container {
            position: relative;
            max-width: 800px;
            max-height: 450px;
            overflow: hidden;
            box-shadow: 0 4px 8px rgba(0,0,0,0.2);
            border-radius: 8px;
        }
        .slide {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            opacity: 0; /* 默认隐藏 */
            transition: opacity 1s ease-in-out; /* 淡入淡出效果 */
        }
        .slide.active {
            opacity: 1; /* 显示当前图片 */
        }
        .slide img {
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
        /* 按钮样式 */
        .prev, .next {
            cursor: pointer;
            position: absolute;
            top: 50%;
            width: auto;
            margin-top: -22px;
            padding: 16px;
            color: white;
            font-weight: bold;
            font-size: 18px;
            background-color: rgba(0,0,0,0.3);
            border: none;
            user-select: none;
            transition: 0.3s ease;
        }
        .next {
            right: 0;
            border-radius: 3px 0 0 3px;
        }
        .prev {
            left: 0;
            border-radius: 0 3px 3px 0;
        }
        .prev:hover, .next:hover {
            background-color: rgba(0,0,0,0.8);
        }
        /* 指示器样式 */
        .dots-container {
            position: absolute;
            bottom: 15px;
            left: 50%;
            transform: translateX(-50%);
            display: flex;
            gap: 10px;
        }
        .dot {
            height: 12px;
            width: 12px;
            margin: 0 5px;
            background-color: rgba(255, 255, 255, 0.5);
            border-radius: 50%;
            display: inline-block;
            cursor: pointer;
            transition: background-color 0.3s ease;
        }
        .dot.active, .dot:hover {
            background-color: white;
        }
    </style>
</head>
<body>
    <div class="slideshow-container">
        <!-- 图片 -->
        <div class="slide active">
            <img src="https://picsum.photos/seed/js1/800/450.jpg" alt="图片 1">
        </div>
        <div class="slide">
            <img src="https://picsum.photos/seed/js2/800/450.jpg" alt="图片 2">
        </div>
        <div class="slide">
            <img src="https://picsum.photos/seed/js3/800/450.jpg" alt="图片 3">
        </div>
        <!-- 左右箭头 -->
        <button class="prev">&#10094;</button>
        <button class="next">&#10095;</button>
        <!-- 指示器 -->
        <div class="dots-container">
            <span class="dot active" data-index="0"></span>
            <span class="dot" data-index="1"></span>
            <span class="dot" data-index="2"></span>
        </div>
    </div>
    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const slides = document.querySelectorAll('.slide');
            const prevButton = document.querySelector('.prev');
            const nextButton = document.querySelector('.next');
            const dots = document.querySelectorAll('.dot');
            let currentIndex = 0;
            let slideInterval;
            // 显示指定索引的幻灯片
            function showSlide(index) {
                // 移除所有图片和指示器的 'active' 类
                slides.forEach(slide => slide.classList.remove('active'));
                dots.forEach(dot => dot.classList.remove('active'));
                // 如果索引超出范围,则循环
                if (index >= slides.length) { currentIndex = 0; }
                if (index < 0) { currentIndex = slides.length - 1; }
                // 为当前图片和指示器添加 'active' 类
                slides[currentIndex].classList.add('active');
                dots[currentIndex].classList.add('active');
            }
            // 显示下一张
            function nextSlide() {
                currentIndex++;
                showSlide(currentIndex);
            }
            // 显示上一张
            function prevSlide() {
                currentIndex--;
                showSlide(currentIndex);
            }
            // 自动播放
            function startSlideShow() {
                slideInterval = setInterval(nextSlide, 3000); // 每3秒切换一次
            }
            // 停止自动播放
            function stopSlideShow() {
                clearInterval(slideInterval);
            }
            // 事件监听
            nextButton.addEventListener('click', () => {
                nextSlide();
                stopSlideShow(); // 点击后停止自动播放
                startSlideShow(); // 重新开始自动播放
            });
            prevButton.addEventListener('click', () => {
                prevSlide();
                stopSlideShow();
                startSlideShow();
            });
            // 点击指示器切换到对应图片
            dots.forEach(dot => {
                dot.addEventListener('click', function() {
                    currentIndex = parseInt(this.getAttribute('data-index'));
                    showSlide(currentIndex);
                    stopSlideShow();
                    startSlideShow();
                });
            });
            // 鼠标悬停在轮播图上时停止自动播放
            const slideshowContainer = document.querySelector('.slideshow-container');
            slideshowContainer.addEventListener('mouseenter', stopSlideShow);
            slideshowContainer.addEventListener('mouseleave', startSlideShow);
            // 启动自动播放
            startSlideShow();
        });
    </script>
</body>
</html>

使用现成的库(最快,适合快速开发)

在实际项目中,我们通常会使用成熟的库来处理这类效果,因为它们经过了大量优化,兼容性好,功能丰富且易于使用。

Bootstrap Carousel (Bootstrap 自带)

如果你已经在使用 Bootstrap 框架,它的轮播组件是最佳选择。

实现思路:

网页制作切换图片效果html
(图片来源网络,侵删)
  1. 引入 Bootstrap 的 CSS 和 JS 文件。
  2. 按照 Bootstrap 的文档结构编写 HTML。
  3. 通过 data-bs-ride="carousel" 属性即可实现自动播放。

示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">Bootstrap 轮播图</title>
    <!-- 引入 Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
        body { padding: 50px; }
        .carousel-item img {
            width: 100%;
            height: 450px;
            object-fit: cover;
        }
    </style>
</head>
<body>
<div id="myCarousel" class="carousel slide" data-bs-ride="carousel">
    <!-- 指示器 -->
    <div class="carousel-indicators">
        <button type="button" data-bs-target="#myCarousel" data-bs-slide-to="0" class="active"></button>
        <button type="button" data-bs-target="#myCarousel" data-bs-slide-to="1"></button>
        <button type="button" data-bs-target="#myCarousel" data-bs-slide-to="2"></button>
    </div>
    <!-- 轮播图片 -->
    <div class="carousel-inner">
        <div class="carousel-item active">
            <img src="https://picsum.photos/seed/bootstrap1/800/450.jpg" class="d-block w-100" alt="...">
        </div>
        <div class="carousel-item">
            <img src="https://picsum.photos/seed/bootstrap2/800/450.jpg" class="d-block w-100" alt="...">
        </div>
        <div class="carousel-item">
            <img src="https://picsum.photos/seed/bootstrap3/800/450.jpg" class="d-block w-100" alt="...">
        </div>
    </div>
    <!-- 左右切换按钮 -->
    <button class="carousel-control-prev" type="button" data-bs-target="#myCarousel" data-bs-slide="prev">
        <span class="carousel-control-prev-icon"></span>
    </button>
    <button class="carousel-control-next" type="button" data-bs-target="#myCarousel" data-bs-slide="next">
        <span class="carousel-control-next-icon"></span>
    </button>
</div>
<!-- 引入 Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

Swiper (非常流行的独立轮播库)

Swiper 是一个功能强大、高度可定制的现代轮播库,性能优异,尤其适合移动端。

实现思路:

  1. 引入 Swiper 的 CSS 和 JS 文件。
  2. 按照 Swiper 的文档结构编写 HTML。
  3. 初始化 Swiper。

示例代码:

网页制作切换图片效果html
(图片来源网络,侵删)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">Swiper 轮播图</title>
    <!-- 引入 Swiper CSS -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@10/swiper-bundle.min.css"/>
    <style>
        body { padding: 50px; }
        .swiper {
            width: 800px;
            height: 450px;
        }
        .swiper-slide img {
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
    </style>
</head>
<body>
<!-- Swiper -->
<div class="swiper mySwiper">
    <div class="swiper-wrapper">
        <div class="swiper-slide">
            <img src="https://picsum.photos/seed/swiper1/800/450.jpg">
        </div>
        <div class="swiper-slide">
            <img src="https://picsum.photos/seed/swiper2/800/450.jpg">
        </div>
        <div class="swiper-slide">
            <img src="https://picsum.photos/seed/swiper3/800/450.jpg">
        </div>
    </div>
    <!-- 如果需要分页器 -->
    <div class="swiper-pagination"></div>
    <!-- 如果需要导航按钮 -->
    <div class="swiper-button-next"></div>
    <div class="swiper-button-prev"></div>
    <!-- 如果需要滚动条 -->
    <div class="swiper-scrollbar"></div>
</div>
<!-- 引入 Swiper JS -->
<script src="https://cdn.jsdelivr.net/npm/swiper@10/swiper-bundle.min.js"></script>
<!-- 初始化 Swiper -->
<script>
    var swiper = new Swiper(".mySwiper", {
        loop: true, // 循环模式
        pagination: {
            el: ".swiper-pagination",
            clickable: true,
        },
        navigation: {
            nextEl: ".swiper-button-next",
            prevEl: ".swiper-button-prev",
        },
        autoplay: {
            delay: 2500,
            disableOnInteraction: false,
        },
    });
</script>
</body>
</html>

总结与选择建议

方法 优点 缺点 适用场景
纯 CSS 代码量少,无 JS 依赖,性能好 功能有限,无法实现自动播放、复杂交互 简单的、手动的图片切换,对性能要求极高的场景
JavaScript 灵活、强大,可实现所有功能 需要自己编写和维护 JS 代码 大多数自定义需求的网页,是前端开发的主流选择
Bootstrap Carousel 快速集成,样式统一,文档完善 依赖整个 Bootstrap 框架,样式定制受限 已经在使用或计划使用 Bootstrap 的项目
Swiper 功能最全,性能优异,高度可定制,移动端友好 需要引入第三方库 功能要求高的轮播图,尤其是复杂交互和移动端应用

对于初学者,建议先学习方法二(JavaScript),因为它能帮助你理解图片切换的核心逻辑,对于实际项目,根据项目需求选择方法三(库)会更高效,方法一(纯 CSS)则是一个很好的 CSS 技巧练习。