div内の画像には、画像の下に余分なスペースがあります


503

次のコードでの高さがの高さdivよりも大きいのはなぜimgですか?画像の下にギャップがありますが、パディング/マージンではないようです。

画像の下のギャップまたは余分なスペースは何ですか?

#wrapper {
  border: 1px solid red;
  width:200px;
}
img {
  width:200px;
}
<div id="wrapper">
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>

その下にギャップまたは空白がある画像


10
この質問に対する短い完全な回答を次に示します。stackoverflow.com
Michael Benjamin

1
これがこの問題に関する良い読み物です:The Strange <img> Gap In HTML
Matheus Avellar '29

回答:


601

デフォルトでは、画像は文字のようにインラインでレンダリングされるため、a、b、c、dと同じ線上に配置されます。

その行の下には、g、j、p、qなどの文字で見つかるディセンダー用のスペースがあります。

降下者のデモ

あなたはできる:

  • 調整vertical-align別の場所に配置する画像の(例えばmiddleまたは
  • displayインラインではないように変更してください。

div {
  border: solid black 1px;
  margin-bottom: 10px;
}

#align-middle img {
  vertical-align: middle;
}

#align-base img {
  vertical-align: bottom;
}

#display img {
  display: block;
}
<div id="default">
<h1>Default</h1>
  The quick brown fox jumps over the lazy dog <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/VangoghStarry-night2.jpg/300px-VangoghStarry-night2.jpg" alt="">
</div>

<div id="align-middle">
<h1>vertical-align: middle</h1>
  The quick brown fox jumps over the lazy dog <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/VangoghStarry-night2.jpg/300px-VangoghStarry-night2.jpg" alt=""> </div>
  
  <div id="align-base">
<h1>vertical-align: bottom</h1>
  The quick brown fox jumps over the lazy dog <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/VangoghStarry-night2.jpg/300px-VangoghStarry-night2.jpg" alt=""> </div>

<div id="display">
<h1>display: block</h1>
  The quick brown fox jumps over the lazy dog <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/VangoghStarry-night2.jpg/300px-VangoghStarry-night2.jpg" alt="">
</div>


含まれている画像はパブリックドメインであり、Wikimedia Commonsから提供れています


9
より正確に言うと、これはb / cインライン要素が現在の領域を占有することで発生しline-heightます。line-height目的の寸法に設定すると、不要な空白も解消されます。
ケビンブーシェ

3
「f」はディセンダーの資格がありますか?
j08691 2016

2
@ j08691 —フォントによって異なります。
クエンティン

134

ここで提案されている別のオプションは、画像のスタイルを次のように設定することですstyle="display: block;"


4
ありがとう。これにより、Flashムービーの下のスペースに関する同様の問題も修正されました。(display:block to embed / objectタグを追加)
jessieloo

5
またはinline-block、画像を通常どおりにインラインで表示したい場合。
2014

6
@Ian @Imperative inline-blockが機能していないようです。
p.matsinopoulos 2015年

93

クイックフィックス:

画像の下の隙間なくすには、次の方法があります。

  • 画像の垂直配置プロパティをvertical-align: bottom; vertical-align: top;またはに設定しますvertical-align: middle;
  • 画像の表示プロパティを display:block;

ライブデモについては、次のコードを参照してください。


説明:なぜ画像の下にギャップがあるのですか?

画像の下の隙間や余分なスペースはバグや問題ではなく、デフォルトの動作です。根本的な原因は、画像が置換された要素であることです(MDN置換された要素を参照)。これにより、「イメージのように動作」し、独自の固有の寸法、アスペクト比を
持つことinlineができます。ブラウザは表示プロパティを計算しますが、ブラウザに近づける特別な動作を提供しますinline-block要素にます(垂直方向に整列できるため、それらの高さ、上部/下部のマージンとパディング、変換...)。

これは、次のことも意味します。

<img>にはベースラインがないため、画像がvertical-align:ベースラインのインラインフォーマットコンテキストで使用されると、画像の下部がテキストベースラインに配置されます。
出典:MDN、強調鉱山

ブラウザはデフォルトでvertical-alignプロパティをベースラインに計算するため、これがデフォルトの動作です。次の画像は、ベースラインがテキストのどこにあるかを示しています。

テキストのベースラインの場所 画像ソース

上の画像でわかるように、ベースラインに揃えられた要素は、ベースラインの下に伸びるディセンダー(のようにj, p, g ...)のためのスペースを保つ必要があります。この構成で、次の例でわかるように、画像の下部がベースラインに揃っています。

div{border:1px solid red;font-size:30px;}
img{width:100px;height:auto;}
<div>
  <img src="http://i.imgur.com/RECDV24.jpg" />jpq are letters with descender
</div>


これが<img>、次のデモのように、タグのデフォルトの動作がコンテナの下部にギャップを作成し、vertical-alignプロパティまたはdisplayプロパティを変更するとタグが削除される理由です。

div {width: 100px;border: 1px solid red;}
img {width: 100px;height: auto;}

.block img{
  display:block;
}
.bottom img{
  vertical-align:bottom;
}
<p>Default:</p>
<div>
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>
<p>With display:block;</p>
<div class="block">
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>
<p>With vertical-align:bottom;</p>
<div class="bottom">
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>


そのため、font-sizeを0に設定しても機能しません。それともしますか?
Persijn

2
@Persijnします。設定と同様ですline-height:0;が、垂直方向の配置や表示のプロパティを変更する場合と比較して、これを適切な回避策とは考えていません
web-tiki

2
ただし、一部のブラウザはこれを尊重しないことに注意してくださいfont-size:0。ユーザー設定でフォントサイズを最小サイズに設定しています。
Mr Lister

はい、それは空白のようです。
mrbengi 2018年

ええと、私middle text-top sub superは写真の位置が正しくないと思います。
xianshenglu

40

親の行の高さを無効にすることもできます。

#wrapper {
  line-height: 0;
}

すべての修正:http : //jsfiddle.net/FaPFv/


5
警告!これにより、#wrapper内のテキストノードも強制終了されます。継承されます。しかし、その素晴らしいフィドラーのボーナスポイント!ここでは、テキストノードで更新されます。jsfiddle.net/FaPFv/30
gcb

または、font-size:0
キラン

13

次のプロパティを割り当てるだけです。

img {
    display: block;
}

画像にはデフォルトで次のプロパティがあります。

img {
    display: inline;
}

7

あなたはこの問題のためにいくつかの方法を使うことができます

  1. 使用する line-height

    #wrapper {  line-height: 0px;  }
  2. 使用する display: flex

    #wrapper {  display: flex;         }
    #wrapper {  display: inline-flex;  }
  3. 使用してdisplay: blocktableflexおよびinherit

    #wrapper img {  display: block;    }
    #wrapper img {  display: table;    }
    #wrapper img {  display: flex;     }
    #wrapper img {  display: inherit;  }

非常にずさんなline-heightハックはお勧めしません、または少なくともそれをすべての中で最悪の「解決策」にする理由を明確にしないでください。誰かが画像の横にテキストを配置した瞬間(特にBRタグ付きの事前フォーマット済みの複数行)、それらは当初よりも悪い状況に置かれるでしょう。
Sz。

5

使用してみましたがline-height:0、問題なく動作しました。


申し訳ありませんが、-1:テキストの配置を<BR>めちゃくちゃにするので、誰かがいくつかの(特に複数行、たとえば)テキストを画像の横に配置すると、位置がずれたり、オーバーラップしたり、オーバーハングしたりします。
Sz。

3

display:blockを使用するとうまく機能することがわかりました。画像上とvertical-align:top; テキスト上。

.imagebox {
    width:200px;
    float:left;
    height:88px;
    position:relative;
    background-color: #999;
}
.container {
    width:600px;
    height:176px;
    background-color: #666;
    position:relative;
    overflow:hidden;
}
.text {
    color: #000;
    font-size: 11px;
    font-family: robotomeduim, sans-serif;
    vertical-align:top;
    
}

.imagebox img{ display:block;}
<div class="container">
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
</div>

またはJS FIDDLEのコードを編集できます


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