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 相关文章推荐
iframe里面的元素触发父窗口元素事件的jquery代码
Oct 19 Javascript
jQuery插件实现控制网页元素动态居中显示
Mar 24 Javascript
浅谈window对象的scrollBy()方法
Jul 15 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
Nov 24 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
Dec 08 Javascript
JavaScript中的this到底是什么(一)
Dec 09 Javascript
微信小程序 触控事件详细介绍
Oct 17 Javascript
EasyUI创建人员树的实例代码
Sep 15 Javascript
vue中如何创建多个ueditor实例教程
Nov 14 Javascript
详解Vue快速零配置的打包工具——parcel
Jan 16 Javascript
小程序实现左滑删除功能
Oct 30 Javascript
基于ajax及jQuery实现局部刷新过程解析
Sep 12 jQuery
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读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
bootstrap weebox 支持ajax的模态弹出框
2017/02/23 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
Python 登录网站详解及实例
2017/04/11 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
python怎么调用自己的函数
2020/07/01 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
html5跨域通讯之postMessage的用法总结
2013/11/07 HTML / CSS
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
高中军训感言500字
2014/02/24 职场文书
2014年党支部学习材料
2014/05/19 职场文书
李强优秀员工观后感
2015/06/16 职场文书