核心思路

无论使用哪种技术,实现图片自动播放的核心思路都是一样的:

  1. HTML结构:准备一个容器,里面包含所有要播放的图片。
  2. CSS样式
    • 将所有图片重叠在一起。
    • 默认只显示第一张图片。
    • 为“下一张”的图片准备一个切换的样式(通过改变透明度或位置来实现淡入淡出/滑动效果)。
  3. JavaScript逻辑
    • 设置一个定时器setInterval),每隔几秒就执行一次切换函数。
    • 切换函数的功能是:隐藏当前显示的图片,显示下一张图片。
    • 当播放到最后一张图片时,要能循环回到第一张。

纯 JavaScript 实现(基础版)

这是最直接、最能理解原理的方法,我们将实现一个简单的淡入淡出效果。

HTML 结构

创建一个 div 作为图片容器,里面放 img 标签,为了方便 JS 操作,给每个 img 加上 class

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">图片自动播放 - 基础版</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>图片轮播</h1>
    <div class="slideshow-container">
        <img src="https://picsum.photos/800/400?random=1" class="slide" alt="图片1">
        <img src="https://picsum.photos/800/400?random=2" class="slide" alt="图片2">
        <img src="https://picsum.photos/800/400?random=3" class="slide" alt="图片3">
        <img src="https://picsum.photos/800/400?random=4" class="slide" alt="图片4">
    </div>
    <script src="script.js"></script>
</body>
</html>

CSS 样式

关键点:将所有图片设为绝对定位,并让它们重叠,然后默认只显示第一张。

/* style.css */
body {
    font-family: sans-serif;
    text-align: center;
}
.slideshow-container {
    position: relative; /* 相对定位,作为绝对定位图片的参考 */
    max-width: 800px;
    margin: auto;
    overflow: hidden; /* 隐藏超出容器的部分 */
}
.slide {
    position: absolute; /* 绝对定位,使所有图片重叠 */
    top: 0;
    left: 0;
    width: 100%;
    opacity: 0; /* 默认所有图片都透明 */
    transition: opacity 1.5s ease-in-out; /* 添加淡入淡出效果 */
}
/* 只显示第一张图片 */
.slide:first-child {
    opacity: 1;
}

JavaScript 逻辑

设置定时器,每隔几秒切换一次图片的 opacity

// script.js
let currentSlide = 0;
const slides = document.querySelectorAll('.slide');
const totalSlides = slides.length;
function showSlide(index) {
    // 隐藏所有图片
    slides.forEach(slide => {
        slide.style.opacity = '0';
    });
    // 显示当前索引的图片
    slides[index].style.opacity = '1';
}
function nextSlide() {
    currentSlide++;
    if (currentSlide >= totalSlides) {
        currentSlide = 0; // 循环到第一张
    }
    showSlide(currentSlide);
}
// 设置定时器,每3秒切换一次
setInterval(nextSlide, 3000);

使用第三方库(推荐)

在实际开发中,我们通常会使用成熟的轮播图库,因为它们功能强大、兼容性好、易于定制,并且能处理很多边缘情况(如触摸滑动、响应式布局等)。

最流行的库是 Swiper.js

引入库

你可以通过 CDN 直接引入,非常方便。

<!-- Swiper CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@10/swiper-bundle.min.css"/>
<!-- Swiper JS -->
<script src="https://cdn.jsdelivr.net/npm/swiper@10/swiper-bundle.min.js"></script>

HTML 结构

Swiper 有其固定的 HTML 结构,你需要按照它的规范来写。

<div class="swiper mySwiper">
    <div class="swiper-wrapper">
        <div class="swiper-slide">
            <img src="https://picsum.photos/800/400?random=1" alt="图片1">
        </div>
        <div class="swiper-slide">
            <img src="https://picsum.photos/800/400?random=2" alt="图片2">
        </div>
        <div class="swiper-slide">
            <img src="https://picsum.photos/800/400?random=3" alt="图片3">
        </div>
        <div class="swiper-slide">
            <img src="https://picsum.photos/800/400?random=4" alt="图片4">
        </div>
    </div>
    <!-- 如果需要分页器 -->
    <div class="swiper-pagination"></div>
    <!-- 如果需要导航按钮 -->
    <div class="swiper-button-next"></div>
    <div class="swiper-button-prev"></div>
</div>

JavaScript 初始化

只需几行代码就能创建一个功能丰富的轮播图。

// 只需初始化一次 Swiper
new Swiper(".mySwiper", {
    loop: true, // 循环模式
    autoplay: {
        delay: 2500, // 自动切换的时间间隔(毫秒)
        disableOnInteraction: false, // 用户操作后是否停止自动播放
    },
    pagination: {
        el: ".swiper-pagination",
        clickable: true,
    },
    navigation: {
        nextEl: ".swiper-button-next",
        prevEl: ".swiper-button-prev",
    },
});

优点

  • 功能强大:自动播放、循环、触摸滑动、分页器、导航按钮、懒加载等应有尽有。
  • 高度可定制:通过简单的参数就能改变行为和外观。
  • 响应式:默认支持各种屏幕尺寸。
  • 性能好:经过大量项目优化。

使用 CSS @keyframes 动画(纯CSS,无JS)

如果需求非常简单,只需要一个无限循环的滑动效果,可以用纯 CSS 实现,但这种方法灵活性较差,比如很难实现“暂停/播放”或“点击切换”。

HTML 和 CSS

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">图片自动播放 - 纯CSS</title>
    <style>
        .slideshow-container {
            width: 800px;
            height: 400px;
            overflow: hidden;
            position: relative;
            margin: auto;
        }
        .slideshow-wrapper {
            display: flex;
            width: 400%; /* 图片数量的 400% (4 * 100%) */
            animation: slideshow 12s infinite;
        }
        .slide {
            width: 25%; /* 容器宽度的 25% (100% / 4) */
            height: 100%;
        }
        .slide img {
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
        /* 核心动画:每3秒切换一次,共4张图片,所以总时长是 3s * 4 = 12s */
        @keyframes slideshow {
            0% { transform: translateX(0); }
            25% { transform: translateX(-25%); }
            50% { transform: translateX(-50%); }
            75% { transform: translateX(-75%); }
            100% { transform: translateX(0); }
        }
    </style>
</head>
<body>
    <h1>纯CSS轮播图</h1>
    <div class="slideshow-container">
        <div class="slideshow-wrapper">
            <div class="slide"><img src="https://picsum.photos/800/400?random=1" alt="图片1"></div>
            <div class="slide"><img src="https://picsum.photos/800/400?random=2" alt="图片2"></div>
            <div class="slide"><img src="https://picsum.photos/800/400?random=3" alt="图片3"></div>
            <div class="slide"><img src="https://picsum.photos/800/400?random=4" alt="图片4"></div>
        </div>
    </div>
</body>
</html>

总结与对比

特性 纯 JavaScript 第三方库 (如 Swiper) 纯 CSS
实现复杂度 中等,需要自己写逻辑 ,几行代码搞定 低,但需要理解CSS动画
功能丰富度 基础,需自行扩展 极高,开箱即用 极低,功能有限
灵活性 高,可完全自定义 高,提供大量配置选项 低,难以动态修改
性能 良好 优秀,经过优化 良好
适用场景 学习、简单项目、有特殊定制需求 绝大多数商业项目 超简单、无需交互的装饰性场景

给你的建议

  • 如果你是初学者:从方法一(纯JavaScript)开始,可以帮助你理解轮播图的核心原理。
  • 如果你在做实际项目:强烈推荐使用方法二(Swiper.js),它能帮你节省大量开发时间,并提供稳定、专业的用户体验。
  • 如果你只需要一个非常简单的、纯装饰性的动画:可以考虑方法三(纯CSS)