JSP 的主要作用是生成最终的 HTML 页面,并将动态数据(比如图片的 URL 列表)嵌入到页面中,而滑动切换的“魔法”则发生在用户的浏览器里。

(图片来源网络,侵删)
下面我将为你介绍几种主流的实现方式,从最简单到最专业,并附上详细的代码示例。
核心思路
无论使用哪种方法,核心思路都是一样的:
- HTML (结构):创建一个容器,里面包含所有需要展示的图片。
- CSS (样式):隐藏容器溢出的部分,让所有图片在一行内横向排列,或者通过绝对定位堆叠在一起。
- JavaScript (行为):监听用户的操作(如点击左右箭头、触摸滑动、自动播放定时器),然后通过改变容器的
transform: translateX()或left属性,来移动图片,实现切换效果。
纯原生 JavaScript 实现(最灵活,适合学习)
这种方法不依赖任何外部库,能让你更好地理解滑动切换的原理。
步骤 1:JSP 页面 (index.jsp)
JSP 的作用在这里是提供一个动态的图片列表,我们假设这些图片 URL 来自数据库。

(图片来源网络,侵删)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">原生JS图片轮播</title>
<!-- 引入CSS文件 -->
<link rel="stylesheet" href="css/slider.css">
</head>
<body>
<div class="slider-container">
<div class="slider-wrapper" id="sliderWrapper">
<!--
JSP 动态生成图片列表
假设从 request 中获取了一个图片列表
-->
<c:forEach var="imageUrl" items="${imageUrls}">
<img src="${imageUrl}" alt="Slide Image">
</c:forEach>
</div>
<!-- 左右切换按钮 -->
<button class="slider-btn prev" id="prevBtn">❮</button>
<button class="slider-btn next" id="nextBtn">❯</button>
<!-- 指示器 -->
<div class="slider-dots" id="sliderDots">
<!-- 动态生成指示器点 -->
</div>
</div>
<!-- 引入JavaScript文件 -->
<script src="js/slider.js"></script>
</body>
</html>
步骤 2:CSS 样式 (css/slider.css)
这是实现滑动效果的关键。
/* 容器:设置宽高,并隐藏溢出的内容 */
.slider-container {
position: relative;
width: 800px; /* 设置你想要的宽度 */
height: 400px; /* 设置你想要的高度 */
margin: 50px auto;
overflow: hidden; /* 隐藏超出容器的部分 */
}
/* 图片包裹层:设置横向排列,并使用 flex 布局 */
.slider-wrapper {
display: flex; /* 使用 flex 让图片横向排列 */
transition: transform 0.5s ease-in-out; /* 添加平滑过渡效果 */
/* transform 的初始值由 JS 控制 */
}
/* 单张图片样式 */
.slider-wrapper img {
width: 800px; /* 每张图片宽度与容器相同 */
height: 400px; /* 每张图片高度与容器相同 */
object-fit: cover; /* 确保图片填满容器且不变形 */
}
/* 左右按钮样式 */
.slider-btn {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 50px;
height: 50px;
background-color: rgba(0, 0, 0, 0.5);
color: white;
border: none;
border-radius: 50%;
font-size: 24px;
cursor: pointer;
z-index: 10;
}
.slider-btn.prev {
left: 10px;
}
.slider-btn.next {
right: 10px;
}
/* 指示器样式 */
.slider-dots {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 10px;
}
.slider-dots .dot {
width: 12px;
height: 12px;
border-radius: 50%;
background-color: rgba(255, 255, 255, 0.5);
cursor: pointer;
}
.slider-dots .dot.active {
background-color: white;
}
步骤 3:JavaScript 逻辑 (js/slider.js)
这是实现交互的核心。
document.addEventListener('DOMContentLoaded', function() {
const wrapper = document.getElementById('sliderWrapper');
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
const dotsContainer = document.getElementById('sliderDots');
const images = wrapper.querySelectorAll('img');
let currentIndex = 0;
const totalImages = images.length;
// 如果没有图片,则不执行
if (totalImages === 0) return;
// 1. 创建指示器
for (let i = 0; i < totalImages; i++) {
const dot = document.createElement('span');
dot.classList.add('dot');
if (i === 0) dot.classList.add('active');
dot.addEventListener('click', () => goToSlide(i));
dotsContainer.appendChild(dot);
}
const dots = dotsContainer.querySelectorAll('.dot');
// 2. 更新滑块位置和指示器状态
function updateSlider() {
// 使用 transform: translateX 来移动图片
const offset = -currentIndex * 800; // 800 是单张图片的宽度
wrapper.style.transform = `translateX(${offset}px)`;
// 更新指示器
dots.forEach((dot, index) => {
dot.classList.toggle('active', index === currentIndex);
});
}
// 3. 切换到指定幻灯片
function goToSlide(index) {
currentIndex = index;
updateSlider();
}
// 4. 下一张
function nextSlide() {
currentIndex = (currentIndex + 1) % totalImages;
updateSlider();
}
// 5. 上一张
function prevSlide() {
currentIndex = (currentIndex - 1 + totalImages) % totalImages;
updateSlider();
}
// 6. 绑定按钮事件
nextBtn.addEventListener('click', nextSlide);
prevBtn.addEventListener('click', prevSlide);
// 7. 自动播放 (可选)
let slideInterval = setInterval(nextSlide, 3000); // 每3秒切换一次
// 鼠标悬停时暂停自动播放
wrapper.addEventListener('mouseenter', () => {
clearInterval(slideInterval);
});
wrapper.addEventListener('mouseleave', () => {
slideInterval = setInterval(nextSlide, 3000);
});
// 触摸滑动支持 (可选,稍微复杂)
let startX = 0;
let endX = 0;
wrapper.addEventListener('touchstart', (e) => {
startX = e.touches[0].clientX;
clearInterval(slideInterval); // 触摸时暂停
});
wrapper.addEventListener('touchend', (e) => {
endX = e.changedTouches[0].clientX;
handleSwipe();
});
function handleSwipe() {
const threshold = 50; // 滑动阈值
if (startX - endX > threshold) {
nextSlide(); // 向左滑,下一张
} else if (endX - startX > threshold) {
prevSlide(); // 向右滑,上一张
}
// 恢复自动播放
slideInterval = setInterval(nextSlide, 3000);
}
});
使用成熟的轮播图库(最快捷,推荐)
在实际项目中,我们通常不会自己从零开始写轮播图,而是使用成熟、稳定、功能丰富的库,这能大大提高开发效率和用户体验。
推荐库:
- Swiper.js: 目前最流行、功能最强大的轮播图库,支持触摸滑动、无限循环、分页、导航等几乎所有你能想到的功能。
- Bootstrap Carousel: 如果你已经在使用 Bootstrap 框架,那么自带的轮播组件是最佳选择,集成简单。
以 Swiper.js 为例实现
步骤 1: 引入 Swiper 的 CSS 和 JS

(图片来源网络,侵删)
你可以从 Swiper 官网 下载文件,或者使用 CDN。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">Swiper图片轮播</title>
<!-- Swiper CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
<style>
/* 基本样式,让轮播图可见 */
.swiper {
width: 800px;
height: 400px;
margin: 50px auto;
}
.swiper-slide img {
width: 100%;
height: 100%;
object-fit: cover;
}
</style>
</head>
<body>
<div class="swiper mySwiper">
<div class="swiper-wrapper">
<!-- 动态生成图片 -->
<c:forEach var="imageUrl" items="${imageUrls}">
<div class="swiper-slide">
<img src="${imageUrl}" alt="Slide Image">
</div>
</c:forEach>
</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@11/swiper-bundle.min.js"></script>
<!-- 初始化 Swiper -->
<script>
document.addEventListener('DOMContentLoaded', function () {
const swiper = new Swiper(".mySwiper", {
// 配置项
loop: true, // 循环模式
pagination: {
el: ".swiper-pagination",
clickable: true,
},
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
// 自动播放
autoplay: {
delay: 3000,
disableOnInteraction: false,
},
// 触摸灵敏度
touchRatio: 1,
touchAngle: 45,
});
});
</script>
</body>
</html>
可以看到,使用 Swiper 只需要按照它的 HTML 结构编写代码,然后在 JS 中进行简单的初始化配置即可,代码量极少,功能却非常强大。
总结与建议
| 特性 | 原生 JavaScript | Swiper.js / Bootstrap Carousel |
|---|---|---|
| 学习成本 | 高,需要理解 DOM、CSS、JS 的配合 | 低,只需阅读文档并调用 API |
| 开发效率 | 低,需要编写和调试大量代码 | 极高,复制粘贴,配置即可 |
| 功能丰富度 | 需要自己实现(触摸、自动播放等) | 非常丰富,开箱即用 |
| 性能 | 可控,代码量少时性能好 | 优秀,库本身经过高度优化 |
| 灵活性 | 极高,可完全定制逻辑和样式 | 较高,可通过配置和 CSS 覆盖实现大部分需求 |
| 适用场景 | 学习、面试、对体积和定制化有极致要求的特殊项目 | 绝大多数商业项目和个人网站,强烈推荐 |
给你的建议:
- 如果你是初学者:强烈建议先尝试方法一(原生JS),亲手实现一遍,这个过程会让你对前端交互有非常深刻的理解。
- 如果你是开发者,正在做项目:请直接使用方法二(Swiper.js),它为你节省了大量时间,避免了各种潜在的 bug,并且提供了顶级的用户体验,这是行业标准做法。
