javascript - 使用 HTML5 文档类型时容器中的额外顶部填充

标签 javascript css html

在下面的 div 中有额外的顶部填充:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Extra Top Padding</title>
    <style>
        div {
            background: tan;
        }
        div * {
            vertical-align: middle;
        }
        span {
            font-size: 16px;
        }
    </style>
</head>

<body>
    <div id="container">
        <img src="https://ssl.gstatic.com/images/icons/gplus-16.png"><span>Some text</span>
    </div>
    <p id="indicator"></p>
    <script>
        document.getElementById('indicator').textContent = document.getElementById('container').clientHeight;
    </script>
</body>

</html>


<强> DEMO

如果您使用 HTML 4.01 Transitional 文档类型,它会正确显示:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


这是 HTML5 中的错误吗?

最佳答案

tl;博士

这不是错误。这是因为您的文档几乎使用了标准模式或标准模式。而且它不是填充,它是行高空间。


就我个人而言,我不会对上述解释感到满意。但是要完全解释需要大量的细节。所以这里是:

计算是针对 Times New Roman 字体的。尽管原则保持不变,但其他字体可能会给出不同的值。

无论有没有 img 元素,高度差都是一样的,所以让我们放弃它。

当您使用 HTML5 文档类型(或 HTML 4.01 严格文档类型)时,您将获得标准模式。当您使用 HTML 4.01 Transitional 文档类型时,您将获得几乎标准模式。两种模式的区别主要在于哪些行内框会影响行高。特别是 strut在几乎标准模式下没有效果。

所以在Almost Standards 模式 中,唯一的行内框是文本。 div 的总高度就是该文本的行高。即 16px * 1.25(div 的行高设置)= 20px

标准模式更复杂。现在我们有了文本和支柱。支柱与基线对齐。默认行高 1.25 为我们提供了 2px 上半部行距 + 13px ascender 高于基线和 3px descender + 2px 下半部行距。总计 20px。

文本垂直对齐:居中。 CSS 2.1 规范说

Align the vertical midpoint of the box with the baseline of the parent box plus half the x-height of the parent.

父框的基线是我们从上面知道的 strut 的基线是底部上方 5px(在添加文本之前)。

字体大小为 16px 的字体的 x 高度约为 7px。将其减半并 chop 为整数得到 3px。将它添加到 5px,我们得到底部上方 8px 文本的对齐线。

框的垂直中点在对齐线上方 10px 和对齐线下方 10px。

行高必须足够大以包含其所有行内框,这意味着它必须是对齐线上方框的最大值 + 对齐线下方框的最大值。这是线上方的 max(12px[strut], 10px[text]) 和线下方的 max(8px[strut], 10px[text]) 。

等于 (12px + 10px) 或 22px

关于javascript - 使用 HTML5 文档类型时容器中的额外顶部填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22616556/

相关文章:

javascript - Matter.js 物理引擎的结果总是不同

css - 元素高度/宽度缩放问题

ios - SVG 填充图像源的回退

javascript - 根据 JavaScript 函数的值在 HTML 中编写一些内容

javascript - 单击行后,从其他行中删除选定的类

javascript - 不引人注目的 knockout 模板问题

javascript - .load() 等 Ajax 函数从 HTML 中去除注释。我怎样才能保留评论?

javascript - AngularJS:当前指令实现直接使用变量中的模板,我有机会在这里使用 templateUrl 吗?

html - 为什么 flex 元素不缩小过去的内容大小?

javascript 在 window.open (""之后不执行)