幅がそれぞれ50%の2つのインラインブロック要素が、1つの行に並べては収まりません


87
<!DOCTYPE html>
<html>
<head>
<title>Width issue</title>
<style type="text/css">
body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
}
</style>
</head>
<body>
    <div id="left">Left</div>
    <div id="right">Right</div>
</body>
</html>

JSFiddle:http ://jsfiddle.net/5EcPK/

上記のコードは、#left divと#right divを1つの行に並べて配置しようとしています。しかし、上記のJSFiddle URLを見るとわかるように、そうではありません。

1つのdivの幅を49%に減らす問題を解決できます。http://jsfiddle.net/mUKSC/を参照してください。ただし、2つのdivの間に小さなギャップが生じるため、これは理想的なソリューションではありません。

私が問題を解決できる別の方法は、両方のdivをフローティングにすることです。http://jsfiddle.net/VptQm/を参照してください。これは正常に動作します。

しかし、私の元の質問は残ります。両方のdivがインラインブロック要素として保持されているのに、それらが並んでフィットしないのはなぜですか?

回答:


136

inline-block要素を使用する場合whitespace 、それらの要素の間には常に問題があります(そのスペースは約4px幅です)。

したがって、2つのdivsはどちらも幅が50%であり、さらにwhitespace(〜4px)は幅が100%を超えているため、壊れます。あなたの問題の例:


これを修正する方法はいくつかあります。

1.それらの要素の間にスペースを入れない

2. HTMLコメントの使用

3.親font-size0に設定し、inline-block要素に値を追加します

4.それらの間の負のマージンの使用(好ましくない

5.閉鎖角度の低下

6. 特定の HTML終了タグをスキップする参照のために@thirtydotに感謝)


参照:

  1. CSSトリックのインラインブロック要素間のスペースとの戦い
  2. インラインブロック要素間の空白を削除するby David Walsh
  3. インラインブロック要素間のスペースを削除する方法は?

以下のようMarcosPérezGudeは@ と述べ最善の方法は、使用することですrem、とにいくつかのデフォルト値を追加するfont-sizeにはhtml(のようにタグHTML5Boilerplate)。例:

html{
    font-size: 1em;
}

.ib-parent{             /* ib -> inline-block */
    font-size: 0;
}

.ib-child{
    display: inline-block;
    font-size: 1rem;
}

更新:2018年が近づいているため、フレックスボックスまたはさらに優れたCSSグリッドレイアウトを使用してください


3
ナンセンスではない@hoosierEE。要素間のスペースは問題ありません。インラインブロック要素がテキスト行に配置されるためです。スペースを一列に入れるとスペースができます。したがって、それが問題であると思っても、動作は正しいです(Vuckoが間違っていると言っているため)。
MarcosPérezGude 2016

2
@MarcosPérezGudeに同意します。この動作は正しいです。私の投稿からわかるように、その空白を削除する方法はいくつかあります(私自身もHTMLコメントを使用して空白を削除しています)。ただし、その空白を気にしたい場合は、いつでもflexboxtable/table-row/table-cellまたはを使用できますfloat
Vucko

2
私はインラインブロックを完全に使用しています。私の通常のアプローチはparent { font-size:0; } child {font-size: 1rem; }です。レムスで今が最も簡単です
マルコスペレスグード

タブがまだスペースとして解析されるのは少し面倒です。以前に終了タグの修正を削除するのを見たことはありませんが、不安定さや副作用はありますか?
MintWelsh 2017

また、borderオフになっていることを確認してください。これは、divをフローティングしている場合にスペースを追加できます。
evolross 2017年

22

css3の良い答えは:

white-space: nowrap;

親ノード、および:

white-space: normal;
vertical-align: top;

div(またはその他)で50%

例:http ://jsfiddle.net/YpTMh/19/

編集:

には別の方法があります:

font-size: 0;

親ノードの場合、子ノードでオーバーライドします


7

これは、2つのdiv間の空白がスペースとして解釈されているためです。<div>以下に示すようにタグを一列に配置すると、問題が修正されます。

<div id="left"></div><div id="right"></div>


4

インラインブロックの代わりにブロックします。これにより、div間のスペースを無視してdivがレンダリングされます。

display:block;

またはタグ間のスペースを削除する

<div id='left'></div><div id='right'></div>

または追加

margin: -1en;

レンダリングされた単一のスペースが占めるスペースを軽減するために、いずれかのdivに追加します。


2

以下のコードを確認してください:

body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
    float:left;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
    float:left;
}
<div id="left">Left</div>
<div id="right">Right</div>


2

フレックスボックスの例-これは、2つの並んだ要素を保持する親クラスに使用されます。

.parentclass {
  display: flex;
  justify-content: center;
  align-items: center; 
}

別のdiv内でdiv垂直方向に中央揃えして撮影


1

これは、インライン要素を保持するdivにcss display:inlineを追加することで実行できます。

負の値のマージンを使用して空白を削除する間、この特定の要素に空白を追加する必要があります。クラスに追加すると、このクラスが使用されている場所に影響します。

したがって、display:inlineを使用する方が安全です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.