直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,而且与这个区域外部绝不相干。javascript
<html> <head> <meta charset="utf-8"> <title></title> </head> <style> body { width: 300px; position: relative; } .aside { width: 100px; height: 150px; float: left; background: blue; } .main { height: 200px; background: green; } </style> <body> <div class="aside"></div> <div class="main"></div> </body> </html>
原始效果:html
根据BFC
布局规则第3条:java
每一个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,不然相反)。即便存在浮动也是如此。
所以,虽然存在浮动的元素aslide,但main的左边依然会与包含块的左边相接触。ide
根据BFC
布局规则第4条:布局
BFC
的区域不会与float box
重叠。
咱们能够经过经过触发main生成BFC
, 来实现自适应两栏布局。flex
.main { overflow:hidden;//使main生成BFC height: 200px; background: green; }
效果:spa
<html> <head> <meta charset="utf-8"> <title></title> </head> <style> .par { border: 5px solid darkgray; width: 300px; } .child { border: 5px solid pink; width:100px; height: 100px; float: left; } </style> <body> <div class="par"> <div class="child"></div> <div class="child"></div> </div> </body> </html>
原始效果:
根据BFC
布局规则第六条:code
计算
BFC
的高度时,浮动元素也参与计算
为达到清除内部浮动,能够触发par生成BFC,那么par在计算高度时,par内部的浮动元素child也会参与计算。orm
代码:htm
.par { border: 5px solid darkgray; width: 300px; overflow:hidden; }
效果:
<html> <head> <meta charset="utf-8"> <title></title> </head> <style> p { color: #f55; background: lightcyan; width: 200px; line-height: 100px; text-align:center; margin: 100px; } </style> <body> <p>1111</p> <p>2222</p> </body> </html>
原始效果(两个部分的margin重叠了):
根据BFC布局规则第二条:
Box
垂直方向的距离由margin决定。属于同一个BFC
的两个相邻Box
的margin会发生重叠
咱们能够在其中一个p外面包裹一层容器,并触发该容器生成一个BFC
。那么两个P便不属于同一个BFC
,就不会发生margin重叠了。
<style> .wrap { overflow: hidden; } p { color: #f55; background: lightcyan; width: 200px; line-height: 100px; text-align:center; margin: 100px; } </style> <body> <p>1111</p> <div class="wrap"> <p>2222</p> </div> </body>
<html> <head> <meta charset="utf-8"> <title></title> </head> <style> .father { width:300px; height:300px; background-color: red; } .son { width:100px; height:100px; background-color: darkgray; margin-top:50px; } </style> <body> <div class="father"> <div class='son'></div> </div> </body> </html>
本来,正确的显示方式,应该是粉色盒子与红色盒子的顶部距离为50px,可是因为margin的塌陷问题,致使盒子内部的布局影响到了外部。这个时候,就能够触发BFC,将父盒子变成一个独立的区域,这样在BFC区域内部的任何操做,都不会影响到外部。
代码:
.father { width:300px; height:300px; background-color: red; overflow:hidden; }