核心提示:最近在研究手机端页面,其中有个简单的图片滑动效果,折腾了半天,于是我写了个小的demo。大概功能:自定义是否切换,支持滑动切换,循环切换等等,具体可以拿demo代码自己本地试试大概思路:把当前张显示,...
最近在研究手机端页面,其中有个简单的图片滑动效果,折腾了半天,于是我写了个小的demo。
大概功能:自定义是否切换,支持滑动切换,循环切换等等,具体可以拿demo代码自己本地试试
大概思路:把当前张显示,上一张定位在最前面,下一张定义在最后面,其他隐藏,通过touchstart、touchmove、touchend 三个事件加上css3的transition变
化效果配合,实现滑动切换图片,效果类似于手机版京东的banner
开发是基于Zepto框架,当然也支持其他任何一款手机端框架,只需将代码中的美元符号$换为指定框架操作符即可。
下面是该效果的源码,明白思路的朋友可以自己封装成小插件注意:只支持手机端哦
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width; initial-scale=1.0;" />
<title>Document</title>
</head>
<script src="https://zeptojs.com/zepto.min.js"></script>
<body>
<p class="slider_wrap">
<p class="slider_content">
<p class="slider_item">
<img src=/uploadfile/2017/0107/20170107100936905.jpg" alt="">
</p>
<p class="slider_item">
<img src=/uploadfile/2017/0107/20170107100936774.jpg" alt="">
</p>
<p class="slider_item">
<img src=/uploadfile/2017/0107/20170107100936396.jpg" alt="">
</p>
<p class="slider_item">
<img src=/uploadfile/2017/0107/20170107100936267.jpg" alt="">
</p>
<p class="slider_item">
<img src=/uploadfile/2017/0107/20170107100936145.jpg" alt="">
</p>
</p>
</p>
</body>
</html>
CSS:
* {
margin: 0;
padding: 0;
}
.slider_wrap {
position: relative;
height: 168px;
overflow: hidden;
}
.slider_wrap .slider_content {
height: 100%;
position: absolute;
top: 0;
left: 0;
}
.slider_wrap .slider_item {
height: 100%;
position: absolute;
top: 0;
left: 0;
}
.slider_wrap .slider_item img {
border: 0;
width: 100%;
height: 100%;
}
.slider_wrap .slider_btn {
width: 100%;
height: 10px;
position: absolute;
bottom: 10px;
left: 0;
text-align: center;
}
.slider_wrap .slider_btnlist {
width: 6px;
height: 6px;
border: 1px solid rgba(255,255,255,.8);
display: inline-block;
border-radius: 50%;
margin: 5px;
}
.slider_wrap .slider_btnlist.curr {
background: rgba(255,255,255,.8);
}
JavaScript:
$(document).ready(function() {
// 默认设置
var setting = {
'index': 0,
'duration': 300,
'interval': 3000,
'autoPlay': false,
'timingFn': 'ease'
}
//节点获取
var selector = {
'sliderWrap': '.slider_wrap',
'sliderCont': '.slider_content',
'sliderItem': '.slider_item',
'sliderBtn': '.slider_btn',
'sliderBtnList': '.slider_btnlist',
'showBtnList': '.curr'
}
//用于记录触屏的坐标以及触屏的时间
var touchRecord = {
'startX': '',
'startT': '',
'endX': '',
'endT': '',
'changeX': '',
'changeT': ''
}
var sliderWrap = $(selector.sliderWrap);
var sliderCont = sliderWrap.find(selector.sliderCont);
var sliderItem = sliderWrap.find(selector.sliderItem);
var sliderBtn = sliderWrap.find(selector.sliderBtn);
var sliderBtnList = sliderWrap.find(selector.sliderBtnList);
var timer = null;
var sliderWidth = $(window).width();
var sliderLength = sliderItem.length;
initStyle();
createBtn();
addEvent();
//初始化样式
function initStyle() {
sliderWidth = $(window).width();
sliderWrap.css('width', sliderWidth);
sliderCont.css('width', sliderWidth);
sliderItem.css('width', sliderWidth);
transitionFn(setting.duration, 0);
}
// 创建索引按钮
function createBtn() {
var BtnList = '';
sliderItem.each(function() {
BtnList += "<p class=" + selector.sliderBtnList.slice(1) + "></p>";
});
var Btn = "<p class=" + selector.sliderBtn.slice(1) + ">" + BtnList + "</p>";
sliderWrap.append(Btn);
sliderBtn = sliderWrap.find(selector.sliderBtn);
sliderBtnList = sliderWrap.find(selector.sliderBtnList);
showBtnList();
}
// 当前按钮高亮显示
function showBtnList() {
var showBtnList = selector.showBtnList.slice(1);
sliderBtnList.eq(setting.index).addClass(showBtnList).siblings().removeClass(showBtnList);
}
// 设置过渡函数
function transitionFn(duration, changeX) {
// 索引处理,如果小于0则返回最大值 反之
if (setting.index < 0) setting.index = sliderLength - 1;
if (setting.index > sliderLength - 1) setting.index = 0;
// 保存当前显示张,下一张,上一张
var currItem = sliderItem.eq(setting.index);
var prevItem = sliderItem.eq(setting.index - 1);
var nextItem = sliderItem.eq(setting.index + 1);
// 如果当前张为第一张,则下一张为最后张 反之
if (setting.index - 1 < 0) prevItem = sliderItem.eq(sliderLength - 1);
if (setting.index + 1 > sliderLength - 1) nextItem = sliderItem.eq(0);
sliderItem.css({
'left': 0,
'z-index': -2,
'transition': duration + 'ms ' + setting.timingFn,
'-webkit-transition': duration + 'ms ' + setting.timingFn
});
currItem.css({
'left': changeX,
'z-index': 0
});
prevItem.css({
'left': -sliderWidth + changeX,
'z-index': -1
});
nextItem.css({
'left': sliderWidth + changeX,
'z-index': -1
});
showBtnList();
}
// 触屏开始
function touchStartFn(e) {
var e = e || window.event;
e.preventDefault();
var touch = e.targetTouches[0];
//记录手指触屏的X坐标以及当前时间
touchRecord.startX = touch.pageX;
touchRecord.startT = new Date().getTime();
transitionFn(0, 0);
clearIntervalFn();
}
function touchMoveFn(e) {
var e = e || window.event;
e.preventDefault();
var touch = e.targetTouches[0];
//记录滑动过程中的X坐标并计算滑动过程中改变的X坐标
touchRecord.endX = touch.pageX;
touchRecord.changeX = touchRecord.endX - touchRecord.startX;
transitionFn(0, touchRecord.changeX);
}
function touchEndFn(e) {
var e = e || window.event;
e.preventDefault();
var touch = e.targetTouches[0];
//记录滑动结束的时间并计算滑动整个过程持续的时间
touchRecord.endT = new Date().getTime();
touchRecord.changeT = touchRecord.endT - touchRecord.startT;
// 如果不是触屏(改变的时间大于50)并且滑动持续的时间大于300毫秒 或者 滑动改变的位移大于需要过渡宽度的一半 则返回ture
var onNext = Boolean((touchRecord.changeT > 50 && touchRecord.changeT < 300) || Math.abs(touchRecord.changeX) >= sliderWidth / 2);
// 当手指左往右滑 即改变大于0 并且满足进行下一张的条件
if (touchRecord.changeX > 0 && onNext) {
setting.index--;
} else if (touchRecord.changeX < 0 && onNext) {
setting.index++;
}
transitionFn(setting.duration, 0);
// 过渡完成清除计时器,并且重置坐标记录
setIntervalFn();
touchRecord = {
'startX': '',
'startT': '',
'endX': '',
'endT': '',
'changeX': '',
'changeT': ''
}
}
//绑定事件
function addEvent() {
sliderWrap.bind({
'touchstart': function() {
touchStartFn()
},
'touchmove': function() {
touchMoveFn()
},
'touchend': function() {
touchEndFn()
}
});
$(window).resize(function() {
initStyle()
});
setIntervalFn();
}
//开启计时器
function setIntervalFn() {
clearIntervalFn();
if (setting.autoPlay) {
timer = setInterval(function() {
setting.index++;
transitionFn(setting.duration, 0);
},
setting.interval);
}
}
//关闭计时器
function clearIntervalFn() {
clearInterval(timer);
}
});


