ちょうど 33% の幅を持つ 3 つのインライン ブロック div が親に収まりません 質問する

ちょうど 33% の幅を持つ 3 つのインライン ブロック div が親に収まりません 質問する

これはよくある問題ですが、なぜ起こるのか分かりません。

親 div があり、その div 内に幅が 33% (正確には 33.3% ではありません!) に設定された 3 つの div がありますdisplay: inline-block

Chrome ではうまく動作しますが、Mozilla と Opera では動作しません (IE ではまだテストしていません)。問題は、ブラウザがパーセンテージからピクセル サイズを計算するために使用するアルゴリズムにあるのではないかと思いました。しかし、DOM メトリックを確認すると、親の幅は 864 ピクセルで、子の幅は 285 ピクセルであることがわかりました (正しいのは、864 * .33 = 285.12)。しかし、なぜ親に収まらないのでしょうか? 285 * 3 = 855 は、親の幅より 9 ピクセル少ないのです。

ああ、そうですね、すべての div のパディング、マージン、境界線は 0 に設定されており、DOM メトリックによってそれが確認されています。

ベストアンサー1

HTMLソースコード内の空白

HTML ソース コードで、テキスト行や画像行、または要素がある場合inline-block、それらの間に空白 (空白スペース、タブ、または改行) があると、ページがレンダリングされるときにそれらの間に 1 つの空白文字が追加されます。たとえば、次の HTML では、4 つのコンテンツのそれぞれの間に空白スペースが表示されます。

one
two
<img src="three.png"/>
<span style="display: inline-block;">four<span>

これは、テキスト行や、テキスト行内に表示される小さな画像や HTML 要素に非常に役立ちます。ただし、inline-blockテキストの段落内にコンテンツを追加する方法ではなく、レイアウト目的で使用すると問題になります。

余分なスペースを削除する

要素間に 4 ピクセル程度の余分なスペースが追加されるのを回避する最も安全なクロスブラウザの方法はinline-block、HTML タグ間の HTML ソース コード内の空白を削除することです。

たとえば、ul3 つのフロートliタグを持つ がある場合:

<-- No space, tabs, or line breaks between </li> and <li> -->
<ul>
    <li>...</li><li>...</li><li>...</li>   
</ul>

残念ながら、これはウェブサイトの保守性を損なうことになります。コードが読みにくくなるだけでなく、データとフォーマットの分離

後から別のプログラマーが来て、各liタグをソース コードの別の行に配置することにした場合 (タグが同じ行にある理由を知らないか、HTML Tidy を実行しても関連する HTML コメントに気付く機会さえなかった可能性があります)、突然、Web サイトにフォーマットのバグが発生し、特定が困難になる可能性があります。

代わりにフローティング要素を検討してください

inline-block空白の動作は、段落のテキストのフロー内にコンテンツを追加する以外の目的で、一般的なレイアウト目的に使用するのは不適切である可能性があることを強く示唆しています。

inline-blockさらに、特に古いブラウザでは、コンテンツに完全なスタイルを設定したり配置したりすることが非常に難しい場合があります。

その他のソリューションの簡単な概要

  1. 閉じタグを次の開きタグと同じ行に配置し、その間に空白を入れないでください。
  2. HTML コメントを使用して、閉じタグと次の開始タグの間の空白をすべて埋めます (@Arbel の提案どおり)。
  3. 各要素に負の左マージンを追加します (通常はフォント サイズに基づいて -3 ピクセルまたは -4 ピクセル)。この特定のアプローチはお勧めしません。
  4. コンテナ要素の を0または0.01emに設定しますfont-size。これはSafari 5では機能しません(それ以降のバージョンではわかりません)。また、レスポンシブデザインfont-sizeウェブサイト、または以外の単位を使用するウェブサイトpx
  5. JavaScript または jQuery を使用して、コンテナーから空白のみのテキスト ノードを削除します。これは IE8 以前では機能しません。これらのブラウザーでは、要素間に空白のみがある場合、テキスト ノードは作成されませんが、要素間にスペースは追加されます。
  6. コンテナーに対してletter-spacingと を設定します(@PhillipWills の提案どおり)。word-spacingさらに詳しい情報これにはemウェブサイト上のサイズを標準化する必要があり、すべてのウェブサイトにとって適切な選択肢ではない可能性があります。
  7. text-space-collapse: discard;コンテナ(以前は と呼ばれていました)に追加しますwhite-space-collapse。残念ながら、このCSS3スタイルまだどのブラウザでもサポートされておらず、標準も完全に定義されていません。

おすすめ記事