当前位置: 首页 > news >正文

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.dtcms.com/a/292086.html

相关文章:

  • 16核32G服务器实现5000 QPS高并发的业务线程池优化配置方案
  • Kafka基础理论速通
  • Linux研学-Tomcat安装
  • 异构融合 4A:重构高性能计算与复杂场景分析的安全与效率边界
  • 时序数据库IoTDB好不好?
  • Android-API调用学习总结
  • 基于Surfer与Voxler数据处理及可视化技术应用
  • 输电线路外破点位可视化监拍装置的 AI 智能识别可应对哪些电力安全隐患?如何保障其识别精度与响应速度?
  • c++,从汇编角度看lambda
  • 查看 iOS iPhone 设备上 App 和系统运行时的实时日志与崩溃日志
  • 十分钟快速完成光伏设计方案
  • C++11特性学习
  • UE5保姆级基础教程(第五章)
  • Linux操作系统之线程(六):线程互斥
  • 金山办公WPS项目产品总监陈智新受邀为第十四届中国PMO大会演讲嘉宾
  • 什么是AI思维:它是智能优先与世界模型重构商业逻辑
  • anchor 智能合约案例6 之 token_lottery
  • 让 Node.js 支持全局路径的模块搜索
  • solidity从入门到精通 第一章:区块链与智能合约的奇妙世界
  • (LeetCode 面试经典 150 题 ) 128. 最长连续序列 (哈希表)
  • 【bug】 jetson上opencv无法录制h264本地视频
  • [Dify] -进阶9- 使用 API 调用方式将 Dify 嵌入自己的网站
  • Typecho三种版权保护方法对比与实战指南
  • 【硬件基础】计算机存储和通信领域名词概念解释,时钟频率,传输速率,总线宽度,存储容量,带宽利用率,数据位宽,数据带宽
  • 牛客:最长无重复子数组
  • 嵌入式开发学习———Linux环境下数据结构学习(一)
  • Web3面试题
  • [特殊字符] 字节内部流出版!19道前端核心面试题解析——速存
  • 网络基础16--VRRP技术
  • ospf技术