淺析CSS裏的 BFC 和 IFC

淺析CSS裏的 BFC 和 IFC

2018-01-29 閱讀 1794 收藏 3 原鏈: segmentfault.com
分享到:
 

前端必備圖書《Web安全開發指南 掌握白帽子的Web安全技能 從源頭消除安全隱患 打造安全無虞的Web應用》 >> >> 前端

前言

以前一直聽到有人提到 CSS裏的BFC,正巧在 IFE的練習裏遇到了外邊距摺疊的問題,因此正好弄清楚BFC的機制。 (參考來源 見文末的 Reference)segmentfault

一 什麼是 BFC

和以前全部博文同樣,仍是先從What的角度開始介紹,由淺入深的理解BFC。 所謂的 Formatting context(格式化上下文), 它是 W3C CSS2.1 規範中的一個概念。安全

它是頁面中的一塊渲染區域,而且有一套渲染規則. 它決定了其子元素將如何定位,以及和其餘元素的關係和相互做用。markdown

而 Block Formatting Contexts (BFC,塊級格式化上下文),就是 一個塊級元素 的渲染顯示規則。通俗一點講,能夠把 BFC 理解爲一個封閉的大箱子,,容器裏面的子元素不會影響到外面的元素,反之也如此。ide

BFC的佈局規則以下: 1 內部的盒子會在垂直方向,一個個地放置; 2 BFC是頁面上的一個隔離的獨立容器; 3 屬於同一個BFC的 兩個相鄰Box的 上下margin會發生重疊 ; 4 計算BFC的高度時,浮動元素也參與計算 5 每一個元素的左邊,與包含的盒子的左邊相接觸,即便存在浮動也是如此; 6 BFC的區域不會與float重疊;佈局

那麼如何觸發 BFC呢?只要元素知足下面任一條件便可觸發 BFC 特性:flex

  • body 根元素;
  • 浮動元素:float 不爲none的屬性值;
  • 絕對定位元素:position (absolute、fixed)
  • display爲: inline-block、table-cells、flex
  • overflow 除了visible之外的值 (hidden、auto、scroll)

二 BFC的特性及應用

接下來介紹BFC常見的特性和應用,這一部分 在解釋緣由時,會用到上文的佈局規則 和 觸發條件,因此須要注意一下。url

1 兩個 相鄰的普通流中的 塊元素垂直方向上的 margin會摺疊

<head> .p { width:200px; height:50px; margin:50px 0; background-color:red; } </head> <body> <div class="p"></div> <div class="p"></div> </body>

效果圖是: spa

根據BFC規則的第3條:3d

盒子垂直方向的距離由margin決定, 屬於 同一個BFC的 + 兩個相鄰Box的 + 上下margin 會發生重疊。

上文的例子 之因此發生外邊距摺疊,是由於他們 同屬於 body這個根元素, 因此咱們須要讓 它們 不屬於同一個BFC,就能避免外邊距摺疊:

<div class="p"></div> <div class="wrap"> <div class="p"></div> </div>
.wrap { overflow:hidden; .p { width:200px; height:50px; margin:50px 0; background-color:red;

效果圖是:

2 BFC能夠包含浮動的元素(清除浮動)

正常狀況下,浮動的元素會脫離普通文檔流,因此下面的代碼裏:

<div style="border: 1px solid #000;"> <div style="width: 50px; height: 50px; background: #eee; float: left;"> </div> </div>

外層的div會沒法包含 內部浮動的div,效果見下圖:

但若是咱們 觸發外部容器的BFC,根據BFC規範中的第4條:計算BFC的高度時,浮動元素也參與計算,那麼外部div容器就能夠包裹着浮動元素,因此只要把代碼修改以下:

<div style="border: 1px solid #000;overflow: hidden"> <div style="width: 100px;height: 100px;background: #eee;float: left;"></div> </div>

就能夠完成如下效果:

3 BFC能夠阻止元素被浮動元素覆蓋

先看一個例子:

<div class="aside"></div> <div class="main"></div> div { width:300px; } .aside { width: 100px; height: 150px; float: left; background: black; } .main { height:200px; background-color:red; } 

效果圖是: 之因此是這樣,是由於上文的 規則5: 每一個元素的左邊,與包含的盒子的左邊相接觸,即便存在浮動也是如此;

因此要想改變效果,使其互補干擾,就得利用規則6 :BFC的區域不會與float重疊, 讓 <div class="main"> 也能觸發BFC的性質,即:

.main { overflow:hidden; height:200px; background-color:red; }

經過這種方法,就能 用來實現 兩列的自適應佈局。

三 簡要介紹IFC

IFC佈局規則:

1 框會從包含塊的頂部開始,一個接一個地水平擺放。

2 擺放這些框時,它們在水平方向的 內外邊距+邊框 所佔用的空間都會被考慮; 在垂直方向上,這些框可能會以不一樣形式來對齊: 水平的margin、padding、border有效,垂直無效。不能指定寬高;

3 行框的寬度是 由包含塊和存在的浮動來決定; 行框的高度 由行高來決定

四 Refernce:

相關文章
相關標籤/搜索