H5案例分享:移动端touch事件判断滑屏手势的方向

移动端touch事件判断滑屏手势的方向

方法一

  1. 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY;
  2. 当触发touchmove事件时,在获取此时手指的横坐标moveEndX和纵坐标moveEndY;最后,通过这两次获取的坐标差值来判断手指在手机屏幕上的滑动方向。

思路:用touchmove的最后坐标减去touchstart的起始坐标,X的结果如果正数,则说明手指是从左往右划动;X的结果如果负数,则说明手指是从右往左划动;Y的结果如果正数,则说明手指是从上往下划动;Y的结果如果负数,则说明手指是从下往上划动。

具体代码如下

var mybody = document.getElementsByTagName(‘body‘)[0];

//滑动处理

var startX, startY, moveEndX, moveEndY, X, Y;

mybody.addEventListener(‘touchstart‘, function(e) {

e.preventDefault();

startX = e.touches[0].pageX;

startY = e.touches[0].pageY;

});

mybody.addEventListener(‘touchmove‘, function(e) {

e.preventDefault();

moveEndX = e.changedTouches[0].pageX;

moveEndY = e.changedTouches[0].pageY;

X = moveEndX - startX;

Y = moveEndY - startY;

if ( X > 0 ) {alert(‘向右’);}

else if ( X < 0 ) {alert(‘向左’);}

else if ( Y > 0) {alert(‘向下’);}

else if ( Y < 0 ) { alert(‘向上’);}

else{alert(‘没滑动’); }

});

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

var mybody = document.getElementsByTagName(‘body‘)[0];

//滑动处理

var startX, startY, moveEndX, moveEndY, X, Y;

mybody.addEventListener(‘touchstart‘, function(e) {

e.preventDefault();

startX = e.touches[0].pageX;

startY = e.touches[0].pageY;

}, false);

mybody.addEventListener(‘touchmove‘, function(e) {

e.preventDefault();

moveEndX = e.changedTouches[0].pageX;

moveEndY = e.changedTouches[0].pageY;

X = moveEndX - startX;

Y = moveEndY - startY;

if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {

alert("向右");

}

else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {

alert("向左");

}

else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {

alert("向下");

}

else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {

alert("向上");

}

else{

alert("没滑动");

}

});

以上代码,在测试时仍不能达到预期的效果,因为还有一个问题——body的元素的高仔细查查,发现其值是0
故还应该在此基础上添加以下代码

var mybody = document.getElementsByTagName(‘body‘)[0];

var h = document.documentElement.clientHeight;

mybody.style.height = h + ‘px‘;

到此,已实现了手机移动端手指的上滑、下滑、左滑和右滑操作。

方法二

1、滑动屏幕事件使用HTML5中的touchstart滑动开始事件和touchmove滑动结束事件。

2、方向的判断:以起点做平面坐标系,与终点连线做直线,直线与x正半轴计算角度;我们以45度角为方向分割线,如:只要滑动角度大于等于45度且小于135度,则判断它方向为向上滑。如图所示:

3、使用Math.atan2来计算起点与终点形成的直线角度。

注意:标准坐标系与屏幕坐标系并不相同,在屏幕坐标系中,上半轴为负值,要实现转换,只需要调换Y坐标起点与终于位置即可。

代码如下:

var h = document.documentElement.clientHeight,

mybody = document.getElementsByTagName(‘body‘)[0];

mybody.style.height = h + ‘px‘;

//返回角度

function GetSlideAngle(dx,dy) {

return Math.atan2(dy,dx) * 180 / Math.PI;

}

//根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动

function GetSlideDirection(startX,startY, endX, endY) {

var dy = startY - endY;

var dx = endX - startX;

var result = 0;

//如果滑动距离太短

if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {

return result;

}

var angle = GetSlideAngle(dx, dy);

if (angle >= -45 && angle < 45) {

result = 4;

}else if (angle >= 45 && angle < 135) {

result = 1;

}else if (angle >= -135 && angle < -45) {

result = 2;

}else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {

result = 3;

}

return result;

}

//滑动处理

var startX, startY;

mybody.addEventListener(‘touchstart‘, function (ev){

ev.preventDefault();

startX = ev.touches[0].pageX;

startY = ev.touches[0].pageY;

}, false);

mybody.addEventListener(‘touchmove‘, function (ev){

var endX, endY;

ev.preventDefault();

endX = ev.changedTouches[0].pageX;

endY = ev.changedTouches[0].pageY;

var direction = GetSlideDirection(startX, startY, endX, endY);

switch (direction){

case 0:

alert("没滑动");

break;

case 1:

alert("向上");

break;

case 2:

alert("向下");

break;

case 3:

alert("向左");

break;

case 4:

alert("向右");

break;

default:

}

}, false);

PS:用touchmove事件获取终点坐标,而不是用touchend事件,是因为当你只是点击屏幕的时候,就会触发touchEnd事件,但是不会触发touchMove事件。这样会造成touchEnd中取得的endX,从而造成endY值不准确。比如先滑动再点击,可能同样会触发滑动事件

另外此代码只是提供了判断滑屏方向的思路,还需要根据具体的项目需求进行修改完善!

时间: 2024-10-28 10:14:12

H5案例分享:移动端touch事件判断滑屏手势的方向的相关文章

移动端touch事件的使用

一.支持webkit的touch事件 pc上的web页面鼠标会产生 iphone.ipod  Touch.ipad上的web页面触屏时会产生ontouchstart.ontouchmove.ontouchend.ontouchcancel 事件,分别对应了触屏开始.拖拽及完成触屏事件和取消. 1.touchstart--当手指触碰屏幕时候发生.不管当前有多少只手指 2.touchmove--当手指在屏幕上滑动时连续触发.通常我们再滑屏页面,会调用event的preventDefault()可以阻

android中根据touch事件判断单击及双击

private static final int MAX_INTERVAL_FOR_CLICK = 250;     private static final int MAX_DISTANCE_FOR_CLICK = 100;     private static final int MAX_DOUBLE_CLICK_INTERVAL = 500;     int mDownX = 0;     int mDownY = 0;     int mTempX = 0;     int mTempY

H5案例分享:移动端滑屏 touch事件

移动端滑屏 touch事件 移动端触屏滑动的效果的效果在电子设备上已经被应用的越来越广泛,类似于PC端的图片轮播,但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件能跟踪到屏幕滑动的每根手指. 以下是四种touch事件 touchstart: //触摸屏幕时触发:即使已经有一个手指放在了屏幕上也会触发.touchmove: //在屏幕上滑动时连续的触发.在这个事件发生期间,调用preventDefault()可阻止滚动.touchend: //从屏幕上移开

移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法

这两天自己在写一个手机网页,用到了触屏滑动的特效,就是往右滑动的时候左侧隐藏的菜单从左边划出来. 做完之后在手机原生浏览器中运行正常,但在QQ和微信中打开,发现touchmove只会触发一次,而且touchend也经常不触发. 之后百度了一下这个问题,原因是 主要是由于200ms超时导致内核不一定会一直处理touchmove事件,一旦超时会将后续所有的事件转交给UI处理,导致touchmove不会一直触发. 为了解决开发者需要,建议开发者在touchstart时调用event.preventDe

移动端Touch事件

案例1: 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"> 6 <title>Test Ta

移动端 Touch 事件

在移动端页面开发时,常常会用到touch事件,比如左滑右滑的轮播等.常用的触摸事件有touchstart,touchmove,touchend. 每个事件包含下面三个用于跟踪虎摸的属性: touches:表示当前跟踪的触摸操作的touch对象的数组. targetTouches:特定于事件目标的Touch对象的数组. changeTouches:表示自上次触摸以来发生了什么改变的Touch对象的数组. 每个touch事件包含下面的属性: clientX:触摸目标在视口中的x坐标. clientY

移动端touch事件 || 上拉加载更多

前言: 说多了都是泪,在进行项目开发时,在上拉加载更多实现分页效果的问题上,由于当时开发任务紧急,所以就百度找了各种移动端的上拉下拉 实现加载更多的插件.然后就留下了个坑:上拉加载的时候会由于用户错误的姿势,例如长按后再touchmove等会出现卡死的假象.(ps:当然, 我不认为是插件的问题,当时的想法是觉得引用的插件存在冲突),于是,我就直接通过封装touch事件完成上拉加载实现分页的功能. 备注:文章最后会加上为实现这个功能我找的一些插件 了解touch事件 在应用touch事件实现上拉加

移动端touch事件滚动

本来想用在北京欢乐谷手机上用touch事件来模拟局部左右内容滚动里,但在touchmove上下滚动时由于禁止了默认事件而body滚动条不能滚动,虽然可以根据touchmove的坐标来判断方向,但体验效果不理想. 后来在查询相关资料后原来可以直接在css中使用overflow:auto;出来的滚动条用CSS3的-wekit-scrollbar{display:none}来隐藏; *拓展*::-webkit-scrollbar 滚动条整体部分*::-webkit-scrollbar-thumb 滚动

实现移动端touch事件的横向滑动列表效果

要实现手机端横向滑动效果并不难,了解实现的原理及业务逻辑就很容易实现.原理:touchstart(手指按下瞬间获取相对于页面的位置)-->touchmove(手指移动多少,元素相应移动多少). 接下来讲讲实现逻辑: 其实就是手指拖动列表向哪个方向移动多少像素,并设置左右拖动的边界值. 附上代码及注释: <div id="common_wrap" class="common-wrap"> <h4 class="common-kit__