div中的图像在图像下方有多余的空间


502

为什么在以下代码中,的高度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/a/31445364/3597276
Michael Benjamin

1
这里是有关此问题的好书:HTML中的奇怪<img>缺口
Matheus Avellar

Answers:


600

默认情况下,图像以字母形式内联呈现,因此它位于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内联元素占据其current的空间的情况下line-height。设置line-height为所需的尺寸还可以克服不希望的空白。
凯文·布歇

3
“ f”是否可以作为后代?
j08691 '16

2
@ j08691 —取决于字体。
昆汀

134

这里建议的另一个选项是将图像的样式设置为style="display: block;"


4
谢谢。这也解决了Flash电影下空间的类似问题。(添加显示:阻止嵌入/对象标签)
jessieloo 2012年

5
或者,inline-block如果您仍然希望它像通常的图像一样内嵌显示。
伊恩

6
@Ian @Imperative inline-block似乎不起作用。
p.matsinopoulos

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:他们在用户设置中将字体大小设置为最小大小。
李斯特先生,

是的,它似乎是空白。
mrbengi '18

好吧,我认为middle text-top sub super图片中的位置不正确。
xianshenglu



7

您可以使用多种方法来解决此问题,例如

  1. 使用 line-height

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

    #wrapper {  display: flex;         }
    #wrapper {  display: inline-flex;  }
  3. 使用display: blocktableflexinherit

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

请不要推荐非常草率的line-heighthack,或者至少要弄清楚为什么这是所有这些中最糟糕的“解决方案”:当有人在图像旁边放置文本时(尤其是预先格式化的带有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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.