👆 触摸事件处理
移动端最核心的交互是触摸。JavaScript 提供 Touch Events(多点触摸)和 Pointer Events(统一输入)两套体系。
Touch 事件体系
| 事件 | 触发时机 | 核心属性 |
|---|---|---|
touchstart | 手指触摸屏幕时 | touches(所有触点列表) |
touchmove | 手指在屏幕上滑动时 | touches(所有触点列表) |
touchend | 手指离开屏幕时 | changedTouches(变化的触点) |
touchcancel | 触摸被中断时(如来电、通知) | changedTouches |
触摸事件实战:滑动方向判断
// ===== 判断滑动方向 =====
let startX = 0, startY = 0;
document.addEventListener('touchstart', (e) => {
startX = e.touches[0].clientX;
startY = e.touches[0].clientY;
}, { passive: true });
document.addEventListener('touchend', (e) => {
const endX = e.changedTouches[0].clientX;
const endY = e.changedTouches[0].clientY;
const diffX = endX - startX;
const diffY = endY - startY;
const threshold = 50; // 最小滑动距离(px)
if (Math.abs(diffX) > Math.abs(diffY) && Math.abs(diffX) > threshold) {
console.log(diffX > 0 ? '👉 右滑' : '👈 左滑');
} else if (Math.abs(diffY) > threshold) {
console.log(diffY > 0 ? '👇 下滑' : '👆 上滑');
}
});
Pointer Events(推荐:统一鼠标 + 触摸)
Pointer Events 是 W3C 标准,统一了鼠标、触摸、触控笔,推荐在不需多指操作的场景使用。
// ===== Pointer Events(统一鼠标和触摸)=====
const box = document.getElementById('box');
box.addEventListener('pointerdown', (e) => {
console.log('按下:', e.pointerType); // 'mouse' | 'touch' | 'pen'
box.setPointerCapture(e.pointerId); // 捕获指针,防止丢失
});
box.addEventListener('pointermove', (e) => {
console.log(`移动: (${e.clientX}, ${e.clientY})`);
});
box.addEventListener('pointerup', (e) => {
console.log('抬起:', e.pointerType);
box.releasePointerCapture(e.pointerId);
});
box.addEventListener('pointercancel', (e) => {
console.log('指针取消(如来电中断)');
});
移动端事件触发顺序
📋 完整事件触发顺序
touchstart → touchmove → touchend → (延迟 ~300ms) → mousedown → mouseup → click
理解这个顺序对于解决点击穿透等问题至关重要。