JavaScript实现移动端轮播效果


Posted in Javascript onJune 06, 2017

这个轮播代码不是我自己所写,是偶然游览一个简友的主页看到的,今天刚看了事件,决定来逐行分析一下这个代码。首先,移动端与电脑端不同的是移动端只能通过触摸和手势来发生行为,所以我们要用到js中的与触摸操作有关的新事件。其实我们轮播的原理和以前相同,都是通过改变元素的位置来控制图片的出现,但让我们不是很上手的,是那些用于跟踪触摸的属性。

下面,我简单介绍一下与触摸相关的知识

触摸事件

  • touchstart:当手指触摸屏幕时触发,一只手指放在屏幕上也会触发
  • touchmove:当手指在屏幕上滑动时连续触发。在这个事件发生期间可以用preventDefault()可以阻止滚动。
  • touchend:手指从屏幕移开时触发。
  • touchcancel:当系统停止跟踪触发时触发。

上面这几个事件都会冒泡,也都可以取消。

属性

  • touches:表示当前跟踪的触摸操作的Touch对象的数组
  • targetTouches:特定于事件目标的Touch对象的数组。(简单点可以理解为手指触摸屏幕的位置)
  • changeTouches表示自上次触摸以来发生了什么改变的touch对象的数组。(手指离开的位置)

每个touch对象包括下列属性

  • clientX:触摸目标在视口中的x坐标
  • clientY:触摸目标在视口中的y坐标
  • identifier:标识触摸的唯一ID
  • pageX:触摸目标在页面中的x坐标
  • pageY:触摸目标在页面中的y坐标
  • screenX:触摸目标在页面中的x坐标
  • screenY:触摸目标在页面中的y坐标
  • target:触摸的dom节点目标

代码如下

<!DOCTYPE html>
<html>
<head>
 <title>移动端轮播</title>
 <style type="text/css">
  * {
   margin: 0;
   padding: 0;
  }
  #box {
   width: 980px;
   overflow: hidden;
   position: relative;
   margin: 0 auto;
  }
  #box ul {
   width: 4900px;
   height: 100px;
   position: relative;
   transform: translateX(-980px);
   
  }
  #box ul li{
   width: 980px;
   height: 100px;
   float: left;
   list-style-type: none;
   text-align: center;
   color: #fff;
   line-height: 100px;
   font-size: 30px;
  }
 </style>
 <script type="text/javascript">
  window.onload = function() {
   var box = document.getElementById('box');
   var oUl = document.getElementsByTagName('ul')[0];
   var aLi = oUl.children;//这样就可以把所有li标签获取到了
   var iNow = 1;
   var x = -iNow*aLi[0].offsetWidth;//li标签的位置
   var bReady = true;
   oUl.addEventListener('touchstart',function(ev){

    //当手指触摸屏幕的时候触发事件,让li的位置随手指滑动而改变
    if(bReady == false){return;}
    bReady = false; 
      
    var downX = ev.targetTouches[0].pageX; //记录触摸位置 
    var disX = downX - x;//下一个li要移动到的位置
    function fnMove(ev) {
     x = downX-disX;
     oUl.style.transform = 'translate3d('+x+'px,0,0)';
    }
    function fnEnd(ev){
     var upX = ev.changedTouches[0].pageX;//离开的位置
     if(Math.abs(upX - downX)>50){
      //左边移动
      if(upX - downX<0){
       iNow++;
       if(iNow==aLi.length){iNow=aLi.length-1;}
      }else{
      //右边移动
       iNow--;
       if(iNow==-1){iNow=0;}
      }
     }
     x = -iNow*aLi[0].offsetWidth;
     oUl.style.transform = 'translate3d('+x+'px,0,0)';
     oUl.style.transition = '200ms all ease';
     function tEnd(){
      if(iNow==4){
       iNow=1;
      }
      if(iNow==0){iNow=3;}
      oUl.style.transition = 'none'
      x = -iNow*aLi[0].offsetWidth;
      oUl.style.transform = 'translate3d('+x+'px,0,0)';
      bReady = true;
     } 
     oUl.addEventListener('transitionend',tEnd,false);
     //释放内存
     document.removeEventListener('touchend',fnEnd,false);
     document.removeEventListener('touchmove',fnMove,false);

    }
    document.addEventListener('touchmove',fnMove,false);
    document.addEventListener('touchend',fnEnd,false);
    //阻止默认事件
    ev.preventDefault();
   },false);

  }
 </script>
</head>
<body>
 <div id="box"> 
 <ul>
  <li style="background:green">3</li>
  <li style="background:orange">1</li>
  <li style="background:yellow">2</li>
  <li style="background:green">3</li>
  <li style="background:orange">1</li>
 </ul>
 </div> 
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery $.ajax入门应用二
Nov 19 Javascript
Ext javascript建立超链接,进行事件处理的实现方法
Mar 22 Javascript
javascript 显示当前系统时间代码
Dec 28 Javascript
jquery ui resizable bug解决方法
Oct 26 Javascript
全面解析Bootstrap中transition、affix的使用方法
May 30 Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 Javascript
JS中检测数据类型的几种方式及优缺点小结
Dec 12 Javascript
jQuery+HTML5实现弹出创意搜索框层
Dec 29 Javascript
JS获取url参数,JS发送json格式的POST请求方法
Mar 29 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
May 03 jQuery
在Vant的基础上实现添加表单验证框架的方法示例
Dec 05 Javascript
微信小程序tabBar设置实例解析
Nov 14 Javascript
js评分组件使用详解
Jun 06 #Javascript
javascript中mouseenter与mouseover的异同
Jun 06 #Javascript
jquery仿京东商品放大浏览页面
Jun 06 #jQuery
Node.js连接mongodb实例代码
Jun 06 #Javascript
jquery实现图片放大点击切换
Jun 06 #jQuery
AngularJS 验证码60秒倒计时功能的实现
Jun 05 #Javascript
AngularJS 支付倒计时功能实现思路
Jun 05 #Javascript
You might like
php设计模式  Command(命令模式)
2011/06/17 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
php中autoload的用法总结
2013/11/08 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
Prototype源码浅析 Number部分
2012/01/16 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
JavaScript中的闭包
2016/02/24 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
简洁的十分钟Python入门教程
2015/04/03 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
使用Python处理BAM的方法
2018/09/28 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
乌鸦喝水教学反思
2014/02/07 职场文书
植树节标语
2014/06/27 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
商家认证委托书格式
2014/10/16 职场文书
2014年司法局工作总结
2014/12/11 职场文书
安徽导游词
2015/02/12 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
土建施工员岗位职责
2015/04/11 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python
oracle delete误删除表数据后如何恢复
2022/06/28 Oracle