Webkit ブラウザーでのみ発生するかなり複雑なレイアウトの問題があります。このスクリーンショットを見てください:
まず、ここで何をしようとしているのかを説明させてください。このレイアウトの目的は、画像のグリッドを表示することです。各グリッド セルは正方形です。レイアウトはレスポンシブであるため、別のビューポート幅では、1 行あたり 2 つではなく 3 つの画像が表示される場合があります。
技術的には、マークアップは図のリストであり、各図内にはリンクがあり、リンク内には実際の画像があります。疑似マークアップ:
<ul>
<li><figure><a href=""><img src="" width="0" height="0" /></a></figure></li>
<li><figure><a href=""><img src="" width="0" height="0" /></a></figure></li>
</ul>
ご覧のとおり、内側の画像には幅がありません。画像コンテナとして使用する li 要素に幅が設定されているため、これは意図的なものです。スクリーンショットに示されているビューポートの例では、li 要素の幅が 50% に設定されています。
次に、実行時に img 要素をすべて非表示にし、その src パスを「a」要素の背景画像として設定します。これの目的は、画像のサイズや縦横比に関係なく、画像を正しく中央に配置することです。
主な注意事項:すべての要素で box-sizing:border-box を使用しています。
ここで、このランタイム ルーチン中に、「li」要素の高さを動的に計算して、正方形にするようにします。サンプルのスクリーンショットのビューポート幅が 400 ピクセルであると仮定してみましょう。すべての "li" 要素は幅が 50% に設定されているため、幅は 200 ピクセルにする必要があります。これを知って、単純にこの「li」要素の高さを 200 ピクセルに設定し、正方形のコンテナーにします。
// applied to all "li"s in the list
$(this).height($(this).width());
これは、Webkit ブラウザー (Chrome、Safari) を除いて、私がテストしたすべてのブラウザーで完全に機能します。"a" (または li) 要素の幅を設定する前に、幅と CSS 幅の両方を出力すると、非 Webkit ブラウザーはすべての "a" 要素に対してまったく同じ幅を報告します。Webkit ブラウザーでコンソールを見ると、幅にばらつきがあります。一方の「a」要素は 200px で、もう一方は 191px です。実際の値と発生するかどうかは、ブラウザのビューポート幅に依存するようです。
いずれにせよ、結果はスクリーンショットに見られる醜いギャップです. 何が起こったかというと、Webkit がこれらの「a」コンテナーの異なる幅を予期せず報告したため (それらはすべて 50% に設定されています)、高さもさまざまになり、ギャップが発生します。
したがって、大きな疑問は次のとおりです。他のブラウザーでは報告されないのに、すべて同じ親の 50% に設定されている "a" 要素の幅が Webkit によって正しく報告されないのはなぜですか?
これまでの諸説
これにより、これまでに調査されたいくつかのこと:
追加の「スペース」を引き起こすことが知られているli要素でインラインブロックを使用しています。マークアップから空白を削除することでこれを解決しました。いずれにせよ、インライン ブロックは問題ではありません。「li」要素をフロートに変更しても、Webkit ブラウザーは表示すべきではない場合でも異なる幅を表示するからです。
別の理論は、読み込みの順序に関係しています。一部の主張は、私の画像バックグラウンド ランタイム ルーチンを window.load イベントに遅らせることが役立つかもしれません。残念ながら、結果はまったく同じです。
jQuery の .width() と .css("width") の違いも認識しています (1.8.2 を使用しています)。私は両方をコンソールに出力し、Webkit は両方の値を間違って取得するため、違いはありません。
要約
長い説明で申し訳ありませんが、要約します。リスト要素に 50% (ビューポートの幅によっては 33.3333%) の幅を設定し、実行時に実際のピクセル幅を取得します。すべてのリスト要素の幅のパーセンテージは同じですが、なんらかの不思議な理由で、Webkit ブラウザーは異なる幅を報告します。
最後に、問題のライブ リンクを次に示します。
[問題が解決し、ライブコードが変更されたため、削除されました]
この問題を再現するには、Webkit ブラウザーを使用して、ウィンドウのサイズをサンプルのスクリーンショットに合わせて大まかに変更する必要があります。任意のビューポート幅で発生するようです。