BFC的理解与应用
定义
先上MDN上对 BFC 的定义:
块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。
———— BFC | MDN
不知道别人看完这段定义有何感受,反正我是懵逼的。不过我在这儿还是建议各位认真阅读上面给出的MDN链接至少两遍,这能让你对一个陌生的概念有一个基本的认知。
理解
这里谈下我对BFC的理解:BFC其实是一个独立的,与外界隔离了的容器,容器里面的子元素不会影响到外面的元素,外面的也同样不会影响到容器内部的元素。我们可以利用这个特性,来解决一些布局上的问题。
BFC触发条件
BFC的触发条件有很多,想要知道所有细节可以移步上面给出的 MDN 链接。这里我只列出一些常见触发条件:
- 根元素(HTML元素)
- 浮动元素(float不为none)
- 绝对定位元素(position 为 absolute 或 fixed)
- display 为 block, inline-block, flex, inline-flex, list-item, table
- overflow 值不为 visible 的块元素
BFC布局特性
对于一个BFC容器来说:
- 内部相邻的两个元素垂直方向上的 margin 会发生重叠
- 不会与外界的浮动元素产生交集,而是紧贴浮动元素的边缘
- 元素从容器的顶端开始垂直地一个接一个地排列
- 每一个元素的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(如果设置了容器内部的元素从右到左的格式排布,则触碰的是右边缘)
- 在计算它的高度时,还会检测内部浮动或者定位元素的高度
实际应用
清除浮动
利用BFC “在计算它的高度时,还会检测内部浮动或者定位元素的高度” 这条特性,我们可以触发父元素的BFC来清除子元素浮动带来的影响。常见的用法是给父元素设置 overflow: hidden
样式(如果考虑IE6版本,还需设置 zoom: 1
,因为IE6不支持 overflow: hidden
来清除浮动):
解决外边距合并问题
如果看上面标题不知道在说什么,请很戳这里了解详情。由于属于同一个BFC的两个相邻盒子的垂直margin会发生重叠,那么我们可以隔离开这两个元素,让它们不属于同一个BFC,这样就不会发生margin重叠了。
两栏布局,右边宽度自适应
我们常常在开发中有这样类似的需求:两栏布局,左边定宽,右边自适应。
这时我们就可以利用BFC特性来实现需求:左边设置定宽+左浮动;右边给自己加上 overflow: hidden
。
原理就是:给元素设置BFC后,为了和浮动元素不产生任何交集,它会顺着浮动元素的边缘形成自己的封闭上下文。直接上代码看效果:
以上是我对BFC的一些理解以及实际应用,希望能够帮助大家了解BFC这个听起来摸不着头脑的东西。