移动端必须使用 touchstart、touchmove、touchend 等触摸事件而非 click,需处理 touches 等类数组、调用 preventdefault 阻止默认滚动,并手动实现 swipe 和 longpress 手势逻辑。

移动端的触摸与手势事件不能直接用 click 或 mousedown 等桌面事件替代,必须使用专门的触摸事件 API,并注意手势的组合逻辑和兼容性处理。
基础触摸事件:touchstart、touchmove、touchend
这是最底层的触摸事件,对应手指按下、滑动、抬起三个阶段。每个事件对象都包含 touches、targetTouches 和 changedTouches 三个类数组,其中 touches 表示当前所有接触屏幕的手指,changedTouches 表示本次事件中状态变化的手指(比如刚按下的、刚抬起来的)。
- 绑定时建议用
addEventListener,避免内联写法 - 记得在
touchstart中调用event.preventDefault()阻止默认滚动行为(如需要自定义拖拽) - 多个手指操作时,需通过
touches.length判断是否为单指/多指
模拟简单手势:滑动(swipe)与长按(longpress)
浏览器不提供原生的 swipe 或 longpress 事件,需手动计算位移和时间阈值。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 滑动判断:记录
touchstart的坐标,touchend时对比位移差(如Math.abs(dx) > 30 && Math.abs(dy) 视为水平滑动) - 长按实现:在
touchstart启动定时器(如 500ms),touchend或touchcancel时清除;定时器到期未取消则触发长按逻辑 - 注意防误触:手指轻微抖动或移动应忽略,可加最小位移阈值(如 10px)
多点手势:缩放(pinch)与旋转(rotate)
双指操作需同时跟踪两个触点的距离与角度变化。关键在于每次 touchmove 中重新计算两点间距离(缩放)和连线角度(旋转)。
- 缩放检测:用
Math.hypot(dx, dy)计算两点间距,对比上一次距离得出缩放比例 - 旋转检测:用
Math.atan2(dy, dx)得到角度,再减去上一次角度得到旋转弧度 - 只在
targetTouches.length === 2时才计算,避免单指干扰
现代替代方案:Pointer Events 与第三方库
Pointer Events 是 W3C 标准,统一了鼠标、触摸、笔输入,支持 pointerdown、pointermove、pointercancel 等事件,且自带 isPrimary 和 pressure 属性。但 iOS Safari 直到 16.4 才完全支持,旧版本仍需 fallback 到 touch 事件。
- 推荐渐进增强:先尝试监听
pointerdown,失败则降级为touchstart - 复杂手势(如拖拽、捏合、双击)建议用成熟库,如 Hammer.js(轻量)、@use-gesture(React 友好)或原生
GestureDetector(Chrome 115+ 支持,目前仅限 Chromium) - 注意:iOS Safari 对
passive: false的touchmove限制严格,必须显式声明才能阻止滚动
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










