使用纯 HTML 和 CSS(最简单,适合轮播图)
这种方法利用了 HTML 的 <label> 和 <input type="radio"> 标签,通过 CSS 的 checked 伪类来控制图片的显示,优点是代码量少,无需 JavaScript,性能好。

(图片来源网络,侵删)
实现思路
- HTML结构:
- 创建一个容器
div包裹所有内容。 - 为每一张图片创建一个
<input type="radio">单选按钮,并给它们一个共同的name属性(slide)。 - 为每一张图片创建一个
<img>标签,并放在一个<label>标签内。label的for属性要对应其控制的单选按钮的id。 - 将所有图片
label放在一个容器内。
- 创建一个容器
- CSS样式:
- 默认情况下,隐藏所有图片 (
opacity: 0或display: 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">❮</a>
<a class="next">❯</a>
</div>
</body>
</html>
使用 JavaScript(最灵活,功能最强大)
这是最常用和最灵活的方法,可以实现自动播放、点击切换、淡入淡出、滑动等多种复杂效果。
实现思路
- HTML结构:
- 创建一个容器
div。 - 在容器内放置所有
<img>- (可选)创建“上一张”、“下一张”按钮和指示器。
- 创建一个容器
- CSS样式:
- 设置容器为
position: relative。 - 将所有图片设置为
position: absolute,这样它们会重叠在一起。 - 默认只显示第一张图片,其他的隐藏 (
display: none或opacity: 0)。 - 定义切换时的动画效果,例如淡入淡出 (
transition: opacity 0.5s ease)。
- 设置容器为
- 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">❮</button>
<button class="next">❯</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 框架,它的轮播组件是最佳选择。
实现思路:

(图片来源网络,侵删)
- 引入 Bootstrap 的 CSS 和 JS 文件。
- 按照 Bootstrap 的文档结构编写 HTML。
- 通过
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 是一个功能强大、高度可定制的现代轮播库,性能优异,尤其适合移动端。
实现思路:
- 引入 Swiper 的 CSS 和 JS 文件。
- 按照 Swiper 的文档结构编写 HTML。
- 初始化 Swiper。
示例代码:

(图片来源网络,侵删)
<!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 技巧练习。
