块格式化上下文(Block Formatting Context,BFC)是Web页面的可视化CSS渲染的一部分,是布局过程当中生成块级盒子的区域,也是浮动元素与其余元素的交互限定区域。
问题举例:如上左图所示,容器(container)没有高度或者 height = auto ,而且其子元素(sibling)是浮动元素,因此该容器的高度是不会被撑开的,即高度塌陷。css
解决方法:在容器(container)中建立 BFC。html
HTML前端
<div class="container"> <div class="Sibling"></div> <div class="Sibling"></div> </div>
CSSweb
.container { overflow: hidden; /* creates block formatting context */ background-color: green; } .container .Sibling { float: left; margin: 10px; background-color: lightgreen; }
特别提示:面试
相邻的两个盒子(多是兄弟关系也多是祖先关系)的垂直边距相遇时, 它们将造成一个外边距。这个外边距的高度等于两个发生折叠的外边距的高度中的较大者。segmentfault
HTML布局
<div class="Container"> <p>Sibling 1</p> <p>Sibling 2</p> </div>
CSSflex
.Container { background-color: red; overflow: hidden; /* creates a block formatting context */ } p { background-color: lightgreen; margin: 10px 0; }
如上图所示:红色盒子(Container)中包含两个绿色的兄弟元素(P),而且红色盒子设置 overflow: hidden; 则一个BFC 已经被建立,即致使外边距折叠。spa
理论上两个兄弟元素之间的边距应该是两个元素的边距之和(20px),但实际是 10px。这就是外边距折叠致使的。3d
2.1 折叠外边距的值
2.2 外边距折叠的条件是 margin 必须相邻!
这一听起来可能有些困惑,由于咱们在前面讨论了 BFC 致使外边距折叠的问题。但咱们必须记住的是外边距折叠(Margin collapsing)只会发生在属于同一BFC的块级元素之间。若是它们属于不一样的 BFC,它们之间的外边距则不会折叠。因此经过建立一个不一样的 BFC ,就能够避免外边距折叠。
修改前面的例子并添加第三个兄弟元素,CSS不变。
HTML
<div class="Container"> <p>Sibling 1</p> <p>Sibling 2</p> <p>Sibling 3</p> </div>
结果不会改变,还会折叠外边距,三个兄弟元素(P)将会以垂直距离为 10px 的距离分开。缘由是三个兄弟元素都属于同一个 BFC。
建立一个不一样的 BFC ,就能够避免外边距折叠。
HTML
<div class="Container"> <p>Sibling 1</p> <p>Sibling 2</p> <div class="newBFC"> <p>Sibling 3</p> </div> </div>
CSS
.Container { background-color: red; overflow: hidden; /* creates a block formatting context */ } p { background-color: lightgreen; margin: 10px 0; } .newBFC { overflow: hidden; /* creates new block formatting context */ }
当第二和第三个兄弟元素属于不一样的 BFC 时,它们之间就没有外边距折叠。