主页 > 前端 > javascript >
来源:未知 时间:2017-09-11 15:10 作者:xxadmin 阅读:次
[导读] 在做移动端开发的时候,必不可少的是轮播图,下面这篇文章主要给大家介绍了关于利用纯JS实现移动端web轮播图的相关资料,重要的是结合Tween算法造轮子,文中通过示例代码介绍的非...
前言 相信大家应该都知道,移动端的轮播图是我们比较常见的需求, 我们最快的实现方式往往是 使用第三方的代码, 例如 swiper , 但当遇到一些比较复杂的轮播图需求时, 往往是束手无策,不知道怎么改. 所以我们要尝试去自己造一些轮子, 以适应各种复杂多变的需求; 另外一点, 自己写的代码如果有bug是很容易修复的, 对自身的提高也很大. 在没有阅读swiper源码的过程下,我尝试自己实现一个简易而不失实用的移动端轮播图, 经过几个小时的思考和实践终于还是实现了(如图): 实现移动端的轮播图要比pc复杂一些,主要表现在以下几个方面: 1.轮播图要适应不同宽度/dpr的屏幕 2.需要使用 touch相关的事件 3.不同机型对 touch事件支持的不太一样,可能会有一些兼容性问题 4.手指移动图片一部分距离,剩下的距离需要自动完成 5.自动完成距离需要有 ease 时间曲线 但编程解决问题的思路都是差不多的, 我们在使用轮播图的时候可以仔细观察,通过现象看到本质:
我们通过分析现象,可以提出一个基本实现方案: 1. 手指触摸事件可以通过 touchstart touchmove touchend 3个事件来实现 2.在手指 touchstart的时候我们需要记录 手指的x坐标, 可以使用 touch的pageX属性; 还有 这个时间点, 3.手指touchmove的时候我们也需要记录pageX,并且记录累计移动的距离 moveX 4.手指离开的时候,记录时间点, 根据前两步计算的 x方向移动的距离,时间点之差 5.通过比较x方向移动距离来判断移动方向, 以及是否应该切换到下一张图; 根据时间判断用户是否进行了左右扫动的操作 6.移动图片可以使用 translate3d来实现,开启硬件加速 7.移动一段距离需要 easeOut效果,我们可以使用 Tween算法中的easeOut来实现我们每次移动的距离; 当然也可以使用 js设置 transition动画 实现源码(仅供参考): head头部样式 移动端轮播图 HTML结构 JS代码1, easeOut动画式移动, 这里的 HTMLElement.prototype.tweenTranslateXAnimate ,是给所有的HTML元素类扩展的tweenTranslateXAnimate方法 移动一段距离我们需要使用定时器来帮助我们完成,这个重复的操作 0 && parseInt(this.style.transform.slice(12)) >= end) { this.style.transform = 'translate3d(' + parseInt(dis) + 'px, 0, 0)'; clearInterval(this.timer); callback && callback(); } if (vv touch事件部分 0) { // 有拖动操作 if (Math.abs(minus) 500) { // 拖动距离不够,返回! toIndex(index); } else { // 超过一半,看方向 console.log(minus); if (Math.abs(minus) startX ,向右滑动, 是上一张 toIndex(index - 1) } } } else { //没有拖动操作 } } if (evt.type === 'touchstart') { lastPX = touch.pageX; startX = lastPX; endX = startX; t1 = new Date().getTime(); } return false; } imgWrap.addEventListener('touchstart', touch, false); imgWrap.addEventListener('touchmove', touch, false); imgWrap.addEventListener('touchend', touch, false); imgWrap.addEventListener('touchcancel', touch, false); }();" _ue_custom_node_="true"> 在触摸事件中最关键的参数是 pageX参数, 记录x的位置. 当然这只是一个demo,还需要进一步的优化和封装, 以便于我们用在真实的项目. 本demo仅仅是提供了一个解决问题的思路, 有了这个思路,相信各种复杂的需求也得以解决... 本文中使用的 tween算法来实现 ease-out效果 ,也可以使用 transtion动画实现, 代码更加简洁,参见轮播图优化篇: http://www.jb51.net/article/123304.htm |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com