方法1:
- 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY;
- 当触发touchmove事件时,在获取此时手指的横坐标moveEndX和纵坐标moveEndY;最后,通过这两次获取的坐标差值来判断手指在手机屏幕上的滑动方向。
思路:用touchmove的最后坐标减去touchstart的起始坐标,X的结果如果正数,则说明手指是从左往右划动;X的结果如果负数,则说明手指是从右往左划动;Y的结果如果正数,则说明手指是从上往下划动;Y的结果如果负数,则说明手指是从下往上划动。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>H5触摸事件</title>
</head>
<body>
<p>判断滑动方向</p>
<div id="mybody" style="height: 300px;background-color: #6D7273"></div>
</body>
<script>
var mybody = document.getElementById('mybody');
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轴的判断先行接管,而与我们实际的操作意愿相背离,
* 此时就需要添加特殊的判断技巧--绝对值进行对比
*/
mybody.addEventListener('touchend', function (e) {
e.preventDefault();
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("没滑动");
}
});
</script>
</html>
方法2:
- 滑动屏幕事件使用HTML5中的touchstart滑动开始事件和touchend滑动结束事件。
- 方向的判断:以起点做平面坐标系,与终点连线做直线,直线与x正半轴计算角度;我们以45度角为方向分割线,如:只要滑动角度大于等于45度且小于135度,则判断它方向为向上滑。如图所示:
- 使用Math.atan2来计算起点与终点形成的直线角度。
注意:标准坐标系与屏幕坐标系并不相同,在屏幕坐标系中,上半轴为负值,要实现转换,只需要调换Y坐标起点与终于位置即可。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>H5触摸事件</title>
</head>
<body>
<p>判断滑动方向</p>
<div id="mybody" style="height: 300px;background-color: #6D7273"></div>
</body>
<script>
var mybody = document.getElementById('mybody');
//返回角度
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('touchend', 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);
</script>
</html>