首页 > 其他分享 >移动端touch拖动事件和click事件冲突问题解决

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

时间:2022-09-28 10:57:25浏览次数:77  
标签:touchend 触摸 触点 拖动 事件 touch click 悬浮

通过一个悬浮球交互功能的案例来阐述问题,以及解决办法。

实现效果

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

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

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

准备

  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 入手,继续往下看

标签:touchend,触摸,触点,拖动,事件,touch,click,悬浮
From: https://www.cnblogs.com/all-smile/p/16737216.html

相关文章

  • 前端面试总结10-WebApi-事件
    1.事件绑定通用函数(包括事件代理)functionbindEvent(elem,type,selector,fn){if(fn==null){fn=selector;selector=null;}elem.addEventListener(type,event=>{con......
  • fabric监听落块事件
    fabric版本v2.2可以得到,区块编号,当前哈希,前块哈希go.modrequire( github.com/hyperledger/fabric-gatewayv1.1.0 github.com/hyperledger/fabric-protos-go-apiv2......
  • 如何使用物联网低代码平台进行事件管理?
    事件管理是AIRIOT物联网低代码平台的一个核心功能,AIRIOT具有强大的事件管理功能,支持系统启停、计划事件、自定义指令执行、批量资产操作、数据事件、报警事件等多种事件类......
  • 变声 soundtouch安装与使用
    1.yuminstallsoundtouch 【安装的版本一般是1.4的,处理长音频时长会变短】2.源码安装官方下载地址:http://soundtouch.surina.net/soundtouch-1.9.2.tar.gz百度下载地......
  • 第六章 DOM键盘事件
    第六章键盘事件键盘事件键盘时间内触发条件onkeyup某个键盘按键松开时(弹起时)触发onkeydown某个键盘按键按下时就触发onkeypress某个键盘被按下时触发......
  • wix 构建前事件
    提问如何在构建wix项目前自动构建引用项目回答加入BeforeBuild命令,不要用项目属性中的BuildEvents<TargetName="BeforeBuild"><ExecCommand="dotnetpublis......
  • clickhouse高可用k8s集群搭建
    前提条件安装一个k8s集群安装helm工具1,安装operatorhelmrepoaddckhttps://radondb.github.io/radondb-clickhouse-kubernetes/helmrepoupdatekubectlcreaten......
  • clickhouse集群跨节点查询其他节点系统表信息
     clickhouse集群跨节点查询其他节点系统表信息 方法1(推荐)创建视图如下:CREATEVIEWdefault.gv$partsonclusterceb_clusterASSELECTFQDN()host,*F......
  • 性能刨析与事件追踪
    2.7性能刨析与事件追踪2.7.1pprof性能刨析性能分析工具:pprof,可以捕捉多维度的运行状态数据,也是CPU分析器,是gperftools工具的一个组件·runtime/pprof:采集程序的运行数据进......
  • CAP事件总线在NetCore中的应用+MySql存储队列信息
    上一篇链接:https://www.cnblogs.com/fei686868/p/16721769.html在上一篇中,我们介绍了CAP基于内存存储的应用。本篇我们介绍下,把存储做到mysql中,队列还是使用内存队列。my......