利用纯js + transition动画实现移动端web轮播图详解


Posted in Javascript onSeptember 10, 2017

前言

在上一篇文章中,我们使用 tween算法实现了 ease-out移动效果, 其实更简洁的方法是使用 css3的 transition动画,下面话不多说了,来一起看看详细的介绍吧。

核心点:

在 我们通过代码来移动一段距离的时候, 使用 transion动画;在手指移动的时候,不使用transition动画.

使用 transition实现的动画效果的轮播图js代码不足100行

~function () { 
  var lastPX = 0; // 上一次触摸的位置x坐标, 需要计算出手指每次移动的一点点距离 
  var movex = 0; // 记录手指move的x方向值 
  var imgWrap = document.getElementById('imgWrap'); 
  var startX = 0; // 开始触摸时手指所在x坐标 
  var endX = 0; // 触摸结束时手指所在的x坐标位置 
  var imgSize = imgWrap.children.length - 2; // 图片个数 
  var t1 = 0; // 记录开始触摸的时刻 
  var t2 = 0; // 记录结束触摸的时刻 
  var width = window.innerWidth; // 当前窗口宽度 
  var nodeList = document.querySelectorAll('#imgWrap img'); // 所有轮播图节点数组 NodeList 
 
  // 给图片设置合适的left值, 注意 querySelectorAll返回 NodeList, 具有 forEach方法 
  nodeList.forEach(function (node, index) { 
   node.style.left = (index - 1) * width + 'px'; 
  }); 
 
  /** 
   * 移动图片到当前的 tIndex索引所在位置 
   * @param {number} tIndex 要显示的图片的索引 
   * */ 
  function toIndex(tIndex) { 
   var dis = -(tIndex * width); 
   // 动画移动 
   imgWrap.style.transform = 'translate3d(' + dis + 'px, 0, 0)'; 
   imgWrap.style.transition = 'transform .2s ease-out'; 
   movex = dis; 
   // 索引到最后一张图片, 迅速切换索引到同一张图的初始位置 
   setTimeout(function () { 
    if (tIndex === imgSize) { 
     imgWrap.style.transform = 'translate3d(0, 0, 0)'; 
     imgWrap.style.transition = 'none'; 
     movex = 0; 
    } 
    if (tIndex === -1) { 
     imgWrap.style.transform = 'translate3d(' + width * (1 - imgSize) + 'px, 0, 0)'; 
     imgWrap.style.transition = 'none'; 
     movex = -width * (imgSize - 1); 
    } 
   }, 200); 
 
  } 
 
  /** 
   * 处理各种触摸事件 ,包括 touchstart, touchend, touchmove, touchcancel 
   * @param {Event} evt 回调函数中系统传回的 js 事件对象 
   * */ 
  function touch(evt) { 
   var touch = evt.targetTouches[0]; 
   var tar = evt.target; 
   var index = parseInt(tar.getAttribute('data-index')); 
   if (evt.type === 'touchmove') { 
    var di = parseInt(touch.pageX - lastPX); 
    endX = touch.pageX; 
    movex += di; 
    imgWrap.style.webkitTransform = 'translate3d(' + movex + 'px, 0, 0)'; 
    imgWrap.style.transition = 'none'; // 移动时避免动画延迟 
    lastPX = touch.pageX; 
   } 
   if (evt.type === 'touchend') { 
    var minus = endX - startX; 
    t2 = new Date().getTime() - t1; 
    if (Math.abs(minus) > 0) { // 有拖动操作 
     if (Math.abs(minus) < width * 0.4 && t2 > 500) { // 拖动距离不够,返回! 
      toIndex(index); 
     } else { // 超过一半,看方向 
      console.log(minus); 
      if (Math.abs(minus) < 20) { 
       console.log('距离很短' + minus); 
       toIndex(index); 
       return; 
      } 
      if (minus < 0) { // endX < startX,向左滑动,是下一张 
       toIndex(index + 1) 
      } else { // endX > 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); 
 
 }();

注意事项:

当切换到边界值的图时,应该等到切换动画效果之后再换到相同图内容的位置

所以:   我们使用setTimeout延迟执行 无限循环播放替换图位置的操作

至于 css 和 html嘛, 还是原来的配方, 还是原来的味道~参见这篇文章:https://3water.com/article/123303.htm

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jQueryUI如何自定义组件实现代码
Nov 14 Javascript
Jquery异步请求数据实例代码
Dec 28 Javascript
Javascript alert消息换行的方法
Aug 07 Javascript
js实现省市联动效果的简单实例
Feb 10 Javascript
每天一篇javascript学习小结(属性定义方法)
Nov 19 Javascript
JS获取数组最大值、最小值及长度的方法
Nov 24 Javascript
jquery单击事件和双击事件冲突解决方案
Mar 02 Javascript
学习AngularJs:Directive指令用法(完整版)
Apr 26 Javascript
深入分析javascript中的错误处理机制
Jul 17 Javascript
你知道setTimeout是如何运行的吗?
Aug 16 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
Sep 19 Javascript
ztree+ajax实现文件树下载功能
May 18 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
Sep 10 #Javascript
vue系列之动态路由详解【原创】
Sep 10 #Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
Sep 10 #Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
Sep 10 #Javascript
js 发布订阅模式的实例讲解
Sep 10 #Javascript
node.js 发布订阅模式的实例
Sep 10 #Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 #Javascript
You might like
PHP开发过程中常用函数收藏
2009/12/14 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
js模仿java的Map集合详解
2016/01/06 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
印度服装购物网站:Limeroad
2018/09/26 全球购物
出国留学自荐信
2013/10/25 职场文书
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
社团活动总结
2014/04/28 职场文书
企业宣传口号
2014/06/12 职场文书
伦敦奥运会口号
2014/06/13 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
交通事故案件代理词
2015/05/23 职场文书
创业计划书之农家乐
2019/10/09 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript
Python实现批量自动整理文件
2022/03/16 Python