JS--M端事件

移动端(Mobile 端,简称 M 端)开发中,由于设备特性(触摸屏、手势操作等),需要处理一些与桌面端不同的事件。这些事件主要针对触摸交互、手势识别等场景

一、触摸事件(Touch Events)

触摸事件是 M 端最基础的交互事件,用于响应手指在屏幕上的操作:

事件名触发时机常用场景
touchstart手指触摸到元素时触发开始拖拽、播放动画
touchmove手指在元素上滑动时持续触发拖拽元素、滑动控制
touchend手指离开屏幕时触发结束拖拽、提交操作
touchcancel触摸被中断时触发(如弹窗弹出、电话接入)清理临时状态
事件对象属性(TouchEvent

触摸事件对象包含与触摸相关的关键信息:

  • touches:当前屏幕上所有触摸点的列表(Touch 对象数组)。
  • targetTouches:当前元素上所有触摸点的列表。
  • changedTouches:触发当前事件的触摸点列表(如 touchend 中是离开的触摸点)。

每个 Touch 对象包含位置信息:

  • clientX/clientY:触摸点相对于视口的坐标。
  • pageX/pageY:触摸点相对于文档的坐标(含滚动距离)。
示例:监听触摸滑动方向
const box = document.getElementById('box');
let startX, startY;// 记录触摸开始位置
box.addEventListener('touchstart', function(e) {startX = e.touches[0].clientX;startY = e.touches[0].clientY;
});// 监听滑动过程
box.addEventListener('touchmove', function(e) {// 阻止页面默认滚动(可选)e.preventDefault();const moveX = e.touches[0].clientX - startX;const moveY = e.touches[0].clientY - startY;// 简单判断滑动方向if (Math.abs(moveX) > Math.abs(moveY)) {console.log(moveX > 0 ? '向右滑' : '向左滑');} else {console.log(moveY > 0 ? '向下滑' : '向上滑');}
});

二、手势事件(Gesture Events)

手势事件用于识别复杂的触摸交互(如缩放、旋转),通常基于两个手指的操作:

事件名触发时机常用场景
gesturestart两个手指开始触摸时触发开始缩放/旋转
gesturechange两个手指移动时触发(实时变化)调整缩放比例/角度
gestureend两个手指离开时触发结束缩放/旋转
事件对象属性
  • scale:手势的缩放比例(初始为 1,大于 1 是放大,小于 1 是缩小)。
  • rotation:手势的旋转角度(单位为度,正值为顺时针,负值为逆时针)。
示例:实现图片缩放旋转
const img = document.getElementById('img');
let currentScale = 1;
let currentRotation = 0;// 监听手势开始
img.addEventListener('gesturestart', function(e) {e.preventDefault(); // 阻止默认行为
});// 监听手势变化
img.addEventListener('gesturechange', function(e) {e.preventDefault();// 更新缩放和旋转currentScale *= e.scale;currentRotation += e.rotation;// 应用变换img.style.transform = `scale(${currentScale}) rotate(${currentRotation}deg)`;
});

三、触摸与点击的区别

  • click 事件:在移动端也会触发,但存在 300ms 延迟(历史原因,用于判断是否双击缩放),且在 touchend 后才触发。
  • touch 事件:无延迟,更适合需要快速响应的场景(如游戏、滑动交互)。
解决 click 延迟问题:
  1. 使用 touchstart 替代 click(需注意防止误触)。
  2. 添加 <meta name="viewport" content="width=device-width"> 可消除部分浏览器的 300ms 延迟。
  3. 使用库(如 FastClick)优化。

四、常见问题与优化

  1. 触摸穿透(Touch Through)

    • 现象:点击上层元素后,下层元素的 click 事件被触发。
    • 解决:在 touchend 中使用 e.preventDefault(),或避免多层叠加可点击元素。
  2. 滑动冲突

    • 现象:内部元素滑动时,页面整体也会滚动(如轮播图滑动 vs 页面滚动)。
    • 解决:在 touchmove 中根据滑动方向判断是否阻止默认行为(e.preventDefault())。
  3. 事件防抖

    • touchmove 触发频率极高,需通过防抖限制处理频率:
    let isProcessing = false;
    box.addEventListener('touchmove', function(e) {if (!isProcessing) {requestAnimationFrame(function() {// 处理滑动逻辑isProcessing = false;});isProcessing = true;}
    });
    

五、库与框架支持

对于复杂手势(如滑动删除、捏合缩放),推荐使用成熟库简化开发:

  • Hammer.js:轻量级手势库,支持滑动、缩放、旋转等。
  • AlloyFinger:腾讯团队开发的移动端手势库,体积小、API 简洁。

总结

M 端事件的核心是触摸交互,主要包括:

  • 基础触摸事件(touchstart/touchmove/touchend):处理单指滑动、点击等。
  • 手势事件(gesturestart/gesturechange/gestureend):处理双指缩放、旋转等。

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

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

相关文章

Linux网络编程-tcp

tcp、udp对比&#xff1a;UDP1. 特点无连接&#xff1a;无需建立连接即可发送数据。不可靠&#xff1a;不保证数据顺序或完整性。低延迟&#xff1a;适合实时性要求高的场景。2. 应用场景视频/音频流传输&#xff08;如直播&#xff09;。DNS 查询、在线游戏。TCP1. 特点面向连…

记一次flink资源使用优化

一.现状分析 现有任务的资源配置如下&#xff0c;根据ui监控中Garbage Collection可以发现&#xff0c;此任务频繁的发生GC&#xff0c;且老年代GC时间较久二.整体memory使用分析如下Framework Heap&#xff08;框架堆内存&#xff09;用于Flink框架自身的堆内存&#xff08;如…

Vue底层换成啥了?如何更新DOM的?

摘要&#xff1a;之前的vue是使用虚拟 DOM的&#xff0c;但是Vue 3.6 带来了一个意义重大的更新&#xff1a; Vapor Mode 渲染模式。Vue 渲染策略的演进&#xff1a; Vue 1.x&#xff1a; 基于模板渲染策略&#xff0c;直接将模板转换为DOM元素&#xff0c;并为每个DOM元素创建…

0722 数据结构顺序表

Part 1.顺序表的代码一.顺序表的内存申请head.h: typedef int datatype;typedef struct sqlist {//数据元素datatype data[MAXSIZE];//顺序表长度int len;}*sqlist; //*sqlist的作用: //sqlist:struct Sqlist * sqlist create();head.c: sqlist create() {sqlist list (sqlist)…

为何在 Vue 的 v-model 指令中不能使用可选链(Optional Chaining)?

Vue 的 v-model 是实现组件与数据双向绑定的核心指令之一&#xff0c;它本质上是一个语法糖&#xff0c;用于简化对表单元素和组件 props 的同步更新。然而&#xff0c;在 Vue 3&#xff08;以及 Vue 2 的某些模式下&#xff09;&#xff0c;开发者尝试在 v-model 中使用 JavaS…

基于单片机智能药盒/智能药箱/定时吃药系统

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 本设计实现了一种基于单片机的智能药盒&#xff0c;系统以微控制器&#xff08;如STM32&#xff…

(25)python+playwright自动化处理单选和多选按钮-中

1.简介上一篇中讲解和介绍的单选框有点多&#xff0c;而且由于时间的关系&#xff0c;决定今天讲解和分享复选框的相关知识。2.什么是单选框、复选框&#xff1f;单选按钮一般叫raido button&#xff0c;就像我们在电子版的单选答题过程一样&#xff0c;单选只能点击一次&#…

Nginx IP授权页面实现步骤

目标&#xff1a;一、创建白名单文件sudo mkdir -p /usr/local/nginx/conf/whitelist sudo touch /usr/local/nginx/conf/whitelist/temporary.conf二、创建Python认证服务文件路径&#xff1a;/opt/script/auth_server.pyimport os import time from flask import Flask, requ…

2025年7月中科院一区-向光生长优化算法Phototropic growth algorithm-附Matlab免费代码

引言 本期介绍一种新的元启发式算法——向光生长优化算法Phototropic growth algorithm&#xff0c;PGA。灵感来自植物细胞在阳光下的生长模式。于2025年7月最新发表在JCR 1区&#xff0c;中科院1区 SCI 期刊 Knowledge-Based Systems。 该算法将生物学启发的确定性生长行为与…

poi-excel-添加水印

1、官网快速指南 https://poi.apache.org/components/spreadsheet/quick-guide.html 访问如上地址可以查看到poi的相关操作方式&#xff1a; How to create a new workbookHow to create a sheetHow to create cellsHow to create date cellsWorking with different types of…

STM32 开发的鼠标:技术详解与实现指南

概述基于STM32微控制器开发的鼠标是一种高度可定化的输入设备解决方案&#xff0c;广泛应用于工业控制、嵌入式系统、特殊人机交互等领域。相比传统鼠标&#xff0c;STM32鼠标具有以下优势&#xff1a;高度可定制性&#xff1a;可添加特殊功能按键、传感器集成低功耗设计&#…

GoLang教程007:打印空心金字塔

4.6 案例一&#xff1a;打印金字塔编写一个程序&#xff0c;可以接收一个整数&#xff0c;表示层数&#xff0c;打印出金字塔。1️⃣第一步&#xff1a;打印一个矩形 package mainimport "fmt"func main() {// i表示层数for i : 1; i < 3; i {// j表示每层打印多少…

iOS开发 Swift 速记3:运算符与控制结构

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

ElasticSearch中需要注意的点,附官方文档解读

1.批量更新数量大小限制 https://www.elastic.co/guide/cn/elasticsearch/guide/current/bulk.html#_How_Big_Is_Too_Big 整个批量请求都需要由接收到请求的节点加载到内存中&#xff0c;因此该请求越大&#xff0c;其他请求所能获得的内存就越少。批量请求的大小有一个最佳值…

Git GitHub精通:前端协作开发的“瑞士军刀“!

前言&#xff1a;为什么你的代码总是"失踪"&#xff1f; "啊&#xff01;我的代码呢&#xff1f;"——这可能是每个程序员都曾发出过的灵魂呐喊。还记得上周我熬夜写的300行JavaScript&#xff0c;第二天醒来发现被自己手贱覆盖了&#xff0c;那一刻我深刻…

第 30 场 蓝桥·算法入门赛 题解

1. 零食争议【算法赛】 签到题&#xff1a;1-7奇数相加 #include <bits/stdc.h> using namespace std; int main() {// 请在此输入您的代码cout<<1357;return 0; } 2. 数字炸弹【算法赛】 把n个人看为前n-1和后n-1 &#xff0c; 方便找到是第几段的第几个数 #in…

闲庭信步使用图像验证平台加速FPGA的开发:第二十四课——图像直方图均衡化的FPGA实现

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击top_tb.bat文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程…

LabVIEW 2025安装包| 免费免激活版下载| 附图文详细安装教程

[软件名称]&#xff1a;LabVIEW 2025 [软件大小]&#xff1a;13 G [系统要求]&#xff1a;支持Win7及更高版本 [下载通道]:夸克网盘 [下载链接]: https://pan.quark.cn/s/7e9527cc06a3 &#xff08;建议用手机保存到网盘后&#xff0c;再用电脑下载&#xff09; 更多免费软件&a…

如何实现泵站的无人值守:御控智慧水务平台

在城乡供水、农田灌溉、工业循环水等场景中&#xff0c;泵站作为核心动力设施&#xff0c;其运行效率直接影响水资源调配的稳定性。然而&#xff0c;传统泵站管理长期面临三大痛点&#xff1a;人力成本高昂&#xff1a;偏远地区泵站需24小时值守&#xff0c;单站年均人力成本超…

深度学习篇---车道线循迹

要实现基于深度学习的双车道线&#xff08;黄色车道线&#xff09;循迹&#xff08;通过预测四个轮子的转速实现自主控制&#xff09;&#xff0c;需要从数据采集、模型设计、训练策略、环境适应等多维度系统优化。以下是具体方案及需要注意的关键事项&#xff0c;旨在提升精准…