
通过为游戏容器或目标元素设置 touch-action: none 并配合 user-select: none,可彻底禁用该区域的默认触摸行为(如滚动、缩放、拖拽),从而实现类似 2048 游戏的精准触控交互体验。
通过为游戏容器或目标元素设置 `touch-action: none` 并配合 `user-select: none`,可彻底禁用该区域的默认触摸行为(如滚动、缩放、拖拽),从而实现类似 2048 游戏的精准触控交互体验。
在移动端浏览器中,当用户在可滚动区域(如 )内进行垂直拖拽时,系统会默认触发页面滚动或下拉刷新(特别是 iOS Safari 的“橡皮筋”效果)。即使你为元素绑定了 touchstart、touchmove 事件并调用 e.preventDefault(),若未正确配置 CSS 层级的触摸行为策略,JavaScript 阻止仍可能失效——因为浏览器会在事件分发前就根据 touch-action 决定是否启用原生滚动。
✅ 正确做法是优先使用 CSS 控制触摸行为:
/* 推荐:仅作用于游戏容器,避免影响全局 */
#game-container {
touch-action: none; /* 完全禁用所有原生触摸行为(滚动/缩放/双指旋转) */
user-select: none; /* 防止误触选中文本(提升游戏体验) */
-webkit-user-drag: none;
}
⚠️ 注意事项:
- ❌ 不要对
*或body全局设置touch-action: none,否则整个页面将无法滚动,严重影响可访问性; - ✅ 若需保留部分方向操作(例如仅允许水平滑动但禁止垂直滚动),可使用更精细的值:
touch-action: pan-x; /* 允许水平滚动,禁止垂直滚动和缩放 */ touch-action: pan-y; /* 允许垂直滚动,禁止水平滚动和缩放 */ touch-action: manipulation; /* 启用轻量级触摸优化(隐含 pan-x pan-y,禁用 pinch-zoom) */
- ? JavaScript 补充(非必需,但推荐增强兼容性):
const gameContainer = document.getElementById('game-container'); gameContainer.addEventListener('touchmove', (e) => { // 确保即使 CSS 失效也能兜底拦截 e.preventDefault(); }, { passive: false }); // ⚠️ 必须显式声明 passive: false 才能调用 preventDefault()
? 小结:touch-action 是现代浏览器解决此类问题的首选方案,它在事件流早期即介入,比 JavaScript 更高效、更可靠。结合精准的选择器作用域与合理的 passive 事件监听,即可实现「容器内自由触控、容器外正常滚动」的理想交互分离效果。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











