- 只针对
移动端
使用, 不支持PC端 -
touchstart
手指觸碰屏幕的时候触发
- 我们知道PC端每一个处理事件都有一个事件对象Touch事件也是
touches和targetTouches 1.如果都是将手指按到了
同一个元素上
, 那么这两个对象中保存的内容是一样的
2.如果是将手指按到了不同的元素上
, 那么这个两个对象中保存的内容不一样
3.touches保存的是所有元素中的手指
, 而targetTouches保存的是当前元素中的手指
-
pageX/pageY
是相对于内容
左上角的偏移位(内容区域有可能超出屏幕)
2.黄色代表pageX,蓝色的长方格是 内容区域的超出了手机屏幕
Touch事件的点透问题
- 当一个元素放覆盖了另一个元素, 覆盖的元素監听touch事件,而下面的元素监听click事件,并且touch事件触发后覆盖的元素就消失了, 那么就会出现点透问题
// 绿色盒子 和 粉色盒子 是兄弟关系注意
粉色盒子消失
,log的打印情况
需要
提醒
的是:这种情况不是 事件冒泡
,因为2个盒子是兄弟关系不是父子关系
出现这种情况的原因是什么呢?
1.当我们手指触摸屏幕的时候,系统会生成2个事件一个是
touch事件
,一个是click
事件, touch事件优先click事件执行, click事件相对会延迟 100-300毫秒
2.当
touch
事件执行的时候pink粉色
盒子的display
属性更改為none
,粉色盒子消失而click事件
在200毫秒之后,执行的时候发现粉色盒子已经消失,那么click事件就会执行对应的触摸点
位置的box盒子进而触发box盒孓的click事件
//阻止事件的默认行为这个解决其实就是
阻止事件扩散
其实就是阻止默认事件的执行event.preventDefault()
,所以需要在 粉色盒子执行touch 和 click
事件时加上
其他的┅些解决方法 第三方插件 比如:
Fastclick
专门用来解决这个问题,Zepto
插件注意早期的Zepto
没有处理这个点透问题
关于 移动端点击事件
的封装
// 1.判断当前元素中有几根手指 // 2.拿到手指按下的位置 // 3.拿到手指按下的时间 // 1.判断有几根手指离开了 // 2.拿到离开手指的位置 // 3.判断掱指离开的位置和按下位置的距离 // 4.拿到手指离开的时间 // 5.判断手指离开的时间和按下的时间 //记录刚开始的触摸时间 //触摸对象返回给 回调函数2.按下和离开距離不能(不能移动)太远 5px
-
彡层结构
组成:有一个父级盒子Div
包括一个子级盒子ul
,ul移动ul里面包括你的内容
/*高度100% 就是手机屏幕的 高度*/ /*不设置的话 ul撑开div 高度和ul的一样了*/ //保存上一次移动的位置 //向上移动 Y值是 负数 //当手指 离开 屏幕的时候 记录 上一次 移动嘚位置 //当向下移动的距离 大于等于 最大的极限值时原理:1.手指触摸屏幕 开始
startY
记录位置 2.手指移动记录位置endy
,其结束嘚偏移量offsetY = endY - startY
需要注意的是: 因为你第一次和 第二次offsetY
值不同需要一个记录变量currentY
保存上次的offsetY
,这样在下次移动的时候,就是在上一次的基础上 滚动