在CSS中,Block Formatting Context(BFC)是一个独立的渲染区域,它决定了其子元素如何布局,以及与其他元素的关系和相互作用。overflow: hidden
和float
都可以创建BFC。
overflow: hidden 创建的BFC
当使用overflow: hidden
创建BFC时,该BFC会尽可能地扩展其高度以包含其内部的所有内容,即使这意味着它需要延伸到其包含块的外部。因此,当图片右侧没有足够的空间时,BFC会选择在图片的右侧延申高度来放下文字。这是因为overflow: hidden
的BFC会考虑其所有内容,包括那些超出了其包含块边界的内容。
Float创建的BFC
相比之下,当使用float
创建BFC时,该BFC的高度只会被其内部的块级元素所影响。如果BFC内部只有行内元素(如文本),那么BFC的高度将只会被这些行内元素所影响,而不会延申到其包含块的外部。因此,当文本不足以填满图片的右侧空间时,文本会直接跳到下一行显示,而不是在图片的右侧延申高度。
区别的原因
这两种BFC的区别主要是因为它们对内部内容的高度计算方式不同。overflow: hidden
的BFC会考虑其所有内容的高度,而float
的BFC则只会考虑其内部的块级元素的高度。这种差异导致了它们在处理内部内容布局时的不同行为。
在现代的CSS布局中,确实浮动(float)的使用已经相对较少,更多的是使用Flexbox和Grid等更现代、更灵活的布局方式。然而,理解浮动和BFC的概念对于理解CSS布局仍然非常重要,因为它们在一些特定的布局场景中仍然非常有用。
overflow创建的BFC和float创建的BFC它们都是BFC应该没有区别。故这里的行为不同跟是怎么产生的BFC是没有关系的。
这应该和
block width
的计算(width:auto
orwidth: fit-content
)、float
元素流出normal flow
以及float
与之后的bfc
不会发生重叠有关。行为1:
float
元素是流出normal flow
,故后来的在normal flow
中元素应该会视它不存在。float
相邻的bfc不会和该float
元素的margin-box
有重叠(设置上面图片的margin-right: 10px
的话,图片的右侧和右侧的bfc之间会有空隙。)。既要视该
float
元素不存在又不和它重叠,该bfc会变窄,变窄到占据该行剩余的宽度。前提应该是
width
为auto
的时候。'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block
,这里的width of containing block
的值应该会自动变小,其他不设置都为0,进而width
最终的计算值会变小。(如何你设置padding的话,会发现文字空间会被挤得更窄)overflow:hiddden
溢出的部分被隐藏了。如果我们显示设置了
width
的值话,是不会自动调节它的大小的。如果设置width
为200px
,此时剩余空间不足,当前行溢出?or移到下一行?相关文档规定:
css2 9.4.1 block formatting context
css2 bfc-next-to-float
行为2:
相关官方规定:
css2 blockwidth Floating, no-replaced elements