

移动端touch拖动事件和click事件冲突问题解决 - 甜点cc
source link: https://www.cnblogs.com/all-smile/p/16737216.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

移动端touch拖动事件和click事件冲突问题解决 - 甜点cc - 博客园
通过一个悬浮球交互功能的案例来阐述问题,以及解决办法。
类似微信里的悬浮窗效果,苹果手机的悬浮球功能效果
-
可以点击拖动,然后吸附在窗口边缘
-
点击悬浮球,可以跳转界面,或者更改悬浮球的形态
- 移动端使用
touch
事件类型:
-
touchstart
当用户在触摸平面上放置了一个触点时触发 (手指放到屏幕上) -
touchmove
当用户在触摸平面上移动触点时触发 (手指在屏幕上滑动) -
touchend
当一个触点被用户从触摸平面上移除(抬起手指) -
touchcancel
终止触摸事件
多点触控
TouchEvent.targetTouches
只读
一个 TouchList
对象,是包含了如下触点的 Touch
对象:触摸起始于当前事件的目标 element
上,并且仍然没有离开触摸平面的触点。
视口处于第四象限,原点在左上角
event.targetTouches.clientX // 触摸元素横坐标
event.targetTouches.clientY // 触摸元素纵坐标
TouchEvent.touches
只读
一个 TouchList
对象,包含了所有当前接触触摸平面的触点的 Touch
对象,无论它们的起始于哪个 element
上,也无论它们状态是否发生了变化。
通过设置悬浮球定位样式,拖动的时候计算坐标,然后动态的修改悬浮球的定位偏移量,结合transtion
过渡效果,实现平滑的过渡
代码比较简单,就不贴了。
当给元素添加了touch
事件之后,click
事件就不会出发了,那么怎么模拟点击效果呢?
在不了解触摸事件响应机制的时候,你可能会从计算触摸目标元素的时长或者计算触摸起始位置来判定点击行为,但是这两种方式都不是最佳的,原因有以下几点:
-
计算触摸时长比较麻烦
-
判断移动距离不严谨,有可能拖动了一圈又回到初始位置
-
结合计算触摸时长和触摸元素起始位置两种方式,逻辑比较复杂
下面看我是怎么做的:
首先应该了解触摸行为的事件响应机制:
-
如果有拖动行为,事件执行次序为:
touchstart
->touchmove
->touchend
-
没有拖动行为,事件执行次序为:
touchstart
->touchend
从上面的分析来看,我们可以从touchmove 入手,继续往下看👇
-
在
touchmove
事件中增加一个是否移动过的标记isMoved: true
-
在
touchend
事件中判断isMoved
是否为true
,是true
则按原有逻辑执行,是false
则说明没有移动过,属于点击行为 -
在
touchend
事件最后,重置isMoved
为初始值false
,这样每一个触摸操作都可以进入同样的逻辑,不用担心状态混乱
完美解决模拟点击行为🎉🎉
我是 甜点cc
热爱前端,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚,等待着一个创业机会。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。
希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。
__EOF__
Recommend
-
80
本报记者章咪佳可能你也听过家里老人这样的叮嘱,水果么,要早上吃,营养好……有多少听话的人,乖乖地把水果当成了早餐。不过,来自普林斯顿大学化学系的JoshuaD.Rabinowitz教授团队,在最近一期顶级学术期刊《细胞-代谢》(《细胞》杂志
-
27
问题:当焦点在输入框时,点击取消按钮会触发blur和click事件,导致需要点击两次取消按钮才能关闭弹窗 原因:这是因为blur事件比click事件先触发,而 javascript为单线程,同一时间只能执行处理一个事件 ,所以...
-
6
JAR冲突问题的解决以及运行状态下如何查看加载的类 【福...
-
13
并发冲突问题, 是日常开发中一个比较常见的问题。不同用户在较短时间间隔内变更数据,或者某一个用户进行的重复提交操作都可能导致并发冲突。并发场景在开发和测试阶段难以排查全面,出现线上 bug 以后定位困难,因此做好并发控制...
-
10
V2EX › 程序员 关于 electron 无边框窗口拖动的问题 7075 · 7 小时 26 分钟前 · 816...
-
20
解决docker和kvm网络冲突的问题 发表于...
-
4
多路由复用页面组件问题 - 甜点cc - 博客园 本文围绕 Vue Router 中路由组件复用问题展开 项目...
-
7
本篇是学习了《趣学算法(第2版)》 第一章之后总结的。
-
4
官网文档: https://git-scm.com/doc 本地克隆远程代码仓库 git clone 地址 本地同步全量历史数据
-
4
window 环境怎么解决 vim 热键冲突的问题 V2EX › Vim window 环境...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK