我在 webkit 的移动版本中遇到了一个问题(特别是 iOS 5.1.1 上的 Webkit 534.46 作为移动 Safari,现在是 iOS 版 Chrome),这在我见过的任何桌面浏览器上都没有发生。(即下面的演示应该在 webkit 的移动版本上查看。)
这是这个问题的一个活生生的例子。CSS 的核心非常简单。它在页面左侧放置一个字母索引:
#index {
left:0; margin:0; padding:0; position:fixed; top:0; width:3em;
}
当元素固定在主体顶部上方时,就会出现此问题。它完全能够与之交互,直到滚动发生变化,然后它停止接受输入。如果我(手动)摇动滚动甚至一个像素,那么它会再次变为活动状态。该示例尽可能简单,不使用任何 JavaScript。在真正敲定它之后,我发现该元素似乎认为它是滚动的,但在视觉上是固定的。换句话说,如果您单击“A”然后尝试再次单击“A”,有时您会再次单击,但它会在列表的下方。这对我来说似乎是一个 CSS 重排问题。我知道移动 webkit 试图减少回流的次数。
我可以使用 JS 强制整个文档的 CSS 在滚动时重排(使用一个油门防止它在滚动后 100 毫秒内发生),这在简单示例中似乎解决了这个问题。不幸的是,这对这个问题的真实世界版本没有帮助。
我的问题是这里发生了什么,是否有我缺少的 CSS 解决方法?具体来说,我很好奇是否有任何 CSS 专家可以弄清楚阻止点击点击固定元素上正确位置的布局情况是什么?更好的理解可能有助于找到真正的解决方法。
编辑:我忘了提到该示例明确地将视口强制为窗口大小。所以用户不能放大/缩小,这意味着 position:fixed 应该将元素锚定到窗口的左侧。
更新 (2012-09-20):这似乎已在 iOS 6 上的 Mobile Safari(以及 UIWebView)中得到修复。任何解决方法都应首先检查以确保它在 iOS < 6 上。例如,使用CssUserAgent这将如下所示:
if (parseFloat(cssua.ua.ios) < 6) { /* ... */ }