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

(图片来源网络,侵删)
核心思路:
- 一个主图容器。
- 多个缩略图。
- 为每个缩略图设置一个唯一的
id。 - 使用 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 实现(最常用、最灵活)
这是最主流的实现方式,可以轻松实现自动轮播、手动切换、过渡动画等各种复杂效果。
核心思路:
- HTML 结构:一个主图
<img>和一个缩略图列表(可以是<img>或<div>)。 - CSS 样式:定义基本布局和切换时的过渡动画效果。
- 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">❮</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">❯</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 代码。
使用成熟的轮播图库(最高效)
如果你不希望从零开始编写,可以直接使用现成的轮播图库,它们经过了充分优化,功能丰富,且非常稳定。
推荐库:
- Swiper.js: 目前最流行、功能最强大的轮播图库之一,支持触摸滑动、无限循环、分页器、箭头等几乎所有你能想到的功能。
- Slick Carousel: 另一个非常受欢迎的库,以其流畅的动画和易用性著称。
- 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),但这种情况非常少见。
