纯 CSS 实现(最简单)

这种方法使用 CSS 的 hover 伪类,当鼠标悬停在缩略图上时,主图会改变,非常适合简单的、无需自动轮播的场景。

网页图片的切换效果代码
(图片来源网络,侵删)

核心思路:

  1. 一个主图容器。
  2. 多个缩略图。
  3. 为每个缩略图设置一个唯一的 id
  4. 使用 CSS 的 hover 选择器,当鼠标悬停在某个缩略图上时,通过 兄弟选择器找到主图并改变其 src

代码示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">CSS 图片切换</title>
<style>
    .gallery {
        width: 600px;
        margin: 50px auto;
        text-align: center;
    }
    /* 主图样式 */
    .main-image {
        width: 100%;
        height: 400px;
        background-color: #f0f0f0;
        margin-bottom: 20px;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 24px;
        color: #666;
        background-size: cover;
        background-position: center;
    }
    /* 缩略图列表样式 */
    .thumbnails {
        display: flex;
        justify-content: center;
        gap: 10px;
    }
    .thumb {
        width: 100px;
        height: 75px;
        cursor: pointer;
        border: 2px solid #ccc;
        background-size: cover;
        background-position: center;
        transition: border-color 0.3s ease;
    }
    /* 鼠标悬停效果 */
    /* 当鼠标悬停在第一个缩略图上时,改变主图的背景 */
    #thumb1:hover ~ .main-image {
        background-image: url('https://via.placeholder.com/600x400/FF5733/FFFFFF?text=Image+1');
    }
    #thumb2:hover ~ .main-image {
        background-image: url('https://via.placeholder.com/600x400/33FF57/FFFFFF?text=Image+2');
    }
    #thumb3:hover ~ .main-image {
        background-image: url('https://via.placeholder.com/600x400/3357FF/FFFFFF?text=Image+3');
    }
    #thumb4:hover ~ .main-image {
        background-image: url('https://via.placeholder.com/600x400/F333FF/FFFFFF?text=Image+4');
    }
    /* 当前选中的缩略图高亮 */
    .thumb.active {
        border-color: #007bff;
    }
</style>
</head>
<body>
<div class="gallery">
    <!-- 主图 -->
    <div class="main-image" id="mainImage"></div>
    <!-- 缩略图列表 -->
    <div class="thumbnails">
        <img id="thumb1" class="thumb active" src="https://via.placeholder.com/100x75/FF5733/FFFFFF?text=1" alt="缩略图 1">
        <img id="thumb2" class="thumb" src="https://via.placeholder.com/100x75/33FF57/FFFFFF?text=2" alt="缩略图 2">
        <img id="thumb3" class="thumb" src="https://via.placeholder.com/100x75/3357FF/FFFFFF?text=3" alt="缩略图 3">
        <img id="thumb4" class="thumb" src="https://via.placeholder.com/100x75/F333FF/FFFFFF?text=4" alt="缩略图 4">
    </div>
</div>
</body>
</html>

优点:

  • 代码量少,无需 JavaScript。
  • 性能好。

缺点:

网页图片的切换效果代码
(图片来源网络,侵删)
  • 功能有限,无法实现自动轮播。
  • 结构要求严格,主图和缩略图必须是兄弟元素。
  • 鼠标移开时效果消失。

JavaScript + CSS 实现(最常用、最灵活)

这是最主流的实现方式,可以轻松实现自动轮播、手动切换、过渡动画等各种复杂效果。

核心思路:

  1. HTML 结构:一个主图 <img> 和一个缩略图列表(可以是 <img><div>)。
  2. CSS 样式:定义基本布局和切换时的过渡动画效果。
  3. JavaScript 逻辑:
    • 获取所有需要用到的 DOM 元素(主图、缩略图、按钮等)。
    • 定义一个变量 currentIndex 来记录当前显示的图片索引。
    • 为缩略图绑定 click 事件,点击时更新 currentIndex 并改变主图。
    • 编写一个 changeImage() 函数,负责更新主图 src、缩略图高亮状态,并添加过渡动画。
    • 使用 setInterval 实现自动轮播功能。

代码示例(带自动轮播和过渡效果):

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">JS 图片切换</title>
<style>
    .slider-container {
        width: 800px;
        margin: 50px auto;
        position: relative;
        overflow: hidden; /* 隐藏溢出的部分,用于过渡效果 */
    }
    .main-image-wrapper {
        width: 100%;
        height: 450px;
        position: relative;
    }
    .main-image {
        width: 100%;
        height: 100%;
        object-fit: cover; /* 保证图片不变形 */
        /* 过渡效果 */
        transition: opacity 0.5s ease-in-out;
    }
    .thumbnails {
        display: flex;
        justify-content: center;
        gap: 10px;
        padding: 20px 0;
    }
    .thumb {
        width: 120px;
        height: 80px;
        cursor: pointer;
        border: 2px solid #ddd;
        opacity: 0.7;
        transition: all 0.3s ease;
        object-fit: cover;
    }
    .thumb:hover {
        opacity: 1;
        border-color: #007bff;
    }
    .thumb.active {
        border-color: #007bff;
        opacity: 1;
    }
    /* 左右箭头 */
    .arrow {
        position: absolute;
        top: 50%;
        transform: translateY(-50%);
        width: 50px;
        height: 50px;
        background-color: rgba(0, 0, 0, 0.5);
        color: white;
        text-align: center;
        line-height: 50px;
        font-size: 24px;
        cursor: pointer;
        user-select: none; /* 防止文字被选中 */
        transition: background-color 0.3s ease;
    }
    .arrow:hover {
        background-color: rgba(0, 0, 0, 0.8);
    }
    .arrow.prev {
        left: 10px;
    }
    .arrow.next {
        right: 10px;
    }
</style>
</head>
<body>
<div class="slider-container">
    <!-- 左箭头 -->
    <div class="arrow prev" id="prevBtn">&#10094;</div>
    <!-- 主图 -->
    <div class="main-image-wrapper">
        <img id="mainImage" class="main-image" src="https://via.placeholder.com/800x450/FF5733/FFFFFF?text=Image+1" alt="主图">
    </div>
    <!-- 右箭头 -->
    <div class="arrow next" id="nextBtn">&#10095;</div>
    <!-- 缩略图 -->
    <div class="thumbnails">
        <img class="thumb active" src="https://via.placeholder.com/120x80/FF5733/FFFFFF?text=1" data-index="0" alt="缩略图 1">
        <img class="thumb" src="https://via.placeholder.com/120x80/33FF57/FFFFFF?text=2" data-index="1" alt="缩略图 2">
        <img class="thumb" src="https://via.placeholder.com/120x80/3357FF/FFFFFF?text=3" data-index="2" alt="缩略图 3">
        <img class="thumb" src="https://via.placeholder.com/120x80/F333FF/FFFFFF?text=4" data-index="3" alt="缩略图 4">
        <img class="thumb" src="https://via.placeholder.com/120x80/FF33A1/FFFFFF?text=5" data-index="4" alt="缩略图 5">
    </div>
</div>
<script>
    // 图片数组
    const images = [
        'https://via.placeholder.com/800x450/FF5733/FFFFFF?text=Image+1',
        'https://via.placeholder.com/800x450/33FF57/FFFFFF?text=Image+2',
        'https://via.placeholder.com/800x450/3357FF/FFFFFF?text=Image+3',
        'https://via.placeholder.com/800x450/F333FF/FFFFFF?text=Image+4',
        'https://via.placeholder.com/800x450/FF33A1/FFFFFF?text=Image+5'
    ];
    // 获取DOM元素
    const mainImage = document.getElementById('mainImage');
    const thumbnails = document.querySelectorAll('.thumb');
    const prevBtn = document.getElementById('prevBtn');
    const nextBtn = document.getElementById('nextBtn');
    let currentIndex = 0;
    // 切换图片函数
    function changeImage(index) {
        // 淡出效果
        mainImage.style.opacity = 0;
        setTimeout(() => {
            // 更改图片源
            mainImage.src = images[index];
            currentIndex = index;
            // 更新缩略图高亮
            thumbnails.forEach(thumb => thumb.classList.remove('active'));
            thumbnails[index].classList.add('active');
            // 淡入效果
            mainImage.style.opacity = 1;
        }, 500); // 与CSS过渡时间匹配
    }
    // 为缩略图添加点击事件
    thumbnails.forEach(thumb => {
        thumb.addEventListener('click', function() {
            const index = parseInt(this.getAttribute('data-index'));
            changeImage(index);
        });
    });
    // 左箭头点击事件
    prevBtn.addEventListener('click', () => {
        const newIndex = currentIndex > 0 ? currentIndex - 1 : images.length - 1;
        changeImage(newIndex);
    });
    // 右箭头点击事件
    nextBtn.addEventListener('click', () => {
        const newIndex = currentIndex < images.length - 1 ? currentIndex + 1 : 0;
        changeImage(newIndex);
    });
    // 自动轮播
    let autoSlideInterval = setInterval(() => {
        const newIndex = currentIndex < images.length - 1 ? currentIndex + 1 : 0;
        changeImage(newIndex);
    }, 3000); // 每3秒切换一次
    // 鼠标悬停时暂停自动轮播
    const sliderContainer = document.querySelector('.slider-container');
    sliderContainer.addEventListener('mouseenter', () => {
        clearInterval(autoSlideInterval);
    });
    // 鼠标移出时恢复自动轮播
    sliderContainer.addEventListener('mouseleave', () => {
        autoSlideInterval = setInterval(() => {
            const newIndex = currentIndex < images.length - 1 ? currentIndex + 1 : 0;
            changeImage(newIndex);
        }, 3000);
    });
</script>
</body>
</html>

优点:

网页图片的切换效果代码
(图片来源网络,侵删)
  • 功能强大,可实现所有常见效果(手动、自动、过渡、暂停等)。
  • 逻辑清晰,易于维护和扩展。
  • 兼容性好。

缺点:

  • 需要编写 JavaScript 代码。

使用成熟的轮播图库(最高效)

如果你不希望从零开始编写,可以直接使用现成的轮播图库,它们经过了充分优化,功能丰富,且非常稳定。

推荐库:

  1. Swiper.js: 目前最流行、功能最强大的轮播图库之一,支持触摸滑动、无限循环、分页器、箭头等几乎所有你能想到的功能。
  2. Slick Carousel: 另一个非常受欢迎的库,以其流畅的动画和易用性著称。
  3. Bootstrap Carousel: 如果你已经在使用 Bootstrap 框架,可以直接使用其自带的轮播组件,非常方便。

示例:使用 Swiper.js

步骤 1:引入 Swiper 的 CSS 和 JS 文件 你可以从 Swiper 官网 下载文件,或者使用 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>

步骤 2:编写 HTML 结构

<div class="swiper mySwiper">
    <div class="swiper-wrapper">
        <div class="swiper-slide">
            <img src="https://via.placeholder.com/800x450/FF5733/FFFFFF?text=Swiper+1" alt="Slide 1">
        </div>
        <div class="swiper-slide">
            <img src="https://via.placeholder.com/800x450/33FF57/FFFFFF?text=Swiper+2" alt="Slide 2">
        </div>
        <div class="swiper-slide">
            <img src="https://via.placeholder.com/800x450/3357FF/FFFFFF?text=Swiper+3" alt="Slide 3">
        </div>
        <div class="swiper-slide">
            <img src="https://via.placeholder.com/800x450/F333FF/FFFFFF?text=Swiper+4" alt="Slide 4">
        </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>

步骤 3:编写 CSS 和初始化 Swiper

<style>
    .swiper {
        width: 800px;
        height: 450px;
        margin: 50px auto;
    }
    .swiper-slide img {
        display: block;
        width: 100%;
        height: 100%;
        object-fit: cover;
    }
</style>
<script>
    // 初始化 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>

优点:

  • 开发效率极高,几行代码就能实现专业效果。
  • 功能强大,性能经过优化。
  • 支持触摸设备、响应式设计等。
  • 社区庞大,文档和示例丰富。

缺点:

  • 需要引入外部库,会增加页面体积(通常可以接受)。

总结与选择建议

方案 优点 缺点 适用场景
纯 CSS 无需 JS,代码少,性能好 功能极其有限,结构要求死板 非常简单的图片列表,只需悬停切换
JS + CSS 功能灵活,可定制性强,是行业标准 需要自己编写和维护 JS 代码 大多数网站的自定义轮播图、画廊需求
轮播图库 开发效率高,功能强大,稳定可靠 引入外部库,增加体积 快速开发、对功能要求高的商业项目

给你的建议:

  • 新手学习或简单需求:从 方案二(JS + CSS) 开始,它能帮助你理解轮播图的核心逻辑。
  • 商业项目或追求效率:直接使用 方案三(Swiper.js),它能让你专注于业务逻辑,而不是重复造轮子。
  • 追求极致性能且功能极简:可以考虑 方案一(纯 CSS),但这种情况非常少见。