小编给大家分享一下利用H5实现一个轮播器触屏版的案例,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!
初入前端,分享一下手机上触屏版轮播器的实现过程,大致功能如下:
- <李>
支持循环滑动
李> <李>宽度可任意设置,不需要与屏幕等宽
李> <李>页面可纵向滚动
李> <李>可设置回调监听元素的切换
李> <李>纯js,不借助任何第三方库
李>原理
- <李>
假设子元素<代码> .item 代码>的<代码> 代码>宽度为375像素,使用绝对定位将所有子元素放在父元素内
李> <李>将父元素<代码> .carousel 代码>的<代码> 代码>宽度设置为375 px,与子元素<代码> .item 代码>宽度相同
李> <李>为父元素<代码>。旋转木马> 代码添加触摸事件:<代码> touchstart 代码>,<代码> touchmove 代码>,<代码> touchend 代码>
李> <李>手指按下时,保存初始位置(<代码> clientX> 代码)
李> <李>手指滑动时,通过滑动距离判断滑动的方向:
李>- <李>
手指向左滑动,则同时移动当前元素和当前元素右边的元素
李> <李>手指向右滑动,则同时移动当前元素和当前元素左边的元素
李>手指抬起时,通过滑动距离判断是否切换到下一页
李>- <李>
移动距离未超过子元素宽度的50%,将当前页面回滚到初始位置,不切换当前元素。
李> <李>移动距离超过子元素宽度的50%,切换当前元素为下一个元素。
李> <李>将当前元素的<代码> 代码>属转换性设置为<代码> translate3d (0 px, 0 px, 0 px)> 代码,并将<代码> z - index 代码>属性+ 1
李> <李>将下一个子元素的<代码> 代码>属转换性设置为<代码> translate3d (375 px, 0 px, 0 px)> 代码,并将<代码> z - index 代码>属性+ 1
李> <李>将上一个子元素的<代码> 代码>属转换性设置为<代码> translate3d (-375 px, 0 px, 0 px)> 代码,并将<代码> z - index 代码>属性+ 1
李> <李>将其他所有子元素的z - index <代码> 代码>属性设置为默认值
李>第一个子元素的上一个元素是最后一个元素,最后一个元素的下一个元素是第一个元素,该步骤通过循环链表实现。
李>移动时设置的是子元素.item属的变换性,而不是父元素<代码> .carousel 代码>
引用>实现步骤
html& css
//html 类& lt; p=癱arousel">函数节点(数据){ 这一点。数据=https://www.yisu.com/zixun/data; 这一点。prev=零; 这一点。下一个=零; 这一点。指数=1; }//双向循环列的表 函数LinkList () { var _nodes=[]; 这一点。头=零; 这一点。去年=零; 如果(typeof。追加!==昂?{ LinkList.prototype。附加=function(节点){ 如果这一点。头==null) { 这一点。头=节点; 这一点。去年=this.head; } 其他{ this.head。prev=节点; this.last。下一个=节点; 节点。prev=this.last; 节点。下一个=this.head; 这一点。去年=节点; } 节点。指数=_nodes.length;//务必在推动前设置node.index _nodes.push(节点); } } }有了链表之后,创建一个链表实例,将子元素添加进链表内,并设置一些初始状态
var _container=document.querySelector (“!”+ containerClass); var _items=document.querySelectorAll (“!”+ itemClass); var=列表循环?新的LinkList():新SingleList (); (var=0;我& lt;_items.length;我+ +){ 列表。追加(新节点(_items[我])); } var _prev=零;//保存之前显示的元素 var _current=list.head;//保存当前显示的元素,默认为第一个元素 var _normalZIndex=_current.data.style.zIndex;//未显示元素的z - index值 var _activeZIndex=_normalZIndex + 1;//当前显示元素的z - index值 var _itemWidth=_current.data.offsetWidth;//子元素宽度 positionItems ();//初始化元素位置 zindexItems (_current _activeZIndex);//将当前元素及其左右元素的z - index加1绑定触摸事件
touchstart事件
手指按下时,保存初始位置
_container.addEventListener (“touchstart",函数(e) {//e.preventDefault();//取消此行代码的注释会在该元素内阻止页面纵向滚动 var=联系e.touches [0]; startX=touch.clientX;//保存手指按下时的位置 startY=touch.clientY; _container.style。webkitTransition=?“;//取消动画效果 .getTime startT=new日期()();//记录手指按下的开始时间 isMove=false; transitionItems (_prev假);//取消之前元素的过渡 transitionItems (_current假);//取消当前元素的过渡 },假);利用H5实现一个轮播器触屏版的案例