CSS块格式设置上下文如何工作?


80

CSS块格式设置上下文如何工作?

CSS2.1规范说,在块格式设置上下文中,框是从顶部开始垂直放置的。即使块中有浮动元素,也会发生这种情况,除非块框建立了新的块格式化上下文。众所周知,当浏览器在块格式上下文中呈现块框时,会省略float元素,为什么建立新的块格式上下文有效?

框(块框和嵌入式框)在正常流程中如何布置?

我在某处读到了块元素会生成块框的情况,但是当用户代理绘制框时,浮动元素将被忽略,并在填充内容时将其考虑在内。尽管浮动元素将与框的其他元素重叠,但解决方案是使用来为重叠元素建立新的块格式设置上下文overflow:hidden

“新的块格式设置上下文仍然是块格式设置”,因此在绘制框时,它还将浮动元素当作没有退出一样。是这样吗?还是我误解了“新块格式设置上下文”?

更新:更多问题

通过说“这种行为对列式样式布局很有用。但是,它的主要用途是停止浮动,例如在“主要内容” div中,实际上清除浮动的侧栏,即在源代码中较早出现的浮动。”

我不明白其中的含义,我将提供一个示例,也许您会理解我。

我以为浮动框应该浮动到containg块的顶部-带class的div content。此外,如果浮动框出现在标记的前面,那么它将显示我认为应该的样子。

我们如何解释呢?我们可以使用“块格式设置上下文和内联格式设置上下文”进行解释吗?


您可以添加一张图像来记录您不了解的内容吗?
MRK

我知道您没有明确询问浮点数,但是我认为本文确实可以很好地解释网页流的工作原理,并且可以帮助您理解浮点数。
Niklas Wulff

Answers:


126

块格式化上下文

浮点数,绝对定位的元素,不是块框的块容器(例如内联块,表格单元格和表标题),以及具有“可见”以外的“溢出”的块框(除非传播了该值)到视口)为其内容建立新的块格式上下文

以我的大胆,重要的是建立

这意味着您使用的元素overflow(除可见之外的任何元素)floatinline-block..etc会负责其子元素的布局。然后是“包含”的子元素,无论是浮点数还是折叠边距,它们都应完全由其父元素包含。

在块格式设置上下文中,每个框的左外边缘与包含块的左边缘接触(对于从右到左的格式,右边缘接触)

上一行的含义是:

因为一个盒子只能是矩形的,而不能是不规则形状的,这意味着两个浮子(甚至旁边)之间的新的块格式化上下文不会环绕相邻的侧面浮子。内部的子框只能延伸到其父母的左边缘(或RTL中的右边缘)。对于列式样式布局,此行为很有用。但是,它的主要用途是停止浮动,例如在“主要内容” div中,实际上清除浮动的侧栏,即在源代码中较早出现的浮动。


浮动间隙

在正常情况下,浮点数应该清除所有先前的浮点元素,而这些浮点元素先前已浮在整个源代码中,而不仅仅是您显示的“列”。

此属性指示元素框的哪些边可能不与较早的浮动框相邻。'clear'属性不考虑元素本身内部或其他块格式上下文中的浮点数

假设您有一个三列布局,左列和右列分别在左右浮动,侧列现在处于新的块格式设置上下文中,因为它们是浮动的(请记住,float也是建立新BFC的属性之一) ),这样您就可以愉快地对其中的列表元素进行浮动,并且它们仅清除已经在侧列内部的浮动,而不再关心源代码中以前的浮动


要使主要内容成为新的块格式上下文?

现在,在中间的列中,您可以从两侧简单地对其进行边距处理,以便它看起来整齐地位于两侧的浮动列之间,并采用剩余的宽度,这是在中心列为“流体”时获得所需宽度的一种常用方法-很好,直到您需要在内容div中使用浮动/清除(对于使用“ clearfix”黑客或模板(包括它们)的用户而言,这种情况很常见

采取以下非常简单的代码:

它产生以下内容:

在此处输入图片说明

通常,这很好,特别是如果您没有背景色或内部(在主要内容中)浮动元素时,请注意-浮动元素很好(尚未清除),它们可能正在执行您的操作,除了它们,它们H3p内容div(浅灰色背景)中实际上并没有真正包含margin和的下边距。

因此,在上述代码的相同简单保证方案中添加:

.clear-r {clear: right;}

到CSS,然后将第二个HTML浮动框更改为:

<div class="floated clear-r"> this a floated cleared box</div>

这次您得到:

在此处输入图片说明

第二个浮点清除了右侧,但清除了右列的整个高度。右列在源代码中更早地浮动,因此请按照提示进行清除!不过,可能不是理想的效果,还要注意h3p边距仍然折叠(不包含)。


为了孩子们,使其建立一个块格式化上下文!

最后使主要内容列负责-成为其内容的块格式设置上下文margin: 0 200px;从主要内容CSS和ADD中 删除overflow: hidden;,您将得到:

在此处输入图片说明

这可能更像您希望发生的情况,请注意,现在包含了浮点数,它们正确地忽略了右侧列而被清除,并且还包含了h3p边距而不是合拢。

如今,随着重置的广泛使用,边距变得不那么引人注目了(IE仍然无法使它们变得正确),但是中心“主要内容”发生的事情是它变成了块格式上下文,现在对其负责自己的子代(后代)元素。它实际上非常类似于微软的初期概念hasLayout的,它采用了相同的属性display: inline-blockfloatoverflow什么比看到其他的,当然表格单元格总是有布局..这是但没有错误;)

希望能有所帮助,任何问题都可以提出!


更新:有关更多信息:

当您说“但是当用户代理绘制框时,浮动元素将被忽略,并在填写内容时将其考虑在内”。

是的,浮标通常会覆盖其容器框,这是关于父边界的意思吗?当绘制一个块元素并包含一个浮点数时,块父对象本身将被绘制为一个矩形,在浮点下,而其他子元素的“内联匿名框”或简称为“线框”被缩短以腾出空间浮动

采取以下代码:

产生此结果:

浮子如何工作

您会看到父元素实际上并不包含浮点数,因为它没有完全将其包裹起来。.浮点数只是在内容之上浮动-如果您要继续向div添加内容,则最终会包裹在浮点数下方,因为不再需要该p元素的(匿名)“线框”来缩短自身。

我为段落元素上了颜色,因此您可以看到它实际上也位于浮动元素下方,深灰色背景是段落开始的位置,白色文本是“匿名行框”开始的位置-实际上只有它们“腾出空间除非另有说明(即,您更改上下文),否则

再次参考上图,如果要在p元素的左边距留白,是的,它将停止浮点数底部的文本换行,因为“行框”(白色文本)仅会触及元素的左边缘。它们的容器,然后将的彩色背景p移到右侧(没有浮点),但是您不会更改p格式上下文的行为。就像上面第一张图片中的中心列;)


clairesuzy,非常感谢!它确实对我有很大帮助。但是我仍然有一些问题。我已将其添加到原始问题中。希望您能为我提供帮助。
艾琳·陶

1
@eileen发生了两件事-我认为您的额外问题由第一个示例解释..内容后出现紫色浮动框,因为那是它们在源中的位置,浮动不浮动到顶部,位于上一个之上内容(因为它的顶部边距不能高于应该的位置)-左列和右列也是浮动框,它们位于源中的较早位置,并且如果您尝试清除它们的紫色浮动,则中间列不会成为新的BFC还将清除源端浮动列中的较早..这有帮助吗?
clairesuzy

1
@eileen的链接描述的是块级元素和内联级元素,而仅仅是基础知识,而不是格式化上下文。块元素将始终采用100%的宽度并彼此重叠(默认情况下)-内联元素并排放置,如链接,跨度等。甚至不采用宽度或高度,因此它们没有选择。浮动元素会自动变为块级元素,因此,如果浮动内联级别,<span>它将变得像块级<div>
clairesuzy 2011年

1
继续。p背景之所以位于float之下,是因为从流中删除了float元素,因为在相邻元素中实际上不知道它们在那里,并且因为它们属于相同的格式上下文,因此p外观它是尺寸的父容器。(这就是为什么您不能将100%宽的东西放在浮子旁边-因为100%是容器的100%。只有匿名框最终才知道浮子在那; )
clairesuzy 2011年

1
@clairesuzy-您发布的图片已发布,您可以重新发布吗?
bfavaretto 2011年
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.