本文介绍在移动Web开发中使用轻量级Swipe.js库结合Zepto制作轮播图的方法。详细解析了Swipe.js的核心参数配置与API调用,并针对Zepto中swipeUp和swipeDown手势事件在移动端失效的问题,提供了引入touch.js模块及阻止默认滚动事件两种具体解决方案。
Swipe.js简介与引入
在移动Web开发场景中,受限于手机屏幕尺寸,为了在有限空间内展示更多内容并兼顾用户流量消耗,轮播图成为常见方案。经过调研与实践,Swipe.js因其轻量级特性成为优选工具。
Swipe.js是一个纯JavaScript库,无需依赖其他JS库即可独立运行,同时兼容jQuery和Zepto。其压缩版体积仅6kb,非常适合移动端项目。该项目托管于GitHub:https://github.com/thebird/swipe。
GitHub仓库中的使用文档清晰易懂,核心实现代码示例如下。
<div id='slider' class='swipe'>
<div class='swipe-wrap'>
<div></div>
<div></div>
<div></div>
</div>
</div>
.swipe {
overflow: hidden;
visibility: hidden;
position: relative;
}
.swipe-wrap {
overflow: hidden;
position: relative;
}
.swipe-wrap > div {
float:left;
width:100%;
position: relative;
}
window.mySwipe = Swipe(document.getElementById('slider'),opt);
HTML结构规范
在HTML结构方面,建议保持.swipe嵌套.swipe-wrap的层级模型不变,内部最深层级的容器元素(如div)可替换为其他标签(如li)。
核心参数配置
仅凭上述基础代码即可实现基本轮播功能。但在实际项目(尤其是首页Banner区域)中,通常需要添加页码索引指示器,并对控件参数进行精细化配置。主要参数配置说明如下:
startSlide Integer (default:0) - 指定轮播起始位置。
speed Integer (default:300) - 设置动画滚动的持续时间(毫秒)。
auto Integer - 设置自动播放功能,值为幻灯片切换的时间间隔(毫秒)。
continuous Boolean (default:true) - 是否创建无限循环,即滑动到最后一张后是否自动回到第一张。
disableScroll Boolean (default:false) - 是否在滚动条滚动时停止幻灯片自动播放。
stopPropagation Boolean (default:false) - 是否阻止事件冒泡。
callback Function - 幻灯片切换过程中的回调函数。
transitionEnd Function - 动画执行结束后的回调函数。
主要API方法
此外,Swipe.js提供了以下主要API方法供调用:
prev():切换至上一页。
next():切换至下一页。
getPos():获取当前页面的索引值。
getNumSlides():获取轮播项的总数量。
slide(index, duration):执行指定索引的滑动操作,可自定义持续时间。
以下是我在实际项目中应用Swipe.js的代码示例。
<div class="banner">
<div id="slider" class="swipe">
<ul class="swipe-wrap">
<li>
<a href="javascript:void(0)">
<img src="img/1.jpg">
</a>
</li>
<li>
<a href="javascript:void(0)">
<img src="img/2.jpg">
</a>
</li>
<li>
<a href="javascript:void(0)">
<img src="img/3.jpg">
</a>
</li>
<li>
<a href="javascript:void(0)">
<img src="img/4.jpg">
</a>
</li>
<li>
<a href="javascript:void(0)">
<img src="img/5.jpg">
</a>
</li>
</ul>
<ul class="slide-trigger">
<li class="cur"></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
</div>
.banner {
width: 100%;
position: relative;
}
.banner .swipe {
overflow: hidden;
position: relative;
}
.banner .swipe-wrap {
overflow: hidden;
position: relative;
list-style: none;
}
.banner .swipe-wrap li {
float: left;
position: relative;
}
.banner img {
width: 100%;
vertical-align: middle;
}
.banner .slide-trigger {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
z-index: 10;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;
list-style: none;
}
.banner .slide-trigger li {
width: 10px;
height: 10px;
background: #FFF;
margin: 5px;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
-ms-border-radius: 50%;
-o-border-radius: 50%;
border-radius: 50%;
}
.banner .slide-trigger .cur {
background: #2fc7c9;
}
var slider = $('#slider');
slider.find(".slide-trigger").find("li").eq(0).addClass("cur");
window.mySwipe = new Swipe(document.getElementById('slider'), {
speed: 400,
auto: 3000,
callback: function(index, elem) {
slider.find(".slide-trigger").find("li").eq(index).addClass("cur").siblings().removeClass("cur");
}
});
Zepto中swipeUp/Down失效问题
在Zepto环境中,swipeUp和swipeDown手势事件可能出现无效的情况。
在使用Zepto处理移动端事件时,我发现存在一个兼容性问题。
$(‘body').swipeUp(function(e){
alert(‘swipeUp');//偶尔有效
})
$(‘body').swipeDown(function(e){
alert(‘swipeDown');//偶尔有效
})
$(‘body').tap(function(){
alert(‘tap');//ok
})
$(‘body').swipeLeft(function(){
alert(‘swipeLeft');//ok
})
$(‘body').swipeRight(function(){
alert(‘swipeRight');//ok
})
具体表现为在移动端设备上,swipeUp和swipeDown手势无法触发,而其他手势(如tap、swipeLeft/Right)工作正常。
解决方案一:引入touch.js
针对该问题,提供以下两种解决方案:
方案一:Zepto官方文档未直接包含touch.js模块,需前往GitHub下载该模块并引入项目,即可解决手势识别问题。
解决方案二:阻止默认事件
方案二:问题可能源于浏览器默认的下拉刷新或滚动行为被阻止。
可通过添加以下代码来阻止默认事件,从而确保手势监听正常生效。
document.addEventListener('touchmove', function (event) {
event.preventDefault();
}, false);