需求
移动端轮播图功能和PC端基本一致
1.可以自动播放图片
2.手指可以拖动播放轮播图
案例分析
1.自动播放功能
Ⅰ.开启定时器
Ⅱ.移动端移动,可以使用translate移动
Ⅲ.想要图片优雅的移动,请添加过渡效果
2.无缝滚动
Ⅰ.注意,我们判断条件是要等到图片滚动完毕再去判断,就是过渡完成后判断
Ⅱ.此时需要添加检测过渡完成事件transitionend
Ⅲ.判断条件:如果索引号等于3,说明走到最后一张图片,此时索引号复原为0
Ⅳ.此时图片去掉过渡效果,然后移动
Ⅴ.如果索引号小于0,说明是倒着走,索引号等于2
Ⅵ.此时图片去掉过渡效果,然后移动
3.小圆点跟随变化
拓展:classList属性:H5新增的属性,返回元素的类名,IE10+支持。
该属性用于在元素中添加、移除及切换CSS类,有以下方法:
①添加类:element.classList.add(‘类名’);
②移除类:element.classList.remove(‘类名’);
③切换类:element.classList.toggle(‘类名’);
注意:类名前不加点
Ⅰ.把ol里面li带有current类名的选出来,去掉类名remove
Ⅱ.让当前索引号的li加上current add
Ⅲ.但是要等过渡效果结束之后变化,所以写到transitionend事件里面
4.手指滑动轮播图
Ⅰ.本质就是ul跟随手指移动,简单说就是移动端拖动元素
Ⅱ.触摸元素touchstart:获取手指初始坐标
Ⅲ.移动手指touchmove:计算手指的滑动距离,并且移动盒子
Ⅳ.离开手指touchend:根据滑动的距离分不同的情况
Ⅴ.如果移动距离小于某个像素就回弹原来位置
Ⅵ.如果移动距离大于某个像素就上一张下一张滑动。
源代码:
链接:https://share.weiyun.com/iBNCb0i4 密码:tyc8jb
window.addEventListener('load',function(){//获取元素var focus = document.querySelector('.focus');var ul = focus.children[0];var ol = focus.children[1];//获得focus的宽度var w = focus.offsetWidth;//1.利用定时器自动播放图片var index = 0;var timer = setInterval(function(){index++;var translatex = -index * w;//移动的距离ul.style.transition = 'all .3s';ul.style.transform = 'translateX(' + translatex + 'px)';},2000);//2.无缝滚动,等到图片滚动完毕再去判断,添加检测过渡完成事件transitionendul.addEventListener('transitionend',function(){//走到最后一张闪到第一张// 如果索引号等于3,说明走到最后一张图片,此时索引号复原为0if(index >= 3){index = 0;ul.style.transition = '';//去掉过渡效果,实现闪到第一张//重新过渡var translatex = -index * w;ul.style.transform = 'translateX(' + translatex + 'px)';}else if(index < 0){index = 2;ul.style.transition = '';//去掉过渡效果//重新过渡var translatex = -index * w;ul.style.transform = 'translateX(' + translatex + 'px)';}//3.小圆点跟随变化//把ol里面li带有current类名的选出来,去掉类名ol.querySelector('li.current').classList.remove('current');//让当前索引号的li加上currentol.children[index].classList.add('current');});//4.手指滑动轮播图//触摸元素touchstart:获取手指初始坐标var startX = 0;var moveX = 0;var flag = false;//用来控制手指移动了才重新计算位置的变量ul.addEventListener('touchstart',function(e){startX = e.targetTouches[0].pageX;//手指要移动图片时,停止自动播放图片clearInterval(timer);});//移动手指touchmove:计算手指的滑动距离,并且移动盒子ul.addEventListener('touchmove',function(e){//移动距离 = 移动后的手指坐标 - 手指初始坐标moveX = e.targetTouches[0].pageX - startX;//移动盒子:盒子原来的位置 + 手指移动的距离\var translatex = -index * w + moveX;//手指拖动的时候,不需要动画效果,所以要取消过渡效果ul.style.transition = '';ul.style.transform = 'translateX(' + translatex + 'px)';flag = true;//如果用户手指移动过我们再去判断,否则不做判断效果e.preventDefault();//阻止滚动屏幕的默认行为});ul.addEventListener('touchend',function(e){//如果手指一动了再计算移动距离 节流阀if(flag){//如果移动距离大于50像素,就播放上一张或下一张,否则(小于50像素),回弹原位置if(Math.abs(moveX) > 50){//如果右滑(moveX为正)播放上一张,如果左滑(moveX为负)播放下一张if(moveX > 0){index--;}else{index++;}var translatex = -index * w;ul.style.transition = 'all .3s';ul.style.transform = 'translateX(' + translatex + 'px)';}else{var translatex = -index * w;ul.style.transition = 'all .1s';ul.style.transform = 'translateX(' + translatex + 'px)';}}//手指离开,重新启动定时器clearInterval(timer);//确保只有一个定时器在执行timer = setInterval(function(){index++;var translatex = -index * w;//移动的距离ul.style.transition = 'all .3s';ul.style.transform = 'translateX(' + translatex + 'px)';},2000);});});
.
