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 相关文章推荐
最新28个很棒的jQuery 教程
May 28 Javascript
把jquery 的dialog和ztree结合实现步骤
Aug 02 Javascript
js实现按Ctrl+Enter发送效果
Sep 18 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
Aug 05 Javascript
javascript中offset、client、scroll的属性总结
Aug 13 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
Dec 04 Javascript
JavaScript闭包实例详解
Jun 03 Javascript
node.js路径处理方法以及绝对路径详解
Mar 04 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
Feb 17 Javascript
angularjs 获取默认选中的单选按钮的value方法
Feb 28 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
Feb 17 Javascript
vue实现购物车列表
Jun 30 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
WINXP下apache+php4+mysql
2006/11/25 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
jQuery上传多张图片带进度条样式(DEMO)
2017/03/02 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
基于vue实现分页效果
2017/11/06 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
[07:39]第一届亚洲邀请赛回顾视频
2017/02/14 DOTA
python之yield表达式学习
2014/09/02 Python
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
python3+PyQt5实现柱状图
2018/04/24 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
Python中pass的作用与使用教程
2020/11/13 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
内容编辑个人求职信
2013/12/10 职场文书
仓库理货员岗位职责
2013/12/18 职场文书
工程招投标邀请书
2014/01/26 职场文书
代办委托书怎样写
2014/04/08 职场文书
产品售后服务承诺书
2014/05/21 职场文书
小学感恩节活动总结
2015/03/24 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技