块容器框(block container box)的定义究竟是什么?

根据W3C标准,除了table box和可替换元素,一个块级框(block-level box)就是一个块容器框(block container box)。
按理说到这里就形成一个定义了,但是它还有下句:
块容器框只包含块级元素或建立IFC只包含行内级元素。
…………倒是把论调统一起来呀,前面不还说除了xx和xx,块级框就都是块容器框吗?块级框就是块级元素生成的框,和里面装的是什么并没有关系吧?
那么到底是什么定义了块容器框?是这个框本身的display,还是这个框里装了些什么东西?

因为position为static或relative的元素的包含块的定义又是“离元素最近的祖先块容器框”,所以还牵扯着包含块的定义,实在想要弄清楚,望不吝赐教,感激感激!><!

标准:https://www.w3.org/TR/2011/RE...

阅读 5.8k
1 个回答

finally i figure it out by myself...为什么会用英文?因为为了解决问题英语看多了,脱口而出…………

首先,是这样的,块容器框的定义的确只有最开始的那句,除了table boxes和可替换元素的块级框,以及某些非块级框,如display: inline-block、table cells等。

至于下面的半句,块容器框只包含块级元素或建立IFC只包含行内级元素。这句话其实是块容器框的特性,而不是定义。

当然,这个结果我曾经也考虑过,曾(错误地)否决的原因是,我认为块容器框中是可以同时放块级元素和行内级元素的,为什么会有只存在块级元素和行内级元素的特性?如今也理解了,原因是匿名框。如果块容器框中同时包含了块级元素和行内级元素,则会生成匿名块级框包含行内级元素,那么块容器框中自然只包含块级元素了。

同时我也疑惑过另一种情况,既然块容器框可以只包含块级元素或行内级元素,那么在同时有块级元素和行内级元素时,是生成块级匿名框只包含块级元素,还是生成行内级匿名框只包含行内级元素呢?这个其实通过常识也可以判断,但是比起常识还是相信标准,W3C这句大概可以解答:if a block container box (such as that generated for the DIV above) has a block-level box inside it (such as the P above), then we force it to have only block-level boxes inside it.

也就是说,实际是以块级元素优先,以匿名块级框包裹行内级元素。而匿名行内级框实际上只在什么时候会出现呢?就是只有没有被行内框包裹的纯文本才会由父元素(or最近的祖先块容器框?存疑!存疑!存疑!)生成匿名行内级框。

关于匿名框,详见:https://www.w3.org/TR/2011/RE...

块容器框特性的这句话也包含了另一个我关于IFC触发条件的疑惑。为什么这句话没有说“块容器框建立BFC只包含块级元素”,而直说“建立IFC只包含行内级元素”,是因为只要有行内级元素,就(可能由匿名框)建立了IFC。只包含行内级元素自然建立了一个IFC。而BFC的建立具有特定条件,只包含块级元素是不会触发的。

最后,最大的感想,segmentfault的资源太少了,各种站上翻译过来的文档也更加难以理解,W3C万岁,stackoverflow赛高,学好英语真的太重要了……

最后,还有一些没有明确的定义,比如BFC是否也只能包含块级元素?(所以才会有BFC中的元素一个一个竖直排列且元素左边和包含块左边接触)如果是,是否也像块容器框的特性一样,实际上是生成了匿名框?

块容器框的定义明确了,BFC的定义仍旧模糊不清。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏