一、移动端事件有哪些
- 触摸事件
touch事件
pointer事件
- 手势( gesture)事件
- 传感器( sensor)事件
二、touch事件
- touch 相关的事件跟普通的其他 dom 事件一样使用,可以直接用 addEventListener 来监听和处理。
最基本的 touch 事件包括4个事件:
- touchstart:当在屏幕上按下手指时触发
- touchmove:当在屏幕上移动手指时触发
- touchend:当在屏幕上抬起手指时触发
- touchcancel:当一些更高级别的事件发生的时候(如电话接入或者弹出信息)会取消当前的 touch 操作,即触发 touchcancel。一般会在 touchcancel 时暂停游戏、存档等操作。
三、touch的实例属性
(1)Touch.identifier
Touch.identifier
属性返回一个整数,表示触摸点的唯一 ID。这个值在整个触摸过程保持不变,直到触摸事件结束。
(2)Touch.screenX,Touch.screenY,Touch.clientX,Touch.clientY,pageX,pageY
Touch.screenX
属性和Touch.screenY
属性,分别表示触摸点相对于屏幕左上角的横坐标和纵坐标,与页面是否滚动无关。Touch.clientX
属性和Touch.clientY
属性,分别表示触摸点相对于浏览器视口左上角的横坐标和纵坐标,与页面是否滚动无关。Touch.pageX
属性和Touch.pageY
属性,分别表示触摸点相对于当前页面左上角的横坐标和纵坐标,包含了页面滚动带来的位移。
(3)Touch.radiusX,Touch.radiusY,Touch.rotationAngle
Touch.radiusX
属性和Touch.radiusY
属性,分别返回触摸点周围受到影响的椭圆范围的 X 轴半径和 Y 轴半径,单位为像素。乘以 2 就可以得到触摸范围的宽度和高度。Touch.rotationAngle
属性表示触摸区域的椭圆的旋转角度,单位为度数,在0
到90
度之间。- 上面这三个属性共同定义了用户与屏幕接触的区域,对于描述手指这一类非精确的触摸,很有帮助。指尖接触屏幕,触摸范围会形成一个椭圆,这三个属性就用来描述这个椭圆区域。
(4)Touch.force
Touch.force
属性返回一个0
到1
之间的数值,表示触摸压力。0
代表没有压力,1
代表硬件所能识别的最大压力。
(5)Touch.target
Touch.target
属性返回一个元素节点,代表触摸发生时所在的那个元素节点。即使触摸点已经离开了这个节点,该属性依然不变。
四、touch事件的实例属性
(1)TouchEvent.altKey,TouchEvent.ctrlKey,TouchEvent.shiftKey,TouchEvent.metaKey
TouchEvent.altKey
:布尔值,表示触摸时是否按下了 Alt 键。TouchEvent.ctrlKey
:布尔值,表示触摸时是否按下了 Ctrl 键。TouchEvent.shiftKey
:布尔值:表示触摸时是否按下了 Shift 键。TouchEvent.metaKey
:布尔值,表示触摸时是否按下了 Meta 键(或 Windows 键)。
(2)TouchEvent.changedTouches
TouchEvent.changedTouches
属性返回一个TouchList
实例,成员是一组Touch
实例对象,表示本次触摸事件的相关触摸点。对于不同的时间,该属性的含义有所不同。
touchstart
事件:被激活的触摸点touchmove
事件:发生变化的触摸点touchend
事件:消失的触摸点(即不再被触碰的点)
(3)TouchEvent.touches
TouchEvent.touches
属性返回一个TouchList
实例,成员是所有仍然处于活动状态(即触摸中)的触摸点。一般来说,一个手指就是一个触摸点。
(4)TouchEvent.targetTouches
TouchEvent.targetTouches
属性返回一个TouchList
实例,成员是触摸事件的目标元素节点内部、所有仍然处于活动状态(即触摸中)的触摸点。
五、单指拖拽实例
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> <title>单指拖拽</title> <style> body { height: 2000px; } .backtop { position: fixed; right: 20px; bottom: 20px; width: 45px; height: 45px; line-height: 45px; text-align: center; background-color: rgba(0, 0, 0, 0.6); border-radius: 50%; color: #fff; font-size: 30px; -webkit-tap-highlight-color: transparent; /*transform: translate3d(x, y, 0);*/ } </style> </head> <body> <a href="#" id="backtop" class="backtop">↑</a> <script> function drag(el, options) { options.x = typeof options.x !== 'undefined' ? options.x : true; options.y = typeof options.y !== 'undefined' ? options.y : false; if (!options.x && !options.y) return; var curPoint = { x: 0, y: 0 }; var startPoint = {}; var isTouchMove = false; el.addEventListener('touchstart', handleStart, false); el.addEventListener('touchmove', handleMove, false); el.addEventListener('touchend', handleEnd, false); function handleStart(ev) { var touch = ev.changedTouches[0]; startPoint.x = touch.pageX; startPoint.y = touch.pageY; } function handleMove(ev) { ev.preventDefault(); isTouchMove = true; var touch = ev.changedTouches[0]; var diffPoint = {}; var movePoint = { x: 0, y: 0 }; diffPoint.x = touch.pageX - startPoint.x; diffPoint.y = touch.pageY - startPoint.y; if (options.x) { movePoint.x = diffPoint.x + curPoint.x; } if (options.y) { movePoint.y = diffPoint.y + curPoint.y; } move(el, movePoint.x, movePoint.y); } function handleEnd(ev) { if (!isTouchMove) return; var touch = ev.changedTouches[0]; curPoint.x += touch.pageX - startPoint.x; curPoint.y += touch.pageY - startPoint.y; isTouchMove = false; } function move(el, x, y) { x = x || 0; y = y || 0; el.style.transform = 'translate3d(' + x + 'px, ' + y + 'px, 0)'; } } </script> <script> var backtop = document.getElementById('backtop'); drag(backtop, { x: true, y: true // y: true }); </script> </body> </html>
六、其他触摸事件
hammer.js
- 用于检测触摸手势的 JavaScript 库
- 添加对触摸手势的支持并移除了点击的 300ms
- 支持最常见的单点和多点触摸手势,并且可以完全扩展以添加自定义手势
- 中文教程地址:Hammer.js 中文教程(有 demo) - 简书
参考链接:
http://static.kancloud.cn/dodoke/mobile-web-tutorial/1561577