四种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是阻止默认行为,在touchMove事件中使用可阻止默认行为滚动

event.preventDefault();

3.解决穿透
在touchStart事件后添加touchMove事件的监听,在touchMove事件里添加touchEnd事件的监听,在touchEnd事件中移除touchMove和touchEnd的事件监听,即可解决穿透问题

4.removeEventListener
传入的处理事件函数一定是相同的函数,不能是匿名函数

案例

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" Content="text/html; charset=utf-8;">
<title>移动端触摸滑动</title>
<meta name="author" content="rainna" />
<meta name="keywords" content="rainna's js lib" />
<meta name="description" content="移动端触摸滑动" />
<meta name="viewport" content="target-densitydpi=320,width=640,user-scalable=no">
<style>
*{margin:0;padding:0;}
li{list-style:none;}.m-slider{width:600px;margin:50px 20px;overflow:hidden;}
.m-slider .cnt{position:relative;left:0;width:3000px;}
.m-slider .cnt li{float:left;width:600px;}
.m-slider .cnt img{display:block;width:100%;height:450px;}
.m-slider .cnt p{margin:20px 0;}
.m-slider .icons{text-align:center;color:#000;}
.m-slider .icons span{margin:0 5px;}
.m-slider .icons .curr{color:red;}
.f-anim{-webkit-transition:left .2s linear;}
</style>
</head><body>
<div class="m-slider"><ul class="cnt" id="slider"><li><img src="http://imglf1.ph.126.net/qKodH3sZoVbPalKFtHS9mw==/6608946691259322175.jpg"><p>20140813镜面的世界,终究只是倒影。看得到你的身影,却触摸不到你的未来</p></li><li><img src="http://imglf1.ph.126.net/40-jqH_j6EoCWnZOixY2pA==/4798022453110310215.jpg"><p>20140812锡林浩特前往东乌旗S101必经之处,一条极美的铁路。铁路下面是个小型的盐沼,淡淡的有了一丝天空之境的感觉。可惜在此玩了一个小时也没有看见一列火车经过,只好继续赶往东乌旗。</p></li><li><img src="http://imglf0.ph.126.net/Jnmi2y51zVdjKAYlibtpFw==/3068640196117481166.jpg"><p>20140811水的颜色为什么那么蓝,我也纳闷,反正自然饱和度和对比度拉完就是这个颜色的</p></li><li><img src="http://imglf1.ph.126.net/79GPsjhwiIj8e-0nP5MsEQ==/6619295294699949331.jpg"><p>海洋星球3重庆天气热得我想卧轨自杀</p></li><li><img src="http://imglf1.ph.126.net/40-jqH_j6EoCWnZOixY2pA==/4798022453110310215.jpg"><p>以上这些作品分别来自两位设计师作为观者,您能否通过设计风格进行区分</p></li></ul><div class="icons" id="icons"><span class="curr">1</span><span>2</span><span>3</span><span>4</span><span>5</span></div>
</div><script>
var slider = {//判断设备是否支持touch事件touch:('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,slider:document.getElementById('slider'),//事件events:{index:0,     //显示元素的索引slider:this.slider,     //this为slider对象icons:document.getElementById('icons'),icon:this.icons.getElementsByTagName('span'),handleEvent:function(event){var self = this;     //this指events对象if(event.type == 'touchstart'){self.start(event);}else if(event.type == 'touchmove'){self.move(event);}else if(event.type == 'touchend'){self.end(event);}},//滑动开始start:function(event){var touch = event.targetTouches[0];     //touches数组对象获得屏幕上所有的touch,取第一个touchstartPos = {x:touch.pageX,y:touch.pageY,time:+new Date};    //取第一个touch的坐标值isScrolling = 0;   //这个参数判断是垂直滚动还是水平滚动this.slider.addEventListener('touchmove',this,false);this.slider.addEventListener('touchend',this,false);},//移动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';}},//滑动释放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);}},//初始化init:function(){var self = this;     //this指slider对象if(!!self.touch) self.slider.addEventListener('touchstart',self.events,false);    //addEventListener第二个参数可以传一个对象,会调用该对象的handleEvent属性}
};slider.init();
</script>
</body>
</html>

原生js实现移动端touch事件,解决穿透问题相关推荐

  1. 原生js的scroll和touch事件

    1.各属性的所代表的区域 网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.b ...

  2. 原生JS实现移动端模块的左右滑动切换效果,基于vue、stylus

    原生JS实现移动端模块的左右滑动动画效果,基于vue.stylus 大概实现方案: 手指touch屏幕的整个过程,会派发touchstart.touchmove.touchend三个事件,对这三个事件 ...

  3. html禁止页面左右滑动,js阻止移动端默认事件以及只阻止横向滚动事件方法

    js阻止移动端默认事件,是在相关的touch事件的时候利用event.preventDefault();来阻止默认滚动行为,但是如果要实现阻止横向滚动行为而不阻止竖向滚动行为就要写一个方法通过手指滑动 ...

  4. 移动端touch事件和click事件的区别

    移动端touch事件和click事件的区别 1.touch事件 以下是四种touch事件 touchstart:     //手指放到屏幕上时触发 touchmove:      //手指在屏幕上滑动 ...

  5. 搞定移动端一(移动端 touch 事件,TouchEvent 对象)

    移动端事件 1.目标 掌握移动端 touch 事件使用 掌握 touch 事件和 mouse 事件的区别 掌握 touchEvent 实现移动端幻灯片 2.移动端touch事件 touchstart ...

  6. demo h5 touch 移动_H5案例分享:移动端touch事件判断滑屏手势的方向

    移动端touch事件判断滑屏手势的方向 方法一 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touchmove事件时,在获取此时手指的横坐标 ...

  7. html移动端选择器插件,原生js实现移动端选择器插件

    原生js实现移动端选择器插件 前言 插件功能只满足我司业务需求,如果希望有更多功能的,可在下方留言,我尽量扩展!如果你有需要或者喜欢的话,可以给我github来个star ? 预览 准备 首先在页面中 ...

  8. 原生JS实现移动端选择器插件

    原生js实现移动端选择器插件 仓库地址 在线预览(记得将浏览器切换到手机模式) 预览 准备 首先在页面中引入css,js文件 每次需要弹出该组件时通过new一个实例来生成,代码如下: var data ...

  9. 移动端 touch事件 过渡事件 动画事件

    移动端首先要书写meta标签 <meta type="viewport" content="width=device-width,user-scalable=no, ...

最新文章

  1. 【图论专题】单源最短路的综合应用
  2. java temporalfield_Java Year isSupported(TemporalField)用法及代码示例
  3. oracle 去除重复的信息
  4. Vue.js安装使用教程
  5. Error running ‘Unnamed‘: Unable to open debugger port (127.0.0.1:xxxx)
  6. 全球AI人才只有2万多,仅3000人在求职 | 报告
  7. Fluentd: Open Source Log Management
  8. Predict user model based on genus
  9. Delphi2010新手学习(1)
  10. CE教程第八关——搜索4级指针
  11. gson读取json字符串_通过Gson解析Json数据
  12. 软考高项之项目变更管理
  13. python 区块链开发教程_区块链开发教程分享【201904】
  14. ApacheCN 翻译/校对/笔记整理活动进度公告 2019.9.20
  15. vega56刷64_AMD Vega 56显卡能刷成Vega 64真相了
  16. 四川服务器磁盘阵列卡电池性能,内置磁盘阵列卡的不足之处
  17. Cartographer 3D 建图实战-(基于禾赛32线雷达和Xsens MTi-G-710 组合导航模块,松灵Scout mini 底盘实际进行实验)
  18. √【西班牙语español学习】字母 发音 节奏语调
  19. html i标签是什么意思,html中为什么用i标签i/i作小图标
  20. 用于暴露感测的太阳传感器_凯利讯半导体

热门文章

  1. c语言数组输入4个学生3门课成绩,编程题 从键盘输入4个学生和3门课的成绩至数组中,并求出每个学生3门课的平均成绩。...
  2. 查出每门课都大于80分的学生的姓名
  3. 华侨大学复杂美产教融合
  4. Linux下检测FTP服务并开启FTP服务
  5. MySQL存储用户点赞的信息_基于redis实现的点赞功能设计
  6. 中国将强势反击,或暂停采购波音飞机,波音或因此受重击
  7. 利用FTP程序有效防止木马的方法
  8. 周六福老庙等35批次黄金抽检不合格,你的饰品标签贴对了吗?
  9. 编写一个程序,输入一组字符串,将字符串中的小写字母转换为大写字母(其它字符不变)并输出。
  10. 关于Unity unsafe的解决