触控失效主因是键盘遮挡导致坐标系偏移与焦点校验缺失:focusin时getboundingclientrect()返回旧值、absolute定位缺width:100%致点击区塌陷、ios键盘收起后scrolly未重置引发锚点漂移,须用settimeout延时读取rect、显式设宽、blur时恢复滚动并校验activeelement。

不是元素“消失”或“失效”,而是它被渲染在键盘上方不可触达的区域——用户点击时实际命中的是键盘遮盖下的空白层,pointer-events 仍为 auto,但坐标系已偏移。
focusin 后 getBoundingClientRect().bottom 返回旧值导致触控坐标错位
软键盘尚未完全展开时触发 focusin,此时调用 input.getBoundingClientRect() 拿到的 bottom 值仍是弹出前的坐标。若你用它计算 bottom 偏移并设置 position: absolute,元素会定位在键盘下方(即用户手指点不到的位置),而非紧贴键盘顶部。
- 必须加
setTimeout(() => { }, 0)确保浏览器完成重排后再读取 rect - 不能依赖
offsetTop或clientHeight:它们不反映视觉视口变化 - 验证是否真在键盘上方:用
document.elementFromPoint(x, y)在点击位置测点,常返回null或错误节点
absolute 定位后 width: 100% 缺失引发点击区域塌陷
当把 position: fixed 切成 position: absolute,若底部容器没显式设 width: 100%,它的宽度会收缩为内容宽(如按钮文字宽度)。结果是视觉上还在底部,但可点击区域只剩按钮本身,左右留白无法响应触摸。
- 必须加
width: 100%,且父容器不能有transform或overflow: hidden干扰尺寸继承 - 横屏时需额外检查:
max-width: 100vw防止溢出 - 用 Chrome DevTools 的 “Toggle device toolbar” + “Show rulers” 直观查看点击热区是否完整
visualViewport.height 被冻结但 scrollY 未归零导致触控锚点漂移
iOS Safari 在键盘收起后常不恢复 window.scrollY,页面仍停留在键盘弹起时的滚动位置。此时即使元素定位正确,用户点击底部区域,事件坐标映射到文档流中会落在旧的、已被上推的 DOM 位置上——看起来点了,实则点空。
- blur 回调里必须加
setTimeout(() => window.scrollTo(0, 0), 300),等键盘完全收起再重置锚点 - 不能只靠
window.scrollTo({ top: 0, behavior: 'instant' }):iOS 对behavior: 'smooth'有节流,且部分 WebView 忽略该参数 - 若页面本身需要滚动,应记录键盘弹起前的
scrollY,收起后恢复,而非强制归零
最容易被忽略的是:所有触控失效都始于一次未校验的 document.activeElement ——如果焦点在 textarea 上,但监听器只绑了 input,那整个定位逻辑就断在第一步,后续所有坐标计算都是空中楼阁。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











