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