CSS:什么时候删除空的匿名块框?

时间:2014-10-30 08:05:43

标签: html css whitespace

根据CSS Specification匿名框,当块容器框同时包含内联和块内容时,会创建框。

规范使用的示例是

<DIV>
Some text
<P>More text</P>
</DIV>

Chrome将其渲染为: Some text More text

然而,鉴于:

<DIV>
[5 spaces followed by newline]
<P>Some text</P>
</DIV>

Chrome将其渲染为: Some text

换句话说,包含空格的行被删除了。

我对创建匿名块框的顺序以及CSS white-space specification的应用顺序感到困惑。

a)如果我们假设首先创建匿名块框,我们有

<DIV>
<anonymous_block>[5 spaces followed by newline]</anonymous_block>
<P>Some text</P>
</DIV>

b)然后,在匿名块的布局过程中,我们发现白色空间模型首先将整个内容减少到单个空间。创建包含此空间的单行。

c)此规则导致空间被消除: &#34;如果一行末尾的空格(U + 0020)有白色空格&#39;设置为&#39; normal&#39;,&#39; nowrap&#39;或&#39; pre-line&#39;,它也会被删除。&#34;

d)此时我们有一个零宽度线,但它的高度(如果我理解正确的css模型)是字体。

因此,我希望文字前面会出现一个字体高度为空的行。

由于情况并非如此,上述哪一步不正确?请具体说明CSS规范如何导致观察到的行为。

2 个答案:

答案 0 :(得分:1)

block上下文中,空格被忽略。

inlineinline-block上下文中,空格被修剪为单个空格。

因此,您的5个空格字符和换行符不会触发创建匿名块,因为<p>在块上下文中设置<div>的内部

关于你的问题。我认为步骤a)是不正确的。这些步骤似乎以不同的顺序被调用,并由此改变了解释。

答案 1 :(得分:1)

我认为答案是在CSS2规范的this部分中,其中包含:

“根据需要创建行框以在内联格式化上下文中保存内联级别内容。不包含文本,没有保留空格的行框,没有带有非零边距的内嵌元素,填充或边框,并且没有其他流入内容(如图像,内联块或内联表),并且不以保留换行结束必须被视为零高度线框,以确定其中任何元素的位置,并且必须被视为不存在于任何其他目的。“

以上段落解释了观察到的行为。 [在collapsing margins上还有另一部分规范,它引用了上一段。我之所以提到这一点,是因为读到这个答案的读者可能会发现它很有用。]