BFC(block formatting context
),中文叫做“块级格式化上下文”,它是一个独立的渲染区域,内部的块级元素按照一定的规则进行布局,不会影响到外部区域。
如果一个元素具有BFC,内部子元素无论怎么布局,都不会影响外部的元素。所以,BFC元素是不可能发生margin
重叠的,因为margin
重叠是会影响外面的元素的。
BFC元素也可以用来清除浮动的影响,因为如果不清除,子元素浮动则父元素高度塌陷,必然会影响后面元素布局和定位,这显然有违BFC元素的子元素不会影响外部元素的设定。
那什么时候会触发BFC呢?常见的情况如下:
<html>
根元素float
的值不为none
overflow
的值为auto
、scroll
或hidden
display
的值为table-cell
、table-caption
、inline-block
、flex
、grid
position
的值不为relative
和static
BFC的结界特性最重要的用途是实现更健壮、更智能的自适应布局。
比如说下面这个例子:
<div class="father">
<img src="https://img0.baidu.com/it/u=3178506048,1409511029&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500"/>
<p class="son">今天天气真好,今天天气真好,今天天气真好,今天天气真好,今天天气真好今天天气真好今天天气真好</p>
</div>
img {
float: left;
width: 100px;
}
上面这段代码的效果图如下所示,此时.son
的内容收到了float
属性值的影响,从而呈现出了环绕图片的效果。
如果此时我们为.son
的元素设置具有BFC特性的属性,比如overflow: hidden
,根据BFC的表现原则,子元素不会受外部元素影响,也不会影响外部元素,,于是这里的.son
元素为了不与浮动元素产生交集,会顺着浮动边缘形成自己的封闭上下文,如下所示:
.son {
overflow: hidden;
}
这就说明,普通流体元素在设置了overflow: hidden
后,会自动填满容器中除了浮动元素之外的剩余空间,形成自适应布局的效果。
理论上,任何BFC元素和float
元素相遇的时候,都可以实现自动填充的自适应布局。但是,由于绝大多数的触发BFC的属性自身有一些古怪的特性,所以,实际操作的时候,能兼顾流体特性和BFC特性来实现无敌自适应布局的属性并不多。
float:left
。浮动元素本身BFC化,然而浮动元素有破坏性和包裹性,失去了元素本身的流体自适应性,因此,无法用来实现自动填满容器的自适应布局。不过,其兼容性良好,开创了“浮动布局”。position:absolute
。这个属性脱离文档流有些严重。overflow:hidden
。其本身是一个很普通的元素,因此,块状元素的流体特性保存得相当完好,而且overflow:hidden
的BFC特性兼容性很好。唯一的问题就是容器盒子外的元素可能会被隐藏掉,一定程度上限制了这种特性的大规模使用。display:table-cell
。其让元素表现得像单元格一样,它会跟随内部元素的宽度显示,但是,单元格有一个特性,宽度值设置得再大,实际宽度也不会超过表格容器的宽度。因此,如果我们把display:table-cell
这个BFC元素宽度设置得很大,比方说3000px,那其实就跟block
水平元素自动适应容器空间效果一模一样了。