利用纯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 相关文章推荐
Js组件的一些写法
Sep 10 Javascript
Javascript动态绑定事件的简单实现代码
Dec 25 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
May 27 Javascript
Vue2组件tree实现无限级树形菜单
Mar 29 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
May 07 Javascript
详解关于react-redux中的connect用法介绍及原理解析
Sep 11 Javascript
ES6中的Promise代码详解
Oct 09 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
May 30 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
Sep 14 Javascript
JavaScript实现美化滑块效果
May 17 Javascript
从零搭一个自用的前端脚手架的方法步骤
Sep 23 Javascript
Element Dialog对话框的使用示例
Jul 26 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上传文件问题汇总
2015/01/30 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
python实现在字符串中查找子字符串的方法
2015/07/11 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
导航工程专业自荐信
2014/09/02 职场文书
学校开学标语
2014/10/06 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
授权收款委托书范本
2014/10/10 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang
Redis如何实现分布式锁
2021/08/23 Redis