按钮必须用原生等语义化标签,禁用div模拟;需同时设置touch-action: manipulation、cursor: pointer,并确保dom深度≤6层以保障触控响应。

button 必须用原生标签,别套 div
用 <div class="btn"> + <code>onclick 模拟按钮,是触控失灵的头号原因。浏览器不认为它是可交互元素,:active 不触发、VoiceOver 跳过、iOS Safari 甚至不走 touchstart 通道。
- 所有带点击行为的区域,一律用
<button></button>、<a href></a>或<input type="checkbox"> - 禁用
role="button"—— 它不自动获得焦点,也不响应Enter/Space,在微信 X5 内核中直接失效 - 需要样式隔离?用
button { all: unset; }重置后再写,别动语义结构 -
<label></label>必须直接包裹<input type="checkbox">,中间不能有换行或空格,否则点击文字区域无效
touchstart 绑定要轻量,别乱加 preventDefault()
绑定 touchstart 是为了即时反馈,不是为了“拦截一切”。加错 preventDefault() 反而会切断 click、跳转或键盘支持。
- 纯按钮类操作(如展开菜单、切换开关):只更新 UI 状态,不要 在
touchstart里调event.preventDefault() - 只有在
touchmove中做自定义滑动时,才需配合{ passive: false }和preventDefault() - 为激活
:active,哪怕什么都不做,也得加个空监听:el.addEventListener('touchstart', () => {}) - 同时兼容鼠标和触控?监听
pointerdown更稳,它无延迟、支持键盘,且不用区分touchstart/mousedown
touch-action 和 CSS 配合才能让 :active 生效
Safari 和部分 WebView 默认不触发 :active,除非明确告诉它“这是可点区域”。光写样式没用,必须三者齐备。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 给按钮加
touch-action: manipulation—— 这是绕过 300ms 延迟、启用:active的关键 - CSS 中显式声明
cursor: pointer(对触摸无效,但能激活 Safari 的 active 检测) - 避免父级设
pointer-events: none或opacity: 0,会连锁导致子元素:active失效 -
:active样式必须写在常态规则之后,且过渡属性(如transition: box-shadow 0.08s)得提前声明在常态里
DOM 深度超 6 层,touchstart 就开始掉帧
真机实测显示,body > div > div > div > div > div > button 这种 7 层结构,touchstart 到 handler 执行平均延迟 42ms;而 <main><nav><button></button></nav></main> 三层结构稳定在 8–12ms。
- 用 Chrome DevTools → Elements 面板右键任意元素 →
Show DOM properties查depth值,≥ 6 就该重构 - 砍掉仅为加 class 套的
<div>,改用 <code>display: contents(Safari 15.4+ 支持)抹除渲染层但保留语义流 - 动态插入内容时,用
DocumentFragment批量append,别循环appendChild—— 每次调用都可能触发 layout - 导航结构控制在
nav > ul > li > a这类 4 层以内,别堆到 6+ 层
真正卡住触控响应的,从来不是 JS 执行慢,而是 HTML 结构本身在拖慢事件路径——每多一层嵌套、每少一个语义标签、每错配一次
touch-action,都在把用户那 100ms 的容忍阈值一点点吃掉。









