div内的图像在图像下方有额外的空间

Mis*_*hko 470 html css image

为什么在下面的代码中高度div大于img?图像下方有一个间隙,但它似乎不是填充/边距.

图像下方的间隙或额外空间是多少?

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

图像下面有间隙或空白区域

Que*_*tin 555

默认情况下,图像以内嵌方式呈现,就像字母一样.

它位于a,b,c和d所在的同一条线上.

在f,j,p和q等字母上找到的下降线下方有一个空格.

您可以调整vertical-align图像以将其放置在其他位置(例如middle)或更改它display以使其不是内联的.

  • 感谢您解释其背后的基本原理.经过一些实验,我意识到将图像转换为块元素会修复我自己的小间距问题,但我不明白为什么......这完全解释了它.谢谢! (33认同)
  • 更确切地说,这种情况发生在b/c内联元素占用其当前"行高"的空间.将"line-height"设置为所需的尺寸也可以克服不需要的空白. (8认同)
  • @MeV - 不会.如果你在图像下面有一个间隙,你在旁边也有垂直对齐和间隙...那么你有两个不同的问题,而你仍然拥有的问题不是这个问题中描述的问题. (4认同)
  • "f"是否有资格成为下降者? (3认同)
  • @j08691 — 取决于字体。 (3认同)
  • @MeV - 那是[一个完全不同且无关的问题.](http://stackoverflow.com/questions/ask) (3认同)
  • 请注意,如果您使用“vertical-align:bottom”或“middle”,如果您的图像很小(小于行高),您可能会开始看到神秘空间出现在图像*上方*。/sf/ask/1253407921/#answer-17905828:~:text=if%20your%20image%20is%20small%20(较小,空格% 20appearing%20above%20the%20image%20代替。减少测试用例:https://jsbin.com/jotacipaqu/1/edit?html,css,output (2认同)

The*_*hea 130

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

  • @Ian @Imperative`inline-block`似乎不起作用. (5认同)
  • 谢谢.这也解决了flash电影下的空间类似问题.(添加显示:块到嵌入/对象标签) (4认同)
  • 或者`inline-block`如果你仍然希望它像图像通常那样显示内联. (4认同)

web*_*iki 90

快速解决:

消除图像下的间隙,您可以:

  • 将图像的vertical-align属性设置为vertical-align: bottom; vertical-align: top;vertical-align: middle;
  • 将图像的显示属性设置为 display:block;

请参阅以下代码以获取实时演示:

#vAlign img {
  vertical-align :bottom;
}
#block img{
  display:block;
}

div {border: 1px solid red;width:100px;}
img {width:100px;}
Run Code Online (Sandbox Code Playgroud)
<p>No fix:</p>
<div><img src="http://i.imgur.com/RECDV24.jpg" /></div>

<p>With vertical-align:bottom; on image:</p>
<div id="vAlign"><img src="http://i.imgur.com/RECDV24.jpg" /></div>

<p>With display:block; on image:</p>
<div id="block"><img src="http://i.imgur.com/RECDV24.jpg" /></div>
Run Code Online (Sandbox Code Playgroud)


说明:为什么图像下面有空隙?

图像下的间隙或额外空间不是错误或问题,它是默认行为.根本原因是图像是替换元素(参见MDNW3C).这允许它们"像图像一样"并具有自己的内在尺寸,宽高比....
浏览器计算它们的显示属性inline但是它们给它们一个特殊的行为,使它们更接近inline-block元素(因为你可以垂直对齐它们,给它们的高度,顶部/底部边距和填充,转换......).

这也意味着:

[...]当图像用于具有vertical-align:baseline的内联格式化上下文时,图像的底部将在容器的基线上显示.(来源:MDN,强调我的)

由于浏览器默认将vertical-align属性计算为基线,因此这是默认行为.下图显示了基线在文本上的位置:

文本基线的位置

基线对齐的元素需要为延伸到基线以下的下降器保留空间(如j, p, g ...),如上图所示.在此配置中,图像的底部在基线上对齐,如此示例中所示:

div{border:1px solid red;}
img{width:100px;height:auto;}
Run Code Online (Sandbox Code Playgroud)
<div>
  <img src="http://i.imgur.com/RECDV24.jpg" />jpq are letters with descender
</div>
Run Code Online (Sandbox Code Playgroud)


这就是为什么<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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • @Persijn确实如此.就像设置`line-height:0;`但我不认为这是一个很好的解决方法,与更改垂直对齐或显示属性相比 (2认同)
  • 但请注意,某些浏览器不遵循`font-size:0`:它们将字体大小设置为用户设置中的最小大小. (2认同)

Pav*_*vlo 38

也可以使父母的行高无效:

#wrapper {
  line-height: 0;
}
Run Code Online (Sandbox Code Playgroud)

所有修复:http://jsfiddle.net/FaPFv/

  • 警告!这也会杀掉#wrapper中的任何文本节点.因为它将被继承.但是这个令人敬畏的小提琴手的奖励积分!这里用文本节点更新.http://jsfiddle.net/FaPFv/30/ (5认同)

小智 11

您所要做的就是分配此属性:

img {
    display: block;
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,图像具有以下属性:

img {
    display: inline;
}
Run Code Online (Sandbox Code Playgroud)


San*_*lse 7

你可以使用几种方法解决这个问题

  1. 运用 line-height

    #wrapper {  line-height: 0px;  }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运用 display: flex

    #wrapper {  display: flex;         }
    #wrapper {  display: inline-flex;  }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用display: block,table,flexinherit

    #wrapper img {  display: block;    }
    #wrapper img {  display: table;    }
    #wrapper img {  display: flex;     }
    #wrapper img {  display: inherit;  }
    
    Run Code Online (Sandbox Code Playgroud)

  • 请不要推荐非常草率的“line-height”黑客,或者至少说清楚,为什么它是所有解决方案中最糟糕的“解决方案”:当有人将文本放在图像旁边时(特别是预先格式化的多行BR 标签),他们会发现自己的处境比开始时更糟糕。 (2认同)

小智 5

我用过line-height:0,对我来说很好用。