Webkit のモバイル バージョン (具体的には、モバイル Safari としての iOS 5.1.1 上の Webkit 534.46、および現在は iOS 用 Chrome) で問題が発生していますが、これは私が見たどのデスクトップ ブラウザーでも発生しません。(つまり、以下のデモは Webkit のモバイル バージョンで表示する必要があります。)
これが問題の実例です。CSS のコアは非常に単純です。ページの左側にアルファベットのインデックスを配置します。
#index {
left:0; margin:0; padding:0; position:fixed; top:0; width:3em;
}
この問題は、要素がボディの上に固定されている場合に発生します。スクロールが変化し、入力の受け入れを停止するまで、完全に操作できます。スクロールを(手動で)1ピクセルでも揺らすと、再びアクティブになります。この例は可能な限り単純に保たれ、JavaScript は使用されていません。実際に叩いた後、要素がスクロールされていると認識しているように見えますが、視覚的には修正されていることがわかりました。つまり、「A」をクリックしてからもう一度「A」をクリックしようとすると、2 回目のクリックが表示されることがありますが、それはリストのさらに下になります。これは、CSS リフローの問題のように思えました。モバイル Webkit がリフローの数を減らそうとしていることは知っています。
JS を使用して、スクロール時にドキュメント全体の CSS を強制的にリフローさせることができます (スクロール後 100 ミリ秒まで発生しないようにするスロットルを使用)。これは、単純な例でこの問題を回避するようです。残念ながら、これはこの問題の実際のバージョンには役立ちません。
私の質問は、ここで何が起こっているのか、私が見逃している CSS の回避策はありますか? 具体的には、クリックが固定要素の正しい場所にヒットするのを妨げているレイアウトの状況が何であるかをCSSの第一人者が理解できるかどうかに興味がありますか? より良い理解は、本当の修正を見つけるのに役立つかもしれません.
編集:この例では、ビューポートをウィンドウのサイズに明示的に強制していることを忘れていました。つまり、position:fixed は要素をウィンドウの左側に固定する必要があります。
更新 (2012-09-20):これは、iOS 6 のモバイル Safari (および UIWebView) で修正されたようです。回避策は、最初に iOS 6 未満であることを確認する必要があります。たとえば、CssUserAgentを使用すると、次のようになります。
if (parseFloat(cssua.ua.ios) < 6) { /* ... */ }