JS移动客户端--触屏滑动事件

移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成。但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件。处理touch事件能跟踪到屏幕滑动的每根手指。

以下是四种touch事件

touchstart:     //手指放到屏幕上时触发

touchmove:      //手指在屏幕上滑动式触发

touchend:    //手指离开屏幕时触发

touchcancel:     //系统取消touch事件的时候触发,这个好像比较少用

每个触摸事件被触发后,会生成一个event对象,event对象里额外包括以下三个触摸列表

touches:     //当前屏幕上所有手指的列表

targetTouches:      //当前dom元素上手指的列表,尽量使用这个代替touches

changedTouches:     //涉及当前事件的手指的列表,尽量使用这个代替touches

这些列表里的每次触摸由touch对象组成,touch对象里包含着触摸信息,主要属性如下:

clientX / clientY:      //触摸点相对浏览器窗口的位置

pageX / pageY:       //触摸点相对于页面的位置

screenX  /  screenY:    //触摸点相对于屏幕的位置

identifier:        //touch对象的ID

target:       //当前的DOM元素

注意:

手指在滑动整个屏幕时,会影响浏览器的行为,比如滚动和缩放。所以在调用touch事件时,要注意禁止缩放和滚动。

1.禁止缩放

通过meta元标签来设置。

<meta name="viewport" content="target-densitydpi=320,width=640,user-scalable=no">

2.禁止滚动

preventDefault是阻止默认行为,touch事件的默认行为就是滚动。

event.preventDefault();

案例:

下面给出一个案例,需在移动设备上才能看出效果。

1.定义touchstart的事件处理函数,并绑定事件:

if(!!self.touch) self.slider.addEventListener('touchstart',self.events,false);

//定义touchstart的事件处理函数
start:function(event){
  var touch = event.targetTouches[0]; //touches数组对象获得屏幕上所有的touch,取第一个touch
  startPos = {x:touch.pageX,y:touch.pageY,time:+new Date}; //取第一个touch的坐标值
  isScrolling = 0; //这个参数判断是垂直滚动还是水平滚动
  this.slider.addEventListener('touchmove',this,false);
  this.slider.addEventListener('touchend',this,false);
},

触发touchstart事件后,会产生一个event对象,event对象里包括触摸列表,获得屏幕上的第一个touch,并记下其pageX,pageY的坐标。定义一个变量标记滚动的方向。此时绑定touchmove,touchend事件。

2.定义手指在屏幕上移动的事件,定义touchmove函数。

//移动
move:function(event){
  //当屏幕有多个touch或者页面被缩放过,就不执行move操作
  if(event.targetTouches.length > 1 || event.scale && event.scale !== 1) return;
  var touch = event.targetTouches[0];
  endPos = {x:touch.pageX - startPos.x,y:touch.pageY - startPos.y};
  isScrolling = Math.abs(endPos.x) < Math.abs(endPos.y) ? 1:0; //isScrolling为1时,表示纵向滑动,0为横向滑动
  if(isScrolling === 0){
    event.preventDefault(); //阻止触摸事件的默认行为,即阻止滚屏
    this.slider.className = 'cnt';
    this.slider.style.left = -this.index*600 + endPos.x + 'px';
  }
},

同样首先阻止页面的滚屏行为,touchmove触发后,会生成一个event对象,在event对象中获取touches触屏列表,取得第一个touch,并记下pageX,pageY的坐标,算出差值,得出手指滑动的偏移量,使当前DOM元素滑动。

3.定义手指从屏幕上拿起的事件,定义touchend函数。

//滑动释放
end:function(event){
  var duration = +new Date - startPos.time; //滑动的持续时间
  if(isScrolling === 0){ //当为水平滚动时
    this.icon[this.index].className = '';
    if(Number(duration) > 10){ 
      //判断是左移还是右移,当偏移量大于10时执行
      if(endPos.x > 10){
        if(this.index !== 0) this.index -= 1;
      }else if(endPos.x < -10){
        if(this.index !== this.icon.length-1) this.index += 1;
      }
    }
    this.icon[this.index].className = 'curr';
    this.slider.className = 'cnt f-anim';
    this.slider.style.left = -this.index*600 + 'px';
  }
  //解绑事件
  this.slider.removeEventListener('touchmove',this,false);
  this.slider.removeEventListener('touchend',this,false);
},

手指离开屏幕后,所执行的函数。这里先判断手指停留屏幕上的时间,如果时间太短,则不执行该函数。再判断手指是左滑动还是右滑动,分别执行不同的操作。最后很重要的一点是移除touchmove,touchend绑定事件。

源代码:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" Content="text/html; charset=utf-8;">
  5. <title>移动端触摸滑动</title>
  6. <meta name="author" content="rainna" />
  7. <meta name="keywords" content="rainna's js lib" />
  8. <meta name="description" content="移动端触摸滑动" />
  9. <meta name="viewport" content="target-densitydpi=320,width=640,user-scalable=no">
  10. <style>
  11. *{margin:0;padding:0;}
  12. li{list-style:none;}
  13.  
  14. .m-slider{width:600px;margin:50px 20px;overflow:hidden;}
  15. .m-slider .cnt{position:relative;left:0;width:3000px;}
  16. .m-slider .cnt li{float:left;width:600px;}
  17. .m-slider .cnt img{display:block;width:100%;height:450px;}
  18. .m-slider .cnt p{margin:20px 0;}
  19. .m-slider .icons{text-align:center;color:#000;}
  20. .m-slider .icons span{margin:0 5px;}
  21. .m-slider .icons .curr{color:red;}
  22. .f-anim{-webkit-transition:left .2s linear;}
  23. </style>
  24. </head>
  25.  
  26. <body>
  27. <div class="m-slider">
  28. <ul class="cnt" id="slider">
  29. <li>
  30. <img src="http://imglf1.ph.126.net/qKodH3sZoVbPalKFtHS9mw==/6608946691259322175.jpg">
  31. <p>20140813镜面的世界,终究只是倒影。看得到你的身影,却触摸不到你的未来</p>
  32. </li>
  33. <li>
  34. <img src="http://imglf1.ph.126.net/40-jqH_j6EoCWnZOixY2pA==/4798022453110310215.jpg">
  35. <p>20140812锡林浩特前往东乌旗S101必经之处,一条极美的铁路。铁路下面是个小型的盐沼,淡淡的有了一丝天空之境的感觉。可惜在此玩了一个小时也没有看见一列火车经过,只好继续赶往东乌旗。</p>
  36. </li>
  37. <li>
  38. <img src="http://imglf0.ph.126.net/Jnmi2y51zVdjKAYlibtpFw==/3068640196117481166.jpg">
  39. <p>20140811水的颜色为什么那么蓝,我也纳闷,反正自然饱和度和对比度拉完就是这个颜色的</p>
  40. </li>
  41. <li>
  42. <img src="http://imglf1.ph.126.net/79GPsjhwiIj8e-0nP5MsEQ==/6619295294699949331.jpg">
  43. <p>海洋星球3重庆天气热得我想卧轨自杀</p>
  44. </li>
  45. <li>
  46. <img src="http://imglf1.ph.126.net/40-jqH_j6EoCWnZOixY2pA==/4798022453110310215.jpg">
  47. <p>以上这些作品分别来自两位设计师作为观者,您能否通过设计风格进行区分</p>
  48. </li>
  49. </ul>
  50. <div class="icons" id="icons">
  51. <span class="curr">1</span>
  52. <span>2</span>
  53. <span>3</span>
  54. <span>4</span>
  55. <span>5</span>
  56. </div>
  57. </div>
  58.  
  59. <script>
  60. var slider = {
  61. //判断设备是否支持touch事件
  62. touch:('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,
  63. slider:document.getElementById('slider'),
  64.  
  65. //事件
  66. events:{
  67. index:0, //显示元素的索引
  68. slider:this.slider, //this为slider对象
  69. icons:document.getElementById('icons'),
  70. icon:this.icons.getElementsByTagName('span'),
  71. handleEvent:function(event){
  72. var self = this; //this指events对象
  73. if(event.type == 'touchstart'){
  74. self.start(event);
  75. }else if(event.type == 'touchmove'){
  76. self.move(event);
  77. }else if(event.type == 'touchend'){
  78. self.end(event);
  79. }
  80. },
  81. //滑动开始
  82. start:function(event){
  83. var touch = event.targetTouches[0]; //touches数组对象获得屏幕上所有的touch,取第一个touch
  84. startPos = {x:touch.pageX,y:touch.pageY,time:+new Date}; //取第一个touch的坐标值
  85. isScrolling = 0; //这个参数判断是垂直滚动还是水平滚动
  86. this.slider.addEventListener('touchmove',this,false);
  87. this.slider.addEventListener('touchend',this,false);
  88. },
  89. //移动
  90. move:function(event){
  91. //当屏幕有多个touch或者页面被缩放过,就不执行move操作
  92. if(event.targetTouches.length > 1 || event.scale && event.scale !== 1) return;
  93. var touch = event.targetTouches[0];
  94. endPos = {x:touch.pageX - startPos.x,y:touch.pageY - startPos.y};
  95. isScrolling = Math.abs(endPos.x) < Math.abs(endPos.y) ? 1:0; //isScrolling为1时,表示纵向滑动,0为横向滑动
  96. if(isScrolling === 0){
  97. event.preventDefault(); //阻止触摸事件的默认行为,即阻止滚屏
  98. this.slider.className = 'cnt';
  99. this.slider.style.left = -this.index*600 + endPos.x + 'px';
  100. }
  101. },
  102. //滑动释放
  103. end:function(event){
  104. var duration = +new Date - startPos.time; //滑动的持续时间
  105. if(isScrolling === 0){ //当为水平滚动时
  106. this.icon[this.index].className = '';
  107. if(Number(duration) > 10){
  108. //判断是左移还是右移,当偏移量大于10时执行
  109. if(endPos.x > 10){
  110. if(this.index !== 0) this.index -= 1;
  111. }else if(endPos.x < -10){
  112. if(this.index !== this.icon.length-1) this.index += 1;
  113. }
  114. }
  115. this.icon[this.index].className = 'curr';
  116. this.slider.className = 'cnt f-anim';
  117. this.slider.style.left = -this.index*600 + 'px';
  118. }
  119. //解绑事件
  120. this.slider.removeEventListener('touchmove',this,false);
  121. this.slider.removeEventListener('touchend',this,false);
  122. }
  123. },
  124.  
  125. //初始化
  126. init:function(){
  127. var self = this; //this指slider对象
  128. if(!!self.touch) self.slider.addEventListener('touchstart',self.events,false); //addEventListener第二个参数可以传一个对象,会调用该对象的handleEvent属性
  129. }
  130. };
  131.  
  132. slider.init();
  133. </script>
  134. </body>
  135. </html>

JS移动客户端--触屏滑动事件 banner图效果的更多相关文章

  1. JS移动客户端--触屏滑动事件

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  2. JS移动客户端--触屏滑动事件及js手机拖拽效果

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  3. js实现touch移动触屏滑动事件

    在开始描述touch事件之前,需要先描述一下多触式系统中特有的touch对象(android和iOS乃至nokia最新的meego系统都模拟了类 似的对象).这个对象封装一次屏幕触摸,一般来自于手指. ...

  4. touch移动触屏滑动事件

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  5. 移动端touch触屏滑动事件、滑动触屏事件监听!

    一.触摸事件 ontouchstart.ontouchmove.ontouchend.ontouchcancel 目前移动端浏览器均支持这4个触摸事件,包括IE.由于触屏也支持MouseEvent,因 ...

  6. JavaScript触屏滑动API介绍

    随着触屏手机.平板电脑的普及和占有更多用户和使用时间,触屏的触碰.滑动等事件也成为javaScript开发不可避免的知识,现在何问起就和大家一起学习js的触屏操作,js的触屏touchmove事件,为 ...

  7. 朋友圈常见单页面触屏滑动上下翻屏功能jQuery实现

    翻页插件:实现原理,用margin-top来控制页面容器位置来实现上下翻页.margin这属性很好用,可以用来制作侧栏动画滑出菜单(左菜单,右内容,控制两者的margin实现):或者head下滑菜单 ...

  8. 移动端触屏滑动,JS事件

    先了解下 移动端的触屏滑动 毕竟这玩意其实和PC端还是有一定的区别的 hh 整理了下网上的资料放一放 移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等 ...

  9. 自己用原生JS写的轮播图,支持移动端触屏滑动,面向对象思路。分页器圆点支持click和mouseover。

    自己用原生javascript写的轮播图,面向对象思路,支持移动端手指触屏滑动.分页器圆点可以选择click点击或mouseover鼠标移入时触发.图片滚动用的setInterval,感觉setInt ...

随机推荐

  1. 处理FF margin-top下降问题

    处理DIV子级ZImargin-top下降,父级更着下降问题 html结构如下 <div id="top"> <div id="zi"> ...

  2. 如果 if - 迈克.杰克逊的墓志铭

    引用http://www.duwenzhang.com/wenzhang/yingyuwenzhang/20110215/171059.html IF you can keep your head w ...

  3. BootCDN和npm

    稳定.快速.免费的开源项目 CDN 服务 BootCDN: jQuery3 <script type="text/javascript" src="http://c ...

  4. try catch finally的一些用法

    一:例题: package test; import javax.swing.*; class AboutException { public static void main(String[] a) ...

  5. 《DSP using MATLAB》示例Example5.5

    代码: %% ---------------------------------------------------------- %% START N=5 %% ------------------ ...

  6. Python Web 开发的十个框架【转载】

    Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...

  7. CSS3-html,样式与样式表的创建,选择器

  8. 记一次mybatis的classpath踩坑记录

    http://blog.csdn.net/jinzhencs/article/details/50595476

  9. java基础-操作符

    浏览以下内容前,请点击并阅读 声明 定义:操作符是一种能够对一个,两个或三个操作对象执行特定的操作,并返回一个结果的特定符号. java中操作符的种类和优先级如下表所示,除了赋值运算,所有二元操作符运 ...

  10. ural 1069. Prufer Code

    1069. Prufer Code Time limit: 0.25 secondMemory limit: 8 MB A tree (i.e. a connected graph without c ...