根据W3C标准,除了table box和可替换元素,一个块级框(block-level box)就是一个块容器框(block container box)。
按理说到这里就形成一个定义了,但是它还有下句:
块容器框只包含块级元素或建立IFC只包含行内级元素。
…………倒是把论调统一起来呀,前面不还说除了xx和xx,块级框就都是块容器框吗?块级框就是块级元素生成的框,和里面装的是什么并没有关系吧?
那么到底是什么定义了块容器框?是这个框本身的display,还是这个框里装了些什么东西?
因为position为static或relative的元素的包含块的定义又是“离元素最近的祖先块容器框”,所以还牵扯着包含块的定义,实在想要弄清楚,望不吝赐教,感激感激!><!
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的定义仍旧模糊不清。