BFC 即 Block Formatting Contexts (塊級格式化上下文),它是頁面中的一塊渲染區域,而且有一套渲染規則,它決定了其子元素將如何定位,以及和其餘元素的關係和相互做用。css
具備 BFC 特性的元素能夠看做是隔離了的獨立容器,容器裏面的元素不會在佈局上影響到外面的元素,而且 BFC 具備普通容器所沒有的一些特性。佈局
通俗一點來說,能夠把 BFC 理解爲一個封閉的大箱子,箱子內部的元素不管如何翻江倒海,都不會影響到外部。flex
只要元素知足下面任一條件便可觸發 BFC :spa
具有 BFC 屬性的元素,在頁面佈局上會有以下特性:.net
利用上述的這些 BFC 特性,咱們能夠總結出 BFC 具有以下的運用場景:code
以兩欄爲例,若是不給 main
容器添加 overflow: hidden
屬性,main
容器會延展到浮動區域,使其成爲 BFC 後,即可使其實現寬度自適應。orm
<div>
<div class="float"></div>
<div class="main"></div>
</div>
<style> .float{ width: 200px; height: 500px; background: skyblue; float: left; } .main{ background: pink; height: 600px; overflow: hidden; /* 使其成爲 BFC */ } </style>
複製代碼
這個方法也可運用於解決一個元素被浮動元素覆蓋的問題,請戳-完整代碼-在線預覽get
咱們知道浮動元素會脫離文檔流,當父容器的全部子元素都設置浮動後,會致使父容器出現高度「塌陷」的問題,若是讓父容器設置爲 BFC ,那麼它就會包裹浮動元素,從而解決高度「塌陷」:頁面佈局
<div class="wrap">
<div class="box"></div>
<div class="box"></div>
</div>
<style> .wrap{ border: 1px solid red; overflow: hidden; /* 使其成爲 BFC */ } .box{ width: 50px; height: 50px; background: skyblue; float: left; } </style>
複製代碼
從上述 BFC 的特性咱們知道子元素垂直方向的距離由 margin 決定,屬於同一個 BFC 的兩個相鄰子元素的 margin 會發生重疊,解決辦法就是使這兩個相鄰的子元素分別屬於不一樣的 BFC:
<div class="wrap">
<div class="box">1</div>
<div class="inner">
<div class="box">2</div>
</div>
</div>
<style> .box { width: 50px; height:50px; background: skyblue; margin: 50px; } .inner{ overflow: hidden; } </style>
複製代碼
這裏咱們給其中一個 Box 外面包一個 div(即 inner 容器),而後經過觸發外面這個 div 的 BFC ,就能夠阻止這兩個 Box 的 margin 重疊。