学会Pointer指针事件 ,一套拖拽事件两端(PC端、移动端)跑

news2024/9/20 9:21:43

早期浏览器很low,它只存在鼠标事件(MouseEvent)。随时代的发展出现了智能手机、平板电脑等触屏设备,交互方式发生了变化,单纯的鼠标事件已不够开发人员使用了。于是引入了触摸事件(TouchEvent)。不过这还不够完美,没有把触控笔事件考虑进去。当要求移动端、PC端同时具备拖拽功能时,开发人员还要维护两份事件逻辑。

为了解决上述问题,官方引入了全新的规范Pointer指针事件(Pointer) ,它提供了一套统一的事件,鼠标、触摸、触控笔事件一锅端了,不需要再维护两套事件逻辑。

Pointer指针事件属性

Pointer继承MouseEvent事件,因此常用属性clientX,clientY等指针事件都具备,同时指针事件也扩展了它自己独有的属性。

属性介绍
pointerId指针引起的事件的唯一标识
width指针的接触面的CSS像素宽度
height指针的接触面的CSS像素高度
pressure指针输入的压力值,范围在0-1之间
tangentialPressure切向压力值,范围在-1-1]之间,0表示控制设备中立状态时的值
tiltX由输入设备(如手写笔)与Y轴的构成平面,和YZ平面之间的夹角,范围在-90-90之间
tiltY由输入设备(如手写笔)与X轴构成平面,和XZ平面之间的夹角,范围在-90-90之间
twist输入设备(如手写笔)围绕自身范围旋转的角度,范围在0-359之间
pointerType表示触发事件的设备类型,mouse,pen,touch
isPrimary表示一个指针是否是当前设备类型的主指针

以上属性使用场景我没想到,有大佬的话可以指点下。

Pointer事件类型

Pointer有不同的事件类型,与鼠标事件一样有相同的语义话表示(down, up, move, over, out, enter, leave)。

事件类型事件介绍
pointerover当定点设备进入某个元素的命中检测 范围时触发。
pointerenter当定点设备进入某个元素或其子元素的命中检测范围时,或做为某一类不支悬停(hover)状态的设备所触发的poinerdown事件的后续事件时所触发。(详情可见 pointerdown事件类型).
pointerdown当某指针得以激活时触发。
pointermove当某指针改变其坐标时触发。
pointerup当某指针不再活跃时触发。
pointercancel当浏览器认为某指针不会再生成新的后续事件时触发(例如某设备不再活跃)
pointerout可能由若干原因触发该事件,包括:定位设备移出了某命中检测的边界;不支持悬浮状态的设备发生pointerup事件(见pointerup事件); 作为 pointercancel event事件的后续事件(见pointercancel事件);当数位板检测到数位笔离开了悬浮区域时。
pointerleave当定点设备移出某元素的命中检测边界时触发。对于笔形设备来说,当数位板检测到笔移出了悬浮范围时触发。
gotpointercapture当某元素接受到一个指针捕捉时触发。
lostpointercapture当针对某个指针的指针捕捉得到释放时触发。

指针、鼠标及触摸事件对比:

MouseEventTouchEventPointerEvent
mousedowntouchstartpointerdown
mousemovetouchmovepointermove
mouseuptouchendpointerup
touchcancelpointercancel
mouseenterpointerenter
mouseleavepointerleave
mouseoverpointerover
mouseoutpointerout
gotpointercapture
lostpointercapture

Pointer事件的使用

先看看鼠标实现拖拽效果:

<div id="app"></div>
<script>
    const app = document.getElementById('app')
    let isPointerDown = false

    app.addEventListener('mousedown', function (e) {
        isPointerDown = true
    });

    document.addEventListener('mousemove', function (e) {
        if (isPointerDown) {
            const left = app.getBoundingClientRect().left
            const top = app.getBoundingClientRect().top
            let newLeft = e.clientX - left
            let newTop = e.clientY - top
            console.log(newLeft, newTop);
            app.style.left = newLeft + left - app.clientWidth / 2 + 'px'
            app.style.top = newTop + top - app.clientHeight / 2 + 'px'
        }
    });

    document.addEventListener('mouseup', function (e) {
        isPointerDown = false
    });
</script>

电脑、移动设备分别访问链接,出现的效果是电脑可以拖拽,移动设备不支持。如果想要移动设备满足拖拽要单独使用触摸事件再写一套。

可以点击这里体验:https://code.juejin.cn/pen/7250291342034042940

用Pointer事件实现拖拽:

<div id="app"></div>
<script>
  const app = document.getElementById('app')
  let isPointerDown = false

  app.addEventListener('pointerdown', function (e) {
      isPointerDown = true
  });

  app.addEventListener('pointermove', function (e) {
      //捕获
      app.setPointerCapture(e.pointerId)
      if (isPointerDown) {
          const left = app.getBoundingClientRect().left
          const top = app.getBoundingClientRect().top
          let newLeft = e.clientX - left
          let newTop = e.clientY - top
          app.style.left = newLeft + left - app.clientWidth / 2 + 'px'
          app.style.top = newTop + top - app.clientHeight / 2 + 'px'
      }
  });

  app.addEventListener('pointerup', function (e) {
      isPointerDown = false
  });
</script>

Pointer事件与鼠标事件使用存在差异,Pointer使用setPointerCapture API做为捕获。

使用Pointer事件后电脑、移动设备都能进行拖拽。

可以点击这里体验: https://code.juejin.cn/pen/7250289016656887847

移动设备拖拽效果图:

总结

Pointer指针事件帮助我们通过一份代码,同时处理鼠标,触摸和触控笔事件,能为开发者节省掉时间。避免维护多套事件逻辑,做到一套事件逻辑两端跑。

如果我的文章对你有帮助,您的👍就是对我的最大支持_

往期文章:http://linglan01.cn/about

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/705118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度卷积神经网络(AlexNet)

目录 1.基础简介 1.1基础介绍 1.2基础架构 2.Alexnet与LeNet的对比 3.参考代码 4.李沐老师给出的例子 1.基础简介 1.1基础介绍 2012年&#xff0c;AlexNet横空出世。它首次证明了学习到的特征可以超越手工设计的特征。它一举打破了计算机视觉研究的现状。 AlexNet使用…

[洛谷]P1162 填涂颜色(搜索连通块)

关键思路转换&#xff1a;从边界为0开始搜索&#xff0c;并且都标记&#xff0c;这些标记的不会被1包围&#xff0c;被1包围的肯定0不会被标记到&#xff0c;所以到时候把没被标记的0就是变成2即可。 详细&#xff1a; ACcode: #include<bits/stdc.h> using namespace s…

SpringCloud(2) 注册中心Eureka、Nacos

目录 1.背景2.Eureka 注册中心3.Nacos 注册中心4.常见面试题1&#xff09;服务注册和发现是什么意思&#xff1f;Spring Cloud 如何实现服务注册发现&#xff1f;2&#xff09;Nacos 和 Eureka 有什么区别&#xff1f; 1.背景 注册中心是微服务中必须要使用的组件&#xff0c;…

JavaWeb 笔记——2

JavaWeb 笔记——2 一、Maven1.1、Maven概述1.2、Maven简介1.3、Maven基本使用1.4、IDEA配置Maven1.6、依赖管理&依赖范围 二、MyBatis2.1、MyBatis简介2.2、MyBatis快速入门2.3、解决SQL映射文件的警告提示2.4、Mapper代理开发 一、Maven 1.1、Maven概述 Maven是专门用于…

时序预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)时间序列预测

时序预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)时间序列预测 目录 时序预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)时间序列预测预测效果基本介绍模型介绍PSO模型LSTM模型PSO-LSTM模型 程序设计参考资料致谢 预测效果 基本介绍 Matlab基于PSO-LST…

高压线路距离保护程序逻辑原理(四)

四、距离I段快速动作程序逻辑框图 距离保护的故障处理程序主要有三个组成部分&#xff1a;手合及I段快速跳闸部分&#xff1b;I、II段延时动作部分&#xff1b;跳闸及后加速部分。后者在第二章的保护故障处理程序中作为各类保护共有的程序分析过。这里只分析I段的程序逻辑框图…

360手机刷机 360手机Xposed框架安装 360手机EdXposed、LSP 360手机xposed模块

360手机刷机 360手机Xposed框架安装 360手机EdXposed、LSP 360手机xposed模块 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360刷机包360手机刷机&#xff1a;360rom.github.io 【前言】 手机须Twrp或root后&#xff0c;才可使用与操作Xposed安装后&#xff0c;重启…

① RESTful API

1.API&#xff08;Application Programming Interface&#xff09; API就是一个接口&#xff1b;例如玩某一款游戏&#xff0c;你不必知道游戏具体的实现细节&#xff0c;只需要知道点哪个键是哪个技能就够了&#xff0c;而这个键之所以能实现玩家与游戏的交互&#xff0c;是因…

在个人电脑上部署ChatGLM2-6B中文对话大模型

简介 ChatGLM2-6B 是清华大学开源的一款支持中英双语的对话语言模型。经过了 1.4T 中英标识符的预训练与人类偏好对齐训练&#xff0c;具有62 亿参数的 ChatGLM2-6B 已经能生成相当符合人类偏好的回答。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&…

亚马逊点击广告有什么好处?

亚马逊点击广告可以带来以下几个好处&#xff1a; 1、增加曝光和可见性&#xff1a;亚马逊点击广告可以将你的产品展示给更多潜在的购买者。通过有针对性的广告活动&#xff0c;你可以提高产品的曝光度&#xff0c;使更多的人看到你的产品。 2、提高点击率和流量&#xff1a;…

Python 代码打包

这里写目录标题 1. pyc打包及重调用2. Cython打包及重调用 1. pyc打包及重调用 该打包方式仅为入门级&#xff0c;反编译后为源代码&#xff0c;毫无安全性 指令转换 python -m py_compile /path/**.py 代码统一转换 单个py文件打包 import py_compile py_file ["/home/…

基于STM32设计的青少年学习监控系统(华为云IOT)

一、设计需求 1.1 项目背景 近几年,我国儿童青少年的近视发生率越来越高,生活中总会看到许多小小年纪就戴着眼镜的小朋友。家长对孩子的用眼时间没有约束,电子产品对孩子眼睛的影响,写字姿势,有的孩子写字时握笔太低,以致整个人趴在桌子上等都是造成孩子近视的重要因素…

c++ freetype 解析可变字体(Variable font)

什么是可变字体 上一篇文章说了 传送门也懒的贴了&#xff0c; 自己去翻吧 前言 我这里不会贴完整的代码 也不会说的那么细&#xff0c;主要提供一些关键点和方法 正文 ‘name’ 表table 解析 TrueType 字体的解析 字体里面有很多的表table 我们需要的family和style 都在这…

C++在线五子棋对战(网页版)项目:websocket协议

目标&#xff1a;认识理解websocket协议、websocket切换过程和websocket协议格式。认识和学会使用websocketpp库常用接口。了解websocketpp库搭建服务器流程&#xff0c;认识和学会使用websocketpp库bin接口&#xff0c;最后使用websocketpp库搭建服务器。 初识websocket WebS…

OJ# 384 敲七

题目描述 ​ 有 N 个人在玩一种“敲7”游戏&#xff0c;游戏的规则是这样的&#xff1a;第 x 个人从 t 开始报数&#xff0c;然后按顺序报数&#xff0c; 当某人报的数是 7 的倍数或数字中含有 7 时&#xff0c;便被淘汰&#xff0c;剩下的人继续报数&#xff0c;直到只剩下一…

【CesiumJS入门】(6)修改3D Tiles(tileset)的位置及高度

前言 在之前一篇博客中【CesiumJS入门】&#xff08;4&#xff09;加载3D Tiles并获取tileset&#xff0c;我们成功得加载了3D Tiles数据集&#xff0c;本篇中&#xff0c;将会向大伙儿介绍tileset位置的修改与恢复&#xff1a; 直接上代码了 /** Date: 2023-06-28 19:35:03*…

操作系统OS(二)进程和线程

进程 所谓进程&#xff0c;简单来说是计算机中的各种任务。 进程是程序的一次执行&#xff0c;是操作系统进行资源分配和调度的基本单位。 进程结构PCB 进程结构&#xff1a; 控制块PCB&#xff1a;进程唯一标识 程序段&#xff1a;同一个应用程序的多个进程 数据段&#xf…

Pytorch中的Exponential Moving Average(EMA)

EMA介绍 EMA&#xff0c;指数移动平均&#xff0c;常用于更新模型参数、梯度等。 EMA的优点是能提升模型的鲁棒性&#xff08;融合了之前的模型权重信息&#xff09; 代码示例 下面以yolov7/utils/torch_utils.py代码为例&#xff1a; class ModelEMA:""" …

ELK报错no handler found for uri and method [PUT] 原因

执行后提示no handler found for uri and method post&#xff0c;最新版8.2的问题&#xff1f; 原因&#xff1a; index.mapping.single_type: true在索引上 设置将启用按索引的单一类型行为&#xff0c;该行为将在6.0后强制执行。 原 {type} 要改为 _doc&#xff0c;格式如…

优炫软件自主研发再结硕果,共享存储SRAC集群数据库重磅发布

新一轮科技革命重塑全球经济结构&#xff0c;关键核心技术是产业发展的基石&#xff0c;数据库、芯片、操作系统是我国数字技术领域三大卡脖子难题。数据库向下发挥硬件算力&#xff0c;向上使能应用系统&#xff0c;是各行各业业务系统运行的基础&#xff0c;是软件行业皇冠上…