至今还记得面试今日头条实习的时候,面试官问我如何清除浮动,我说:“……巴拉巴拉……第N种方法,可以给父元素加一个overflow:hidden
触发一个BFC……“
然后面试官紧接着问我啥是BFC……其实我那个时候还不懂……
于是果断恶补一下BFC/顺便说说清除浮动的几种方式
BFC,即block formatting context,也叫块级格式化上下文,是文档里的一个渲染区域,定义了这个区域里的元素以一种什么样的方式进行排列布局,以及这个区域与临近的元素是怎样的关系。
如何设置BFC
html
会生成一个BFCoverflow
不为visible
position
不为static
relative
float
不为none
display
为inline-block
table-cell
table-caption
flex
inline-flex
BFC内部布局规则
BFC内的子元素从上到下顺序排列
BFC内子元素的margin-left和包含块的border-left相接触(从右往左排列则相反)
In a block formatting context, each box’s left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box’s line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).
在BFC中,每个盒子的左外边框紧挨着包含块的左边框(从右到左的格式,则为紧挨右边框)。即使存在浮动也是这样的(尽管一个盒子的边框会由于浮动而收缩),除非这个盒子的内部创建了一个新的BFC浮动,盒子本身将会变得更窄)。
BFC内的浮动元素会参与包含块的高度计算(所以就是这么用来清除浮动的)
BFC不会与同级的浮动元素重叠
BFC内的子元素的上下margin会发生重叠(关于外边框塌陷,MDN的文档描述可以看这里
BFC是一个独立的渲染区域,容器里面的子元素不会影响到外面的元素
BFC与清除浮动
清除浮动用得比较多的方法有下面的1和2两种,其实其他的方法都跟BFC有关
在浮动元素后面手动添加一个块级元素(太麻烦了)
使用
::before
::after
来设置一个类清除浮动12345678.clearfix::after {content:",";display:block;height:0;clear:both;overflow:hidden;visibility:hidden;}包含块设置BFC
原理:BFC中浮动元素也参与高度计算
overflow: hidden
- 设置浮动
- 设置绝对定位或者视窗固定
BFC与图文混排
浮动元素脱离文档流是”半脱离“,如果旁边有个元素没有浮动或者设置清除浮动,这个元素里地文字会移动,但是box本身不动。说不太明白,看看这个
See the Pen BjwGgw by ConanTvos (@lcc19941214) on CodePen.
第一次用codepen,见笑了
原理:BFC不与浮动元素重叠
然后,使用BFC就可以巧妙的避开这一问题
BFC与多列自适应布局
和上面的一样,就是利用BFC不与浮动元素重叠这一原理
BFC内部子元素的margin重叠
原理:同一个BFC内的兄弟元素的上下margin重叠
所以给两个兄弟元素设置一个包含块并设置BFC即可,因为这就不是一个BFC了嘛 XD
外边框塌陷
可以看看另一篇日志外边距塌陷是什么