为什么需要BFC?
最常见的问题就是margin折叠。div1和div2之间的间距是20px,而不是预想的40px。该问题创建BFC就可以解决,因为BFC不会影响其他元素的布局。1
2
3
复制代码
BFC是什么?
BFC:Box Formatting Context,直译为块级格式化上下文。在中定义的一个关于css渲染定位的概念。BFC是一个独立的渲染区域,规定该区域内部的box 如何布局,并且与这个区域的外部毫不想干。
在CSS2.1规范中,还定义了Inline formatting context(IFC)。CSS3中添加了G(grid)FC和F(flex)FC
如何创建BFC?
详情请看
这里写个总结,满足以下条件之一的元素便会生成BFC。
- 根元素
- 浮动元素: float的值不为none
- 绝对定位元素: position的值为absolute或fixed
- 行内块元素: display: inline-block
- 表格单元格: display的值为table-cell,table-caption
- overflow的值不为visible的元素
- 弹性盒子 display:flex或inline-flex
BFC的规则是什么?
- 内部的box会在垂直方向上一个接一个放置。
- 垂直方向的距离有margin决定,属于同一个BFC的两个相邻box的margin会发生重叠,与方向无关。
- 每个元素的margin box的左边与包含块border box的左边相接触。存在浮动也是如此。
- BFC的区域不会与float的元素区域重叠。
- 计算BFC的高度时,浮动子元素也参与计算。
- BFC就是页面上的一个隔离的独立容器,容器里的子元素不会影响到外面元素,反之亦然
回归问题
文章开头的问题?
三个div同属于一个BFC(此处是body)中,所以根据规则第二点,margin会发生重叠。
解决方案:
p标签外在添加一个容器,并设置属性overflow:hidden。这样就产生了3个BFC,3个p在3个不同的BFC中,就不会产生margin重叠的问题。
1
1
复制代码1
除了margin重叠还有其他的作用吗?
- 清除浮动
参考规则第五点,计算BFC的高度时,浮动子元素也参与计算。形成BFC后,par就会把浮动子元素的高度也计算进去。 2. 不和浮动元素重叠复制代码box1box2
复制代码形成自适应两列布局。应用了BFC规则第四点。