移动端原生手势事件

怼烎@ 2021-07-24 14:04 560阅读 0赞
  1. touchstart 当手指接触屏幕时触发
  2. touchmove 当已经接触屏幕的手指开始移动的时候触发
  3. touchend 当手指离开屏幕时触发
  4. touchcancel 可由系统进行的触发,比如手指触摸屏幕的时候,突然alert了一下,或者系统中其他打断了touch的行为,则可以触发该事件
  5. 1、由于触摸会导致屏幕动来动去,使用时先阻止默认事件
  6. event.preventDefault()
  7. 2event对象包含的额外参数
  8. (1)touches:表示当前跟踪的触摸操作的touch对象的数组。
  9. 当一个手指在触屏上时,event.touches.length=1,
  10. 当两个手指在触屏上时,event.touches.length=2,以此类推。
  11. event.touches={0: Touch, length: 1}
  12. (2)、targetTouches:特定于事件目标的touch对象数组。
  13. 因为touch事件是会冒泡的,所以利用这个属性指出目标对象。
  14. (3)、changedTouches:表示自上次触摸以来发生了什么改变的touch对象的数组,涉及当前事件的手指的一个列表。
  15. 每个touch对象都包含下列几个属性:
  16. 1.Touch.identifier:此 Touch 对象的唯一标识符。 一次触摸动作(我们指的是手指的触摸)在平面上移动的整个过程中,该标识符不变。 可以根据它来判断跟踪的是否是同一次触摸过程,此值为只读属性。
  17. 2.Touch.screenX:触点相对于屏幕左边沿的X坐标。只读属性。
  18. 3.Touch.screenY:触点相对于屏幕上边沿的Y坐标。只读属性。
  19. 4.Touch.clientX:触点相对于可见视区(visual viewport)左边沿的X坐标。不包括任何滚动偏移。只读属性。
  20. 5.Touch.clientY:触点相对于可见视区(visual viewport)上边沿的Y坐标。不包括任何滚动偏移。只读属性。
  21. 6.Touch.pageX:触点相对于HTML文档左边沿的X坐标。当存在水平滚动的偏移时,这个值包含了水平滚动的偏移。只读属性。
  22. 7.Touch.pageY:触点相对于HTML文档上边沿的Y坐标。当存在水平滚动的偏移时,这个值包含了垂直滚动的偏移。只读属性。
  23. 8.Touch.radiusX:能够包围用户和触摸平面的接触面的最小椭圆的水平轴(X轴)半径。这个值的单位和 screenX 相同。只读属性。
  24. 9.Touch.radiusY:能够包围用户和触摸平面的接触面的最小椭圆的垂直轴(Y轴)半径。这个值的单位和 screenY 相同。只读属性。
  25. 10.Touch.rotationAngle:它是这样一个角度值:由radiusX radiusY描述的正方向的椭圆,需要通过顺时针旋转这个角度值,才能最精确地覆盖住用户和触摸平面的接触面。只读属性。
  26. 11.Touch.force:手指挤压触摸平面的压力大小,从0.0(没有压力)到1.0(最大压力)的浮点数。只读属性。
  27. 12.Touch.target:当这个触点最开始被跟踪时(在 touchstart 事件中),触点位于的HTML元素。哪怕在触点移动过程中,触点的位置已经离开了这个元素的有效交互区域,或者这个元素已经被从文档中移除。需要注意的是,如果这个元素在触摸过程中被移除,这个事件仍然会指向它,但是不会再冒泡这个事件到 window document 对象。因此,如果有元素在触摸过程中可能被移除,最佳实践是将触摸事件的监听器绑定到这个元素本身,防止元素被移除后,无法再从它的上一级元素上侦测到从该元素冒泡的事件。只读属性。
  28. 3、手指手势事件
  29. 【注意】只有两个手指都触摸到事件的接收容器时才触发这些手势事件。
  30. gesturestart:当一个手指已经按在屏幕上,而另一个手指又触摸在屏幕时触发。
  31. gesturechange:当触摸屏幕的任何一个手指的位置发生变化时触发。
  32. gestureend:当任何一个手指从屏幕上面移开时触发。
  33. 参数:
  34. rotation:表示手指变化引起的旋转角度,负值表示逆时针,正值表示顺时针,从零开始。
  35. scale:表示两个手指之间的距离情况,向内收缩会缩短距离,这个值从1开始,并随距离拉大而增长。
  36. var div = document.getElementById("div");
  37. div.ongesturechange = function(e){
  38. scale代表手势产生的缩放比例,小于1是缩小,大于1是放大,原始为1
  39. var scale = e.scale;
  40. rotation代表旋转手势的角度,值区间[0,360],正值顺时针旋转,负值逆时针
  41. var angle = e.rotation;
  42. };
  43. 4、重力感应
  44. 只需要为body节点添加onorientationchange事件即可。在此事件中由window.orientation属性得到代表当前手机方向的数值。window.orientation的值列表如下:
  45. 0:与页面首次加载时的方向一致
  46. -90:相对原始方向顺时针转了90°
  47. 180:转了180°
  48. 90:逆时针转了90°据我测试,Android2.1尚未支持重力感应。以上即目前的触屏事件,这些事件尚未并入标准,但已被广泛使用。本人Android2.1,未在其他环境下测试。

代码示例:
实现监听移动端的滑动方向:

  1. 然而在实际的操作中,手指的上下滑动很难做到直上直下,只要稍微有点斜,只要稍微有点斜,就会被X轴的判断先行接管,而与我们实际的操作意愿相背离。
  2. 此时就需要添加特殊的判断技巧,修改代码如下(工作中用如下代码即可):

方式一:

  1. // 原生js addeventListener 事件监听方法 jquery方法同上就不写了
  2. var mybody = document.getElementsByTagName('body')[0];
  3. //滑动处理
  4. var startX, startY, moveEndX, moveEndY, X, Y;
  5. mybody.addEventListener('touchstart', function(e) {
  6. e.preventDefault();
  7. startX = e.touches[0].pageX;
  8. startY = e.touches[0].pageY;
  9. }, false);
  10. mybody.addEventListener('touchmove', function(e) {
  11. e.preventDefault();
  12. moveEndX = e.changedTouches[0].pageX;
  13. moveEndY = e.changedTouches[0].pageY;
  14. X = moveEndX - startX;
  15. Y = moveEndY - startY;
  16. if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {
  17. alert("向右");
  18. }
  19. else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {
  20. alert("向左");
  21. }
  22. else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {
  23. alert("向下");
  24. }
  25. else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {
  26. alert("向上");
  27. }
  28. else{
  29. alert("没滑动");
  30. }
  31. });
  32. 以上代码,在测试时仍不能达到预期的效果,因为还有一个问题——body的元素的高仔细查查,发现其值是0
  33. 故还应该在此基础上添加以下代码:
  34. var mybody = document.getElementsByTagName('body')[0];
  35. var h = document.documentElement.clientHeight;
  36. mybody.style.height = h + 'px';
  37. 到此,已实现了手机移动端手指的上滑、下滑、左滑和右滑操作。

方式二:

  1. 滑动屏幕事件使用HTML5中的touchstart滑动开始事件和touchmove滑动结束事件。
  2. 方向的判断:以起点做平面坐标系,与终点连线做直线,直线与x正半轴计算角度;我们以45度角为方向分割线,如:只要滑动角度大于等于45度且小于135度,则判断它方向为向上滑。如图所示:
  3. 使用Math.atan2来计算起点与终点形成的直线角度。
  4. // 原生js addeventListener 事件监听方法 jquery方法同上就不写了
  5. var h = document.documentElement.clientHeight,
  6. mybody = document.getElementsByTagName('body')[0];
  7. mybody.style.height = h + 'px';
  8. //返回角度
  9. function GetSlideAngle(dx,dy) {
  10. return Math.atan2(dy,dx) * 180 / Math.PI;
  11. }
  12. //根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动
  13. function GetSlideDirection(startX,startY, endX, endY) {
  14. var dy = startY - endY;
  15. var dx = endX - startX;
  16. var result = 0;
  17. //如果滑动距离太短
  18. if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
  19. return result;
  20. }
  21. var angle = GetSlideAngle(dx, dy);
  22. if (angle >= -45 && angle < 45) {
  23. result = 4;
  24. }else if (angle >= 45 && angle < 135) {
  25. result = 1;
  26. }else if (angle >= -135 && angle < -45) {
  27. result = 2;
  28. }else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
  29. result = 3;
  30. }
  31. return result;
  32. }
  33. //滑动处理
  34. var startX, startY;
  35. mybody.addEventListener('touchstart', function (ev){
  36. ev.preventDefault();
  37. startX = ev.touches[0].pageX;
  38. startY = ev.touches[0].pageY;
  39. }, false);
  40. mybody.addEventListener('touchmove', function (ev){
  41. var endX, endY;
  42. ev.preventDefault();
  43. endX = ev.changedTouches[0].pageX;
  44. endY = ev.changedTouches[0].pageY;
  45. var direction = GetSlideDirection(startX, startY, endX, endY);
  46. switch (direction){
  47. case 0:
  48. alert("没滑动");
  49. break;
  50. case 1:
  51. alert("向上");
  52. break;
  53. case 2:
  54. alert("向下");
  55. break;
  56. case 3:
  57. alert("向左");
  58. break;
  59. case 4:
  60. alert("向右");
  61. break;
  62. default:
  63. }
  64. }, false);

发表评论

表情:
评论列表 (有 0 条评论,560人围观)

还没有评论,来说两句吧...

相关阅读

    相关 移动keyup事件

    最近在做一个项目需求,需要实现一个类似谷歌搜索的功能,可以模糊匹配到中文和字母。当时想到了keyup事件,每当键盘按下时监控input框值的变化,在电脑和安桌手机上测试都没有问