淺析CSS里的BFC和IFC的用法

前言
之前一直聽到有人提到 CSS里的BFC,正巧在 IFE的練習(xí)里遇到了外邊距折疊的問題,所以正好弄清楚BFC的機(jī)制。 (參考來源 見文末的 Reference)
一 什么是 BFC
和之前所有博文一樣,還是先從What的角度開始介紹,由淺入深的理解BFC。
所謂的 Formatting context(格式化上下文), 它是 W3C CSS2.1 規(guī)范中的一個(gè)概念。
它是頁面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則.
它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用。
而 Block Formatting Contexts (BFC,塊級(jí)格式化上下文),就是 一個(gè)塊級(jí)元素 的渲染顯示規(guī)則。通俗一點(diǎn)講,可以把 BFC 理解為一個(gè)封閉的大箱子,,容器里面的子元素不會(huì)影響到外面的元素,反之也如此。
BFC的布局規(guī)則如下:
1 內(nèi)部的盒子會(huì)在垂直方向,一個(gè)個(gè)地放置;
2 BFC是頁面上的一個(gè)隔離的獨(dú)立容器;
3 屬于同一個(gè)BFC的 兩個(gè)相鄰Box的 上下margin會(huì)發(fā)生重疊 ;
4 計(jì)算BFC的高度時(shí),浮動(dòng)元素也參與計(jì)算
5 每個(gè)元素的左邊,與包含的盒子的左邊相接觸,即使存在浮動(dòng)也是如此;
6 BFC的區(qū)域不會(huì)與float重疊;
那么如何觸發(fā) BFC呢?只要元素滿足下面任一條件即可觸發(fā) BFC 特性:
- body 根元素;
- 浮動(dòng)元素:float 不為none的屬性值;
- 絕對(duì)定位元素:position (absolute、fixed)
- display為: inline-block、table-cells、flex
- overflow 除了visible以外的值 (hidden、auto、scroll)
二 BFC的特性及應(yīng)用
接下來介紹BFC常見的特性和應(yīng)用,這一部分 在解釋原因時(shí),會(huì)用到上文的布局規(guī)則 和 觸發(fā)條件,所以需要注意一下。
1 兩個(gè) 相鄰的普通流中的 塊元素垂直方向上的 margin會(huì)折疊
<head> .p { width:200px; height:50px; margin:50px 0; background-color:red; } </head> <body> <div class="p"></div> <div class="p"></div> </body>
效果圖是:
根據(jù)BFC規(guī)則的第3條:
盒子垂直方向的距離由margin決定,
屬于 同一個(gè)BFC的 + 兩個(gè)相鄰Box的 + 上下margin 會(huì)發(fā)生重疊。
上文的例子 之所以發(fā)生外邊距折疊,是因?yàn)樗麄?同屬于 body這個(gè)根元素, 所以我們需要讓 它們 不屬于同一個(gè)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可以包含浮動(dòng)的元素(清除浮動(dòng))
正常情況下,浮動(dòng)的元素會(huì)脫離普通文檔流,所以下面的代碼里:
<div style="border: 1px solid #000;"> <div style="width: 50px; height: 50px; background: #eee; float: left;"> </div> </div>
外層的div會(huì)無法包含 內(nèi)部浮動(dòng)的div,效果見下圖:
但如果我們 觸發(fā)外部容器的BFC,根據(jù)BFC規(guī)范中的第4條:計(jì)算BFC的高度時(shí),浮動(dòng)元素也參與計(jì)算,那么外部div容器就可以包裹著浮動(dòng)元素,所以只要把代碼修改如下:
<div style="border: 1px solid #000;overflow: hidden"> <div style="width: 100px;height: 100px;background: #eee;float: left;"></div> </div>
就可以完成以下效果:
3 BFC可以阻止元素被浮動(dòng)元素覆蓋
先看一個(gè)例子:
<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; }
效果圖是:
之所以是這樣,是因?yàn)樯衔牡?規(guī)則5: 每個(gè)元素的左邊,與包含的盒子的左邊相接觸,即使存在浮動(dòng)也是如此;
所以要想改變效果,使其互補(bǔ)干擾,就得利用規(guī)則6 :BFC的區(qū)域不會(huì)與float重疊,讓 <div class="main"> 也能觸發(fā)BFC的性質(zhì),即:
.main { overflow:hidden; height:200px; background-color:red; }
通過這種方法,就能 用來實(shí)現(xiàn) 兩列的自適應(yīng)布局。
三 簡(jiǎn)要介紹IFC
IFC布局規(guī)則:
1 框會(huì)從包含塊的頂部開始,一個(gè)接一個(gè)地水平擺放。
2 擺放這些框時(shí),它們?cè)谒椒较虻?內(nèi)外邊距+邊框 所占用的空間都會(huì)被考慮;在垂直方向上,這些框可能會(huì)以不同形式來對(duì)齊:水平的margin、padding、border有效,垂直無效。不能指定寬高;
3 行框的寬度是 由包含塊和存在的浮動(dòng)來決定;行框的高度 由行高來決定
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
- 這篇文章主要介紹了10分鐘理解BFC原理及其應(yīng)用的相關(guān)資料,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-01
- 這篇文章主要介紹了淺談CSS潛藏著的BFC的相關(guān)資料,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-08
css布局之BFC模式(block formatting context)
這篇文章主要介紹了css布局之BFC模式(block formatting context),通過BFC盒子的一些特性和應(yīng)用場(chǎng)景解釋了BFC模式,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙2017-08-16- 這篇文章主要介紹了CSS布局基礎(chǔ)BFC 的相關(guān)資料,需要的朋友可以參考下2016-07-14
CSS使用BFC規(guī)則布局引發(fā)外層div包裹內(nèi)層div的處理方法
BFC情況下人們通常在div中使用float和margin,這會(huì)經(jīng)常出現(xiàn)一些問題,這里就來看一下CSS使用BFC規(guī)則布局引發(fā)外層div包裹內(nèi)層div的處理方法,需要的朋友可以參考下.2016-06-03- BFC(Block formatting context)直譯為"塊級(jí)格式化上下文"。它規(guī)定了內(nèi)部的Block-level Box如何布局,并且與這個(gè)區(qū)域外部毫不相干.接下來通過本文給大家介紹CSS理2018-02-22