移动端touch拖动事件和click事件冲突问题解决

简介: 移动端touch拖动事件和click事件冲突问题解决

实现效果



类似微信里的悬浮窗效果,苹果手机的悬浮球功能效果


  1. 可以点击拖动,然后吸附在窗口边缘


  1. 点击悬浮球,可以跳转界面,或者更改悬浮球的形态


准备


  1. 移动端使用touch事件类型


  • touchstart当用户在触摸平面上放置了一个触点时触发 (手指放到屏幕上)
  • touchmove当用户在触摸平面上移动触点时触发 (手指在屏幕上滑动)
  • touchend当一个触点被用户从触摸平面上移除(抬起手指)
  • touchcancel终止触摸事件


多点触控

  1. TouchEvent.targetTouches 只读

一个 TouchList 对象,是包含了如下触点的 Touch 对象:触摸起始于当前事件的目标 element 上,并且仍然没有离开触摸平面的触点。

视口处于第四象限,原点在左上角

event.targetTouches.clientX // 触摸元素横坐标
event.targetTouches.clientY // 触摸元素纵坐标


  1. TouchEvent.touches 只读


一个 TouchList 对象,包含了所有当前接触触摸平面的触点的 Touch 对象,无论它们的起始于哪个 element 上,也无论它们状态是否发生了变化。


实现


通过设置悬浮球定位样式,拖动的时候计算坐标,然后动态的修改悬浮球的定位偏移量,结合transtion过渡效果,实现平滑的过渡

代码比较简单,就不贴了。


问题


当给元素添加了touch事件之后,click事件就不会出发了,那么怎么模拟点击效果呢?


分析


在不了解触摸事件响应机制的时候,你可能会从计算触摸目标元素的时长或者计算触摸起始位置来判定点击行为,但是这两种方式都不是最佳的,原因有以下几点:


  1. 计算触摸时长比较麻烦
  2. 判断移动距离不严谨,有可能拖动了一圈又回到初始位置
  3. 结合计算触摸时长和触摸元素起始位置两种方式,逻辑比较复杂


下面看我是怎么做的:


首先应该了解触摸行为的事件响应机制:


  • 如果有拖动行为,事件执行次序为:touchstart-> touchmove-> touchend
  • 没有拖动行为,事件执行次序为:touchstart-> touchend

从上面的分析来看,我们可以从touchmove 入手,继续往下看👇


解决


  1. touchmove事件中增加一个是否移动过的标记isMoved: true
  2. touchend事件中判断isMoved是否为true,是true则按原有逻辑执行,是false则说明没有移动过,属于点击行为
  3. touchend事件最后,重置isMoved为初始值false,这样每一个触摸操作都可以进入同样的逻辑,不用担心状态混乱


完美解决模拟点击行为🎉🎉


目录
相关文章
|
SQL Java 编译器
SQL 语言:嵌入式 SQL 和动态 SQL
SQL 语言:嵌入式 SQL 和动态 SQL
369 4
|
开发者
移动端 click 事件、touch 事件、tap 事件的区别
移动端 click 事件、touch 事件、tap 事件的区别
297 1
|
JavaScript
vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法
vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法
4235 0
|
JavaScript 前端开发 Android开发
JavaScript触摸touch事件
JavaScript触摸touch事件
|
JavaScript 前端开发 Java
vue2知识点:vue-cli脚手架配置代理服务器
vue2知识点:vue-cli脚手架配置代理服务器
356 7
|
传感器 人工智能 C#
一文带你聊聊《黑神话:悟空》底层的技术实现
一文带你聊聊《黑神话:悟空》底层的技术实现
2240 13
|
JavaScript 前端开发
详尽分享解决img的src属性为空时会有边框的情况
详尽分享解决img的src属性为空时会有边框的情况
648 0
|
XML JSON 数据安全/隐私保护
如何使用Fiddler抓取APP接口和微信授权网页源代码
Fiddler是一款强大的抓包工具,用于捕获HTTP/HTTPS流量,包括手机APP和微信授权页面的数据。下载安装Fiddler后,需设置电脑代理,如端口8888,并在手机上配置相同代理,确保两者在同一局域网。通过安装Fiddler证书,可解密HTTPS请求。在手机上打开目标应用或网页,Fiddler将显示请求详情,便于接口调试和数据查看。
1149 0
如何使用Fiddler抓取APP接口和微信授权网页源代码
|
数据安全/隐私保护
基于AutoJs实现的薅羊毛专业版又一次大更新
基于AutoJs实现的薅羊毛专业版又一次大更新
297 0
基于AutoJs实现的薅羊毛专业版又一次大更新

热门文章

最新文章