swiper
Swiper 常用于移动端网站的内容触摸滑动
Swiper 是纯 JavaScript 打造的滑动特效插件,面向手机、平板电脑等移动终端。
swiper.js 在国内使用面非常广,可以用于实现轮播、图片预览、可滚动应用等,发挥想象可是实现诸多需求。
本篇幅采用 swiper5,所有版本的 api 都很相似,主要区别可以参考官方的提供的说明。
1. 使用
实例演示
预览
复制
<style>
.container {height: 100px;overflow: hidden;}
.slide-item {display: flex;justify-content: center;align-items: center;color: white;font-size: 42px;}
.item1 {background-color: cornflowerblue;}
.item2 {background-color: darkslateblue;}
.item3 {background-color: darkorange;}
</style>
<div class="container">
<div class="swiper-wrapper">
<div class="swiper-slide slide-item item1">第一屏</div>
<div class="swiper-slide slide-item item2">第二屏</div>
<div class="swiper-slide slide-item item3">第三屏</div>
</div>
</div>
<link href="https://cdn.bootcdn.net/ajax/libs/Swiper/5.4.5/css/swiper.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/Swiper/5.4.5/js/swiper.min.js"></script>
<script>
var mySwiper = new Swiper('.container', {
autoplay: true, // 自动切页
});
</script>
运行案例
点击 "运行案例" 可查看在线运行效果
swiper 需要引入两个资源,通常和 UI 相关的框架都会有两个及以上资源,需要额外引入样式。
轮播是非常常见的需求,只需一些简单的 DOM 结构就可以完成。
.swiper-wrapper 和 .swiper-slide 两个类是和 swiper 联动的,swiper 在初始化的时候会在 swiper-wrapper 下 swiper-slide 作为每一项,这些类名都是可通过配置修改的。
2. 使用 swiper 实现移动端的图片预览
移动端产品的图片查看几乎都是全屏预览,可以作用滑动切换图,支持缩放手势等,swiper 天然支持这些功能,同时又可以深度定制,适合制作业务组建嵌入项目。
分析一下需求:点击图片查看大图,图片可以手势缩放,同时支持左右切换。
其实这就是一个不会自动切换的轮播,通过 swiper 就能实现。
可以设计一个方法,方法接收 当前图片和所有图片列表,然后每个图片为一页,生成一个轮播,显示在页面的最上层。
实例演示
预览
复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
</head>
<body>
<style>
.container {position: fixed;top: 0;bottom: 0;right: 0;left: 0;background-color: rgba(0, 0, 0, .7);}
.container .swiper-pagination {display: none;}
.slide-item {overflow: hidden;}
.slide-item img {width: 100%;}
.count {position: absolute;left: 50%;transform: translateX(-50%);top: 16px;color: white;}
</style>
<link href="https://cdn.bootcdn.net/ajax/libs/Swiper/5.4.5/css/swiper.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/Swiper/5.4.5/js/swiper.min.js"></script>
<script>
function previewImage(current, list) {
if (!list) list = [current]; // 如果没传,默认以初始图为列表
if (list.length === 0) list = [current]; // 如果数组为空 则以初始图为列表
var idx = 0; // 寻找初始图在列表的位置
var html = list.map(function(item, index) {
if (item === current) { // 如果两个图 url 相等,则说明初始图就是在这个位置
idx = index + 1; // 记录下位置
}
// 拼一个 swiper-slide
return [
'<div class="swiper-slide slide-item">',
'<div class="swiper-zoom-container">', // 应用缩放配置项要提供这个节点
'<img src="' + item + '" />',
'</div>',
'</div>',
].join('');
});
var wrapper = document.createElement('div'); // 创建一个 swiper-wrapper
wrapper.className = 'swiper-wrapper';
wrapper.innerHTML = html.join(''); // 把所有 swiper-slide 塞进去
var container = document.createElement('div'); // 创建跟节点
container.className = 'container';
// 把所有 html 拼起来
container.innerHTML = [
'<div class="count">',
'<span class="current">' + (idx || 1) + '</span>',
'/',
'<span class="total">' + list.length + '</span>',
'</div>',
wrapper.outerHTML,
'<div class="swiper-pagination"></div>',
].join('');
// 添加到 DOM 中
document.body.appendChild(container);
// 实例化一个 swiper
new Swiper(container, {
zoom: true, // 缩放开启
loop: list.length > 1, // 如果图片只有一张,则不开启循环
pagination: { // 分页配置
el: '.swiper-pagination',
},
on: { // 事件监听
paginationUpdate: function(e) { // 当分页发生变化的时候
var idx = e.realIndex; // 拿到当前页索引
// 赋值给分页计数器
container.querySelector('.current').innerText = idx + 1;
},
},
}).slideTo(idx, 0); // 默认展示初始图
}
previewImage('https://img.mukewang.com/5ef94c8e000109e118720764.jpg', [
'https://img.mukewang.com/5f057a6a0001f4f918720764.jpg',
'https://img.mukewang.com/5ef94c8e000109e118720764.jpg',
'https://img.mukewang.com/5ef15e4e00010b0018720764.jpg',
'https://img.mukewang.com/5f0561160001630718720764.jpg',
]);
</script>
</body>
</html>
运行案例
点击 "运行案例" 可查看在线运行效果
源码没有跳着走的逻辑,都加上了注释,相对好理解。
这个图片查看方法利用了 swiper 提供的滚动、手势缩放、手势拖动、分页的能力,实现相对简单,如果需要自己去实现相应功能,就需要花费大量的经历。

3. 小结
swiper 本身的定位并不是轮播,轮播是其应用场景之一,发挥想象,可以用 swiper 做许多事情。
前置知识
什么是JavaScript
开发与学习环境准备
调试方案
基础
JavaScript 变量
JavaScript 数据类型
JavaScript if 语句
JavaScript for 语句
JavaScript 算数运算符
JavaScript 比较运算符
JavaScript 逻辑运算符
JavaScript 表达式
JavaScript 函数
JavaScript 对象
JavaScript 字符串
JavaScript 数字
JavaScript 数组
JavaScript switch 语句
JavaScript while 语句
JavaScript break与continue
JavaScript with
document.cookie
内置对象
JavaScript Function
JavaScript Math
JavaScript Date
JavaScript RegExp
JavaScript JSON
JavaScript 与 DOM
什么是DOM
DOM和JavaScript的关系
获取和操作 DOM 节点
JavaScript DOM与事件
JavaScript DOM 事件绑定
JavaScript DOM 事件对象
JavaScript DOM 事件流
JavaScript DOM 事件优化
JavaScript DOM 自定义事件
表单处理
使用 JavaScript 校验表单
BOM
BOM window 对象
常用的 BOM 相关对象
BOM 常用属性和方法
AJAX
JavaScript AJAX
进阶知识
JavaScript 异常处理
JavaScript 三元运算符
JavaScript 逗号操作符
JavaScript void
JavaScript typeof
JavaScript delete
JavaScript debugger
JavaScript getter &setter
JavaScript 原型
JavaScript new操作符和构造函数
JavaScript instanceof
JavaScript this
JavaScript 严格模式
JavaScript 作用域
JavaScript 闭包
JavaScript 变量提升
JavaScript 对象包装器
常用库
jQuery
Lodash
moment.js
swiper
进阶指南
ECMAScript6
Node.js
Babel
CSS 预处理器
代码规范
TypeScript
Web Components
小程序
Vue / React / Angular
JavaScript 关键字
常见疑点与误区
分号问题
对象属性访问问题
this 使用问题
浮点数精度问题
独一无二的 NaN
避免全局污染
控制台观察对象问题
根据环境选择语言特性
扩展
相关资源
代码预览
退出