【问题标题】:Image inside div has extra space below the imagediv内的图像在图像下方有额外的空间
【发布时间】:2019-10-17 02:19:20
【问题描述】:

为什么在following codediv 的高度大于img 的高度?图像下方有一个间隙,但它似乎不是填充/边距。

图片下方的间隙或多余空间是什么?

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

【问题讨论】:

标签: html css image


【解决方案1】:

默认情况下,图像是内联渲染的,就像字母一样,因此它与 a、b、c 和 d 位于同一行。

在 g、j、p 和 q 等字母上找到的 descenders 在该行下方有空格。

你可以:

  • 调整图像的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>

包含的图片是公共领域的,sourced 来自维基共享资源

【讨论】:

  • 更准确地说,这发生在 b/c 内联元素占用了它们当前 line-height 的空间。将line-height 设置为所需的尺寸也将克服不需要的空白。
  • “f”是否有资格作为后代?
  • @j08691 — 取决于字体。
  • 请注意,如果您使用vertical-align: bottommiddle,如果您的图像很小(小于行高),您可能会开始看到神秘空间出现在上方 图像。 stackoverflow.com/questions/17905827/…。精简测试用例:jsbin.com/jotacipaqu/1/edit?html,css,output
【解决方案2】:

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

【讨论】:

  • 谢谢。这也解决了 Flash 电影下空间的类似问题。 (添加 display:block 以嵌入/对象标签)
  • inline-block 如果您仍然希望它像通常的图像那样显示内联。
  • @Ian @Imperative inline-block 似乎不起作用。
  • 然而,这打破了text-align:center
【解决方案3】:

快速修复:

去除图片下方的空隙,您可以:

  • 将图像的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;}
<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>

解释:为什么图片下方有空隙?

图像下方的间隙或额外空间不是错误或问题,而是默认行为。根本原因是图像被替换了元素(参见MDN replaced elements)。这使他们能够“像图像一样行事”并拥有自己的内在尺寸、纵横比....
浏览器将它们的显示属性计算为inline,但它们赋予它们一种特殊的行为,使它们更接近inline-block 元素(因为你可以垂直对齐它们,给它们一个高度,顶部/底部边距和填充,变换......) .

这也意味着:

&lt;img&gt; 没有基线,所以当图像用于内联格式时 垂直对齐的上下文:基线,图像的底部将是 放置在文本基线上。
来源:MDN,重点是我的

由于浏览器默认计算垂直对齐属性到基线,这是默认行为。下图显示了基线在文本上的位置:

(Image source)

基线对齐的元素需要为延伸到基线下方的descenders(如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>

这就是为什么&lt;img&gt; 标记的默认行为会在其容器底部创建一个间隙,以及为什么更改垂直对齐属性或显示属性会删除它,如下例所示:

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 确实如此。就像设置 line-height:0; 一样,但与更改垂直对齐或显示属性相比,我认为这不是一个好的解决方法
  • 但是请注意,有些浏览器不尊重font-size:0:他们将字体大小设置为用户设置中的最小大小。
  • 是的,它似乎是一个空白区域。
  • 好吧,我觉得图中的middletext-topsubsuper位置不对。
【解决方案4】:

也可以取消父级的行高:

#wrapper {
  line-height: 0;
}

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

【讨论】:

  • 警告!这也会杀死#wrapper 中的所有文本节点。因为它将被继承。但是那个很棒的提琴手的奖励积分!在这里它用文本节点更新。 jsfiddle.net/FaPFv/30
  • 或者,字体大小:0
  • @mfluehr 请不要将 JSFIddle 中的实质性内容复制到 Stack Overflow 以获取其他人的代码。 JSFiddle 不发布许可证,您也没有将他人代码发布到 Stack Overflow 的合法权利,Stack Overflow 根据 CC By-SA 4.0 许可其内容。
【解决方案5】:

你所要做的就是分配这个属性:

img {
    display: block;
}

图片默认有这个属性:

img {
    display: inline;
}

【讨论】:

    【解决方案6】:

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

    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-height hack,或者至少说明一下,为什么它是所有这些中最糟糕的“解决方案”:有人将文本放在图像旁边的那一刻(尤其是带有 BR 标签的预格式化多行),他们会发现自己处于比开始时更糟糕的境地。
    • 这在所有解决方案中对我帮助最大。但是,我现在将包装 div 扩展到主题图像之外,之前在 div 中显示内联块修复了该问题。 TY
    【解决方案7】:

    我使用了line-height:0,它对我来说很好用。

    【讨论】:

    • 对不起,-1:这搞砸了文本定位,所以如果有人还在图像旁边放了一些(尤其是多行,比如&lt;BR&gt;)文本,他们就会定位错误,重叠/悬垂的混乱。
    【解决方案8】:

    我发现使用 display:block; 效果很好。在图像上和垂直对齐:顶部;在文字上。

    .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

    【讨论】:

      【解决方案9】:

      您也可以为容器设置overflow: hidden;,并将图像高度增加到> 100%。 height: 100%;

      【讨论】:

        【解决方案10】:

        我刚刚在 div 中添加了float:left,它起作用了

        【讨论】:

        • 这是因为设置float:left会导致display:block
        猜你喜欢
        相关资源
        最近更新 更多