为什么container div坚持要比IMG或SVG内容大一点?


78

我正在尝试制作另一个需要极好的HTML / CSS / Javascript练习的灯箱,但是我遇到了一个看起来很琐碎的样式问题(可能是!),但我无法解决。

我有一个div包含的img。不管我怎么努力(bordermarginpadding,自动高度等),我不能让div收缩相匹配的图像尺寸。我将问题简化为:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
        <title>Layout experiments</title>

        <style type="text/css">
            #lightbox {
                margin: 0;
                padding: 0;
                position    : fixed;
                left        : 50%;
                margin-left : -320px;
                top         : 100px;
                border-radius: 22px;
                background  : #e0e0f0;
                color       : #102020;
            }

            #lightbox img {
                border-radius: 15px;
            }
            .imagebg {
                margin      : 7px;
                background  : black;
                border-radius: 15px;
                height      : 100%;
            }

        </style>

    </head>
    <body>

        <div id="lightbox">
            <div class="imagebg">
                <img src="picture.jpg">
            </div>
        </div>
    </body>
</html>

“ picture.jpg”为640x400,但容器div希望为640x404,差异显示为图像下方的黑色条纹。div的存在是为了使图像的不透明度降低到0,然后将其交换,然后将其重新融合,从而使图像褪色为黑色。

我已经在多个浏览器中查看了计算样式,但看不到4px增量来自何处。

Answers:


160

尝试添加:

img { display: block; }

到您的CSS。由于一个<img>默认情况下是嵌入式元素,因此其高度的计算方式与默认的line-height值有关。

在嵌入式元素上,line-height CSS属性指定在计算线框高度时使用的高度。

在块级元素上,line-height指定元素内线框的最小高度。

资料来源:https : //developer.mozilla.org/en/CSS/line-height


确实可以解决问题。您能否详细说明为什么会有所不同?(我不拒绝接受-所以直到再过11分钟才让我离开)
克里斯(Chris

4
@Chris-这就是我给您的原因:img为其line-height分配了一个隐式,从而为其提供了一些垂直的呼吸空间。由于line-height仅适用于inline元素,因此将设置imgdisplay: block会删除line-height
Joseph Silber 2012年

@Joseph-提出上述要求时,我没有看到您的回应。由于他们基本上是直接和间接实现完全相同的目标,因此在答案之间没有太多选择。接受第一个到达的答案似乎很公平,但是感谢您的解释。
克里斯(Chris

1
这也适用于inline-block。感谢您的解释。
Andrew Mao



1

除了其他工作答案外,还将displayparent的属性设置flex为对我也有用:

.imagebg { display: flex }

0

基本上,您在IE上遇到此错误,尽管您没有提到,但这是事实。IE会在<img>标签下方生成一些额外的空间。因此,制作图像是一种好习惯img { display: block; }

编辑:您可以说它是IE的错误


6
我没有提到IE,因为我没有使用它。Safari,Chrome和Firefox都表现出相同的行为。Joseph和sbeliv01的答案都起作用。
克里斯(Chris

这不是IE的错误。默认情况下,所有<img>均按基线垂直对齐。(垂直对齐:基线),这意味着它们的最低点与字体的基线(例如,字母“ p”中圆圈的最低点)对齐。要更改此设置,您只需要设置其他对齐方式即可,例如,vertical-align:top; 或vertical-align:bottom;。无需将<img>转换为block元素,因为其固有的内联属性可能很有用。
CaspianRoach

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.