一份针对 iOS WKWebView 和移动端 Web 的 15 个触感问题的清单,包含症状、真正原因以及可直接复制的代码解决方案,基于自建应用的一个晚上的调试经验。

Stars

37

7 天增长

暂无数据

Fork 数

8

开放 Issue

0

开源协议

暂无数据

最近更新

2026-07-19

AI 仓库情报摘要
FR-AI / ANALYSIS

为什么值得关注

它提供了具体的、可操作的解决方法,解决实际中困扰 WKWebView 应用的 UI 延迟和抖动问题,且经过真机探针测试(方法论 A),覆盖键盘、列表跳动和动画细节。

适合谁使用

  • 基于 WKWebView 构建应用的移动端 Web 开发者
  • 从事混合应用开发的 iOS 开发者
  • 优化移动端浏览器/PWA 触感的前端工程师
  • 调试 UI 动画异常的产品经理和测试工程师

典型使用场景

  • 修复 iOS WKWebView 中键盘遮挡输入框的问题
  • 消除打开编辑抽屉或弹窗时的界面跳跃
  • 防止内联编辑或 textarea 自适应高度引起的列表滚动跳动
  • 确保转场动画流畅,无闪烁或重复触发

项目优势

  • 基于真实设备测试,捕获了事件延迟等定量数据(如 76ms 事件延迟)
  • 为每个问题提供了渐进式解决方案(预锁、原生桥接)
  • 包含两种调试方法论(键盘探针和 scrollTop 窃听)
  • 区分纯 Web 问题和壳专属问题,并提供相应变通方案

使用前须知

  • 部分解决方案需要控制 WKWebView 壳(如 keyboardWillShow 桥接、confirm 弹窗修复)
  • 仅针对 iOS Safari/WKWebView 的行为,Android 或其他浏览器可能不同
  • 未覆盖所有设备固件组合;建议使用探针记录日志

README 快速开始

把网页 App 磨出原生手感

iOS WKWebView / 移动端 Web 的 15 个手感坑,和一晚上 debug 出来的解法。

我们家有一个装在 WKWebView 壳里的自建 app。功能都好好的,但手感处处差半口气:键盘弹起来界面慢半拍、点编辑屏幕猛跳一下、抽屉开关会闪、动画时不时抽风。一晚上连发八个版本把它们全钉死之后,把每个坑的症状、真凶、解法整理成这份清单——都是通用问题,不绑定任何框架,代码可以直接抄。

读法:按你眼睛看到的症状找对应的坑。每一坑 = 你会看到什么 → 真凶是谁 → 怎么修。三个「方法论」比任何单个解法都值钱,建议先读。

没有壳、纯浏览器/PWA 的网页也适用吗? 适用九成——列表跳动篇、动效篇 全部通用,键盘篇除坑 7 外通用(iOS Safari 的 innerHeight 一样不可信)。只有两处是壳专属:坑 7(键盘预告,纯网页够不到,这是网页手感的天花板)和坑 14(confirm 被吞)。读完坑 7 你也就知道了自己什么时候值得包一个壳。


目录

🪶 姊妹篇 动效篇 motions.md:这篇治病(跳/闪/卡),那篇造美——左缘滑动返回全套、底部抽屉开合、列表删除收拢、开书与 3D 翻页、推入转场、进场纪律。

🆕 续篇 2.0:从治病到防疫——又两周血账:开屏三段接力、乐观更新与墓碑、流式交接、长列表不白屏、壳网分工(网页治不了的病),坑 16–40 + 四张「出生清单」。


一、键盘篇

坑 1:键盘弹起,直接盖住输入框

症状:键盘出来了,底部输入条被埋在键盘底下。

真凶:iOS 里键盘弹起时,100vh/100dvh 布局的页面不会缩——layout viewport 不变,只有 visualViewport 变小。你的"全屏容器"还是全屏,底部自然被键盘压住。

解法:监听 visualViewportresize,键盘出现时把根容器锁到可视高度(行内 !important 压过样式表),收起时还原:

const vv = window.visualViewport;
function fit() {
  const el = document.querySelector('.app-root');
  const kb = /* 键盘高度,见坑 2 */;
  if (kb > 60) {
    el.style.setProperty('height', Math.round(vv.height) + 'px', 'important');
  } else {
    el.style.removeProperty('height');
    if (window.scrollY) window.scrollTo(0, 0); // iOS 收键盘爱把 body 滚走半截不还,必须钉回
  }
}
vv.addEventListener('resize', fit);
vv.addEventListener('scroll', fit);

注意最后那行 scrollTo(0,0):iOS 收键盘(尤其输入框被整个卸载时)经常把 body 滚走半截不还原,漏了这一钉,整个 app 会卡在半屏。


坑 2:键盘明明出来了,代码却认为"没有键盘"

症状:有时键盘起来了,界面却纹丝不动,过几百毫秒才猛跳到位;或者莫名闪现几次。

真凶:判定键盘的经典写法是 window.innerHeight - visualViewport.height > 阈值。但有些壳(WKWebView)在键盘弹出的瞬间会把 window.innerHeight 也临时抽成键盘后的高度——两个数一减等于 0,判定被骗过,随后 innerHeight 又悄悄恢复。我们用真机探针(方法论 A)抓到的现场:visualViewport.height 956→610 的同一毫秒,innerHeight 也是 610,几百毫秒后才回 956。

解法:不要信 window.innerHeight 的瞬时值。开屏时记一个全高基准,此后一切判定都用它:

let fullH = window.innerHeight;           // 开屏定盘
function kbGap() {
  // 无键盘迹象时校准基准(转屏也走这条;键盘开着时 vv 缺口 > 60,进不来)
  if (vv.height > fullH - 60) fullH = Math.max(vv.height, window.innerHeight);
  return fullH - vv.height;               // 这才是可信的键盘缺口
}

坑 3:键盘先起

项目描述

把网页 App 磨出原生手感——iOS WKWebView 的 15 个手感坑(键盘同步/列表跳动/动画细节)与一晚上 debug 出来的解法,附真机探针与 scrollTop 窃听方法论

相关仓库与替代方案

根据分类、Topic 和编程语言匹配的相似项目。

MoonshotAI
精选
MoonshotAI GitHub avatar

Kimi-K3

Kimi K3 is an open-weight, 2.8T-parameter native multimodal agentic model with a 1M-token context window, designed for frontier coding, knowledge work, and reasoning tasks.

AI 与机器学习AI 智能体
3,348
xuchonglang
精选
xuchonglang GitHub avatar

investing-for-beginners

A structured investing guide for Chinese beginners covering US stocks, options, and cryptocurrency, with focus on foundational concepts and risk awareness.

区块链与 Web3
2,739
Krishnagangwal
精选
Krishnagangwal GitHub avatar

CS-Fundamentals

A curated collection of Computer Science fundamentals (PDFs, notes, cheatsheets, interview question banks) for placement preparation, covering seven core subjects plus general resources.

数据与数据库数据库与存储
2,326