- 触摸支持:在移动设备上,可以通过触摸左右滑动来翻页。
- 鼠标支持:在桌面浏览器上,可以通过鼠标拖拽来模拟滑动。
- 键盘支持:可以使用键盘的左右箭头键进行翻页。
- 平滑动画:使用 CSS
transform和transition实现流畅的滑动效果。 - 响应式设计:适配各种屏幕尺寸。
- 指示器:底部显示当前页码和总页数,方便用户了解进度。
最终效果预览
您可以直接复制下面的所有代码,保存为一个 .html 文件,然后在浏览器中打开即可看到效果。

(图片来源网络,侵删)
模板代码
下面是完整的代码,包含了 HTML、CSS 和 JavaScript。
index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">左右滑动翻页模板</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<div class="slider-wrapper">
<!-- 第一页 -->
<div class="slide">
<h1>第一页</h1>
<p>这是第一页的内容,您可以通过以下几种方式进行翻页:</p>
<ul>
<li>在移动设备上,用手指左右滑动。</li>
<li>在电脑上,用鼠标按住并拖动。</li>
<li>使用键盘的 <kbd>←</kbd> 和 <kbd>→</kbd> 箭头键。</li>
</ul>
</div>
<!-- 第二页 -->
<div class="slide">
<h1>第二页</h1>
<p>这是第二页的内容,这个模板非常灵活,您可以轻松地修改每页的内容和样式。</p>
<p>只需在 HTML 中添加或删除 `<div class="slide">...</div>` 元素,JavaScript 会自动适应页数变化。</p>
</div>
<!-- 第三页 -->
<div class="slide">
<h1>第三页</h1>
<p>这是第三页的内容。</p>
<p>感谢您的使用!</p>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
style.css
/* 基础样式重置 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background-color: #f0f2f5;
color: #333;
overflow: hidden; /* 防止出现水平滚动条 */
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
/* 主容器 */
.container {
width: 100%;
height: 100vh;
position: relative;
overflow: hidden; /* 隐藏超出视口的滑动部分 */
}
/* 滑动区域 */
.slider-wrapper {
display: flex; /* 使用 Flexbox 布局让所有页面水平排列 */
height: 100%;
transition: transform 0.3s ease-out; /* 平滑过渡效果 */
}
/* 单个页面样式 */
.slide {
min-width: 100vw; /* 每个页面占据整个视口宽度 */
height: 100%;
padding: 40px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
background-color: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.slide h1 {
font-size: 2.5em;
margin-bottom: 20px;
color: #007bff;
}
.slide p {
font-size: 1.2em;
line-height: 1.8;
max-width: 600px;
}
.slide ul {
list-style-type: none;
padding: 0;
}
.slide li {
font-size: 1.1em;
margin-bottom: 10px;
}
/* 键盘按键样式 */
kbd {
background-color: #eee;
border-radius: 3px;
border: 1px solid #b4b4b4;
box-shadow: 0 1px 1px rgba(0,0,0,.2);
color: #333;
display: inline-block;
font-size: 0.9em;
line-height: 1;
padding: 2px 6px;
white-space: nowrap;
}
script.js
document.addEventListener('DOMContentLoaded', () => {
const sliderWrapper = document.querySelector('.slider-wrapper');
const slides = document.querySelectorAll('.slide');
const totalSlides = slides.length;
let currentIndex = 0;
// 如果没有页面,则不执行任何操作
if (totalSlides === 0) return;
// --- 1. 键盘事件 ---
document.addEventListener('keydown', (e) => {
if (e.key === 'ArrowLeft') {
goToPrevSlide();
} else if (e.key === 'ArrowRight') {
goToNextSlide();
}
});
// --- 2. 触摸/鼠标事件 ---
let startX = 0;
let isDragging = false;
let currentX = 0;
let initialX = 0;
// 鼠标按下或触摸开始
sliderWrapper.addEventListener('mousedown', startDrag);
sliderWrapper.addEventListener('touchstart', startDrag, { passive: true });
function startDrag(e) {
isDragging = true;
startX = e.type.includes('mouse') ? e.clientX : e.touches[0].clientX;
sliderWrapper.style.cursor = 'grabbing';
sliderWrapper.style.transition = 'none'; // 拖动时禁用过渡动画
}
// 鼠标移动或触摸移动
sliderWrapper.addEventListener('mousemove', drag);
sliderWrapper.addEventListener('touchmove', drag, { passive: true });
function drag(e) {
if (!isDragging) return;
e.preventDefault(); // 防止页面滚动
currentX = e.type.includes('mouse') ? e.clientX : e.touches[0].clientX;
const walkX = (currentX - startX) * 1.5; // 乘以一个系数,使拖动更灵敏
// 计算新的 transform 值,但限制在边界内
let newTranslateX = -currentIndex * window.innerWidth + walkX;
newTranslateX = Math.max(-(totalSlides - 1) * window.innerWidth, Math.min(0, newTranslateX));
sliderWrapper.style.transform = `translateX(${newTranslateX}px)`;
}
// 鼠标释放或触摸结束
sliderWrapper.addEventListener('mouseup', endDrag);
sliderWrapper.addEventListener('mouseleave', endDrag);
sliderWrapper.addEventListener('touchend', endDrag);
function endDrag() {
if (!isDragging) return;
isDragging = false;
sliderWrapper.style.cursor = 'grab';
sliderWrapper.style.transition = 'transform 0.3s ease-out'; // 恢复过渡动画
// 计算滑动距离,判断是上一页还是下一页
const walkX = currentX - startX;
const threshold = window.innerWidth * 0.2; // 滑动距离超过视口宽度的20%才翻页
if (walkX < -threshold) {
goToNextSlide();
} else if (walkX > threshold) {
goToPrevSlide();
} else {
// 如果滑动距离不够,则回到当前页
goToSlide(currentIndex);
}
}
// --- 核心翻页函数 ---
function goToSlide(index) {
if (index < 0 || index >= totalSlides) return;
currentIndex = index;
sliderWrapper.style.transform = `translateX(-${currentIndex * window.innerWidth}px)`;
}
function goToNextSlide() {
if (currentIndex < totalSlides - 1) {
goToSlide(currentIndex + 1);
}
}
function goToPrevSlide() {
if (currentIndex > 0) {
goToSlide(currentIndex - 1);
}
}
// --- 初始化 ---
sliderWrapper.style.transform = `translateX(0px)`; // 确保初始位置正确
sliderWrapper.style.cursor = 'grab'; // 设置鼠标样式
});
如何使用和自定义
-
添加新页面: 只需在
<div class="slider-wrapper">内部复制并粘贴<div class="slide">...</div>元素即可,添加第四页:<div class="slide"> <h1>第四页</h1> <p>这是新添加的第四页内容。</p> </div>JavaScript 会自动识别并适配新的页数。
-
修改页面内容: 直接编辑每个
<div class="slide">内部的 HTML 内容即可。
(图片来源网络,侵删) -
修改样式: 编辑
style.css文件来自定义页面的外观,可以修改背景颜色、字体、阴影等。 -
调整动画速度: 在
style.css中找到.slider-wrapper的transition属性,修改3s这个值可以改变动画的快慢,数值越小,动画越快。 -
调整灵敏度: 在
script.js中,const threshold = window.innerWidth * 0.2;这一行控制着需要滑动多远才算一次有效的翻页,将2调大,需要滑动的距离就越多;调小则反之。
这个模板是一个很好的起点,您可以根据自己的项目需求进行进一步的扩展和美化。

(图片来源网络,侵删)
