1、移动端基础事件
touchstart
- 手指触摸
touchmove
- 手指移动
touchend
- 手指离开
2、事件监听
addEventListener("事件名",函数,冒泡或捕获);
// 用这个的好处:
// (1)不会存在前后覆盖的问题
// (2)在Chrome浏览器下可以一直识别
// 冒泡和捕获的区别:
// (1)冒泡 - 点击元素 他会把这个事件一直向上传递 从下向上传递
// (2)捕获 - 从上向下传递
3、Event对象
4、阻止页面上的文字被选中和系统菜单
document.addEventListener("touchstart",(e) => {
e.preventDefault(); // -> 阻止默认事件
// -> 这个可以解决以下的问题:
// (1)阻止页面上的文字被选中 -- 可以通过阻止冒泡e.stopPropagation();使某个元素上的文字被选中
// (2) 阻止页面上的系统菜单
// -> 但是使用这种方法可能存在一种弊端
// 页面上的所有滚动条失效
// (3)阻止页面的橡皮筋效果的回弹
// -> 可以通过阻止touchstart或者touchmove来清除系统默认的回弹效果,唯一不好处是滚动条失效
});
5、事件点透问题
/*
PC端鼠标事件 在移动端也可以正常使用,但是注意 事件的执行 会有300ms的延迟,目前的浏览器已经很快了,基本不存在300ms延迟了
事件点透:
- 在移动端 PC事件 有 300ms的延迟 【目前大部分浏览器已解决】
解决办法:
- 阻止默认事件 (部分安卓机型不支持)
- 不在移动端使用鼠标事件,不用a标签做页面跳转
*/
window.onload = function () {
var oDiv = document.querySelector('#div');
oDiv.addEventListener("touchend",function (e) {
e.preventDefault();
this.style.display = "none";
});
}
6、防止误触
document.addEventListener(
"touchstart",
function (e) {
e.preventDefault();
}
);
window.onload = function () {
var a = document.querySelectorAll('a');
for (var i = 0; i < a.length; i++) {
a[i].addEventListener("touchmove", () => {
// -> 给其一个自定义属性isMove,表示是否移动过,默认是true
this.isMove = true;
});
a[i].addEventListener("touchend", () => {
// -> 判断一下isMove属性如果没有被触碰过,则跳转
if (!this.isMove) {
window.location.href = this.href;
}
this.isMove = false;
});
}
}
7、touchEvent
window.onload = function () {
var oBox = document.querySelector('#box');
oBox.addEventListener("touchmove", function (e) {
console.log(e.touches);// -> 当前屏幕上的手指列表
console.log(e.targetTouches);// -> 当前元素上的手指列表
console.log(e.changedTouches);// -> 触发当前事件的手指列表
var touch = e.changedTouches[0];
this.innerHTML = touch.pageX + "|" + touch.pageY;
});
}
8、滑屏原理分析
<!--
1、手指按下,记录一下手指的坐标
2、移动的时候同样记录下手指的坐标
3、计算手指移动的距离 = 移动后的坐标 - 移动前的坐标
——————————————————
4、手指按下,记录一下元素的位置
5、计算元素现在所在的位置 = 移动后手指移动的距离 + 元素的初始位置
-->
<div id="wrap">
<div id="scroll">
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
<p>111111111111111111111111111111</p><br/>
</div>
</div>
html{height: 100%;}
body{margin: 0;height: 100%;position: relative;overflow:hidden;}
#wrap{position: absolute;top: 0;left: 0;width: 100%;height: 100%;}
#scroll{position: absolute;top: 0;left: 0;width: 100%;}
window.onload = function () {
var oWrap = document.querySelector('#wrap'),
oScroll = document.querySelector('#scroll');
var startPoint = 0;// -> 按下的坐标信息
var startEl = 0;// -> 按下的元素位置
var maxTop = oWrap.clientHeight - oScroll.offsetHeight; // -> 最大高度
oWrap.addEventListener("touchstart",function (e) {
var touch = e.changedTouches[0];
startPoint = touch.pageY;
startEl = oScroll.offsetTop;
})
oWrap.addEventListener("touchmove",function (e) {
var touch = e.changedTouches[0];
var nowPoint = touch.pageY;
var dis = nowPoint - startPoint;// -> 手指移动后的距离
var Top = startEl + dis;// -> 元素现在所要在的位置
if (Top > 0) {
Top = 0;
}
if (Top < maxTop) {
Top = maxTop;
}
oScroll.style.top = Top + "px";
})
}