[佈局概念] 關於CSS-BFC深刻理解

寫在前面

好記性不如爛筆頭,研究了一下BFC,發現裏面比較細的東西也是不少的!關於BFC,不少人可能都據說過BFC這個東西,大概知道這是個啥東西,相信不少人對此並無一個很是細緻的瞭解,本文預計篇幅較長,認真,耐着性子看,應該都可以比較深刻的理解BFC這個概念的規則、做用以及用法。但願喜歡的朋友能夠點個贊,或者關注一波本人,謝謝。javascript

BFC是什麼鬼?

BFC歸納:能夠在心中記住這麼一個概念———所謂的BFC就是css佈局的一個概念,是一塊區域,一個環境。css

先穩住別懵逼,接着往下走。html

關於BFC的定義:

BFC(Block formatting context)直譯爲"塊級格式化上下文"。它是一個獨立的渲染區域,只有Block-level box參與(在下面有解釋), 它規定了內部的Block-level Box如何佈局,而且與這個區域外部絕不相干。java

咱們常說的文檔流其實分爲定位流、浮動流和普通流三種。而普通流其實就是指BFC中的FCweb

FC是formatting context的首字母縮寫,直譯過來是格式化上下文,它是頁面中的一塊渲染區域,有一套渲染規則,決定了其子元素如何佈局,以及和其餘元素之間的關係和做用。瀏覽器

常見的FC有BFC、IFC(行級格式化上下文),還有GFC(網格佈局格式化上下文)和FFC(自適應格式化上下文),這裏就再也不展開了。閉包

通俗一點的方式解釋:

BFC 能夠簡單的理解爲某個元素的一個 CSS 屬性,只不過這個屬性不能被開發者顯式的修改,擁有這個屬性的元素對內部元素和外部元素會表現出一些特性,這就是BFC。ide

下面列一波目錄,而後分別展開來說:

觸發條件或者說哪些元素會生成BFC:

  知足下列條件之一就可觸發BFC佈局

  【1】根元素,即HTML元素學習

  【2】float的值不爲none

  【3】overflow的值不爲visible

  【4】display的值爲inline-block、table-cell、table-caption

  【5】position的值爲absolute或fixed   

BFC佈局規則:

1.內部的Box會在垂直方向,一個接一個地放置。

2.Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊

3.每一個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,不然相反)。即便存在浮動也是如此。

4.BFC的區域不會與float box重疊。

5.BFC就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素。反之也如此。

6.計算BFC的高度時,浮動元素也參與計算

BFC有哪些做用:

  1. 自適應兩欄佈局
    2能夠阻止元素被浮動元素覆蓋
    3能夠包含浮動元素——清除內部浮動
    4.分屬於不一樣的BFC時能夠阻止margin重疊

BFC佈局規則1:內部的Box會在垂直方向,一個接一個地放置。

上文定義中提到過的塊級盒:block-level box,在這裏解析一波:

這個就是咱們日常操做盒子的組成

咱們日常說的盒子是由margin、border、padding、content組成的,實際上每種類型的四條邊定義了一個盒子,分別是分別是content box、padding box、border box、margin box,這四種類型的盒子一直存在,即便他們的值爲0.決定塊盒在包含塊中與相鄰塊盒的垂直間距的即是margin-box。

提示:Box之間的距離雖然也可使用padding來控制,可是此時實際上仍是屬於box內部裏面,並且使用padding來控制的話就不能再使用border屬性了。

佈局規則1就是咱們日常div一行一行塊級放置的樣式,你們想一下就知道了,這裏就不展開了。

BFC佈局規則2:Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊。

上文提到過,決定塊盒在包含塊中與相鄰塊盒的垂直間距的即是margin-box。,上面的栗子就是這種狀況。

演示中css屬性設置:上面的box:margin-bottom: 100px;下面的box:margin-top: 100px;(他們是同一側的margin,因此會發生margin重疊的狀況,兩個div的距離實際上只有100px。)

BFC的做用4:阻止margin重疊:

當兩個相鄰塊級子元素分屬於不一樣的BFC時能夠阻止margin重疊

操做方法:給其中一個div外面包一個div,而後經過觸發外面這個div的BFC,就能夠阻止這兩個div的margin重疊

下面是代碼:

<div class="aside"></div>
<div class="text">
    <div class="main"></div>
</div>
<!--下面是css代碼-->
 .aside {
            margin-bottom: 100px;//margin屬性
            width: 100px;
            height: 150px;
            background: #f66;
        }
        .main {
            margin-top: 100px;//margin屬性
            height: 200px;
            background: #fcc;
        }
         .text{
            /*盒子main的外面包一個div,經過改變此div的屬性使兩個盒子分屬於兩個不一樣的BFC,以此來阻止margin重疊*/
            overflow: hidden;//此時已經觸發了BFC屬性。
        }複製代碼

ps:觸發方式能夠參考上文給出的觸發條件。

這裏有一個網址能夠在線演示,經過演示,能夠更直觀一點:

這裏面也是一篇好文章,關於BFC的

連接地址:www.cnblogs.com/xiaohuochai…

BFC佈局規則3:每一個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,不然相反)。即便存在浮動也是如此。

<div class="par">
    <div class="child"></div>
    //給這兩個子div加浮動,浮動的結果,若是沒有清除浮動的話,父div不會將下面兩個div包裹,但仍是在父div的範圍以內。
    <div class="child"></div>
</div>複製代碼

解析:給這兩個子div加浮動,浮動的結果,若是沒有清除浮動的話,父div不會將下面兩個div包裹,但仍是在父div的範圍以內,左浮是子div的左邊接觸父div的borderbox的左邊,右浮是子div接觸父div的borderbox右邊,除非設置margin來撐開距離,不然一直是這個規則。

BFC做用3:能夠包含浮動元素——清除內部浮動

給父divpar加上 overflow: hidden;

清除浮動原理:觸發父div的BFC屬性,使下面的子div都處在父div的同一個BFC區域以內,此時已成功清除浮動。

還能夠向同一個方向浮動來達到清除浮動的目的,清除浮動的原理是兩個div都位於同一個浮動的BFC區域之中。

BFC佈局規則4:BFC的區域不會與float box重疊:

<div class="aside"></div>
<div class="text">
    <div class="main"></div>
</div>
<!--下面是css代碼-->
 .aside {
            width: 100px;
            height: 150px;
            float: left;
            background: #f66;
        }
        .main {
            height: 200px;
            overflow: hidden;//觸發main盒子的BFC
            background: #fcc;
        }
           .text{
            width: 500px;
    }複製代碼

上面aside盒子有一個浮動屬性,覆蓋了main盒子的內容,main盒子沒有清除aside盒子的浮動。只作了一個動做,就是觸發自身的BFC,而後就再也不被aside盒子覆蓋了。因此:BFC的區域不會與float box重疊

BFC做用:自適應兩欄佈局。

仍是上面的代碼,此時BFC的區域不會與float box重疊,所以會根據包含塊(父div)的寬度,和aside的寬度,自適應寬度。


BFC 與 Layout

IE 做爲瀏覽器中的奇葩,固然不可能循序漸進的支持 BFC 標準,因而乎 IE 中有了 Layout 這個東西。Layout 和 BFC 基本是等價的,爲了處理 IE 的兼容性,在須要觸發 BFC 時,咱們除了須要用觸發條件中的 CSS 屬性來觸發 BFC,還須要針對 IE 瀏覽器使用 zoom: 1 來觸發 IE 瀏覽器的 Layout。

有趣的文本:

.par {
            margin-top: 3rem;
            border: 5px solid #fcc;
            width: 300px;
        }
        .child {
            border: 5px solid #f66;
            width:100px;
            height: 100px;
            float: left;
        }複製代碼

當我使用上面的屬性,再加上一個沒有屬性的p或者span標籤,就發現兩個子div的float屬性自動被清除了,這是由於span或者p這類文本自帶一個BFC嗎?仍是什麼?求路過的大神解釋。。。

以上是錯誤的。這裏兩個div被撐開,是由於父div被p標籤撐開了,並非由於清除浮動的緣由,從下面這張圖片能夠清楚的知道。

其實以上的幾個例子都體現了BFC佈局規則第五條————  

BFC佈局規則5:BFC就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素。反之也如此。


文本環繞float:

<div style="float: left; width: 100px; height: 100px; background: #000;">
</div>
<div style="height: 200px; background: #AAA;">
    <div style=" width: 30px; height: 30px; background: red;"></div>
    <p>content</p> <p>content</p> <p>content</p> <p>content</p> <p>content</p>
</div>複製代碼

問題:爲何 div 的左上角被覆蓋了,而文本卻沒有被覆蓋,float不是應該跟普通流不在一個層級嗎?是由於float屬性不生效嗎?

解決:

float的定義和用法:

float 屬性定義元素在哪一個方向浮動。以往這個屬性總應用於圖像,使文本圍繞在圖像周圍,不過在 CSS 中,任何元素均可以浮動。浮動元素會生成一個塊級框,而不論它自己是何種元素。

從上圖能夠看到,float屬性確實生效,將float隱藏後,下面還有一個紅色的div,這個div是被黑色div所覆蓋掉的。div會被float覆蓋,而文本卻沒有被float覆蓋,是由於float當初設計的時候就是爲了使文本圍繞在浮動對象的周圍


後話

上面說的有些東西,其實在咱們日常的佈局中,已經有在使用這些規律,只是沒有總結出來,若是寫的很差之處歡迎批評指導。還有一篇關於閉包的,還沒寫完。。五一三天淨打遊戲了!應該很快就會寫好了。

最後:碼字不易,感謝支持!由於我常常看不懂別人寫的分享,因此我的寫文比較偏小白,寫的很差之處,歡迎指點。而後就是但願看完的朋友點個喜歡,也能夠關注一下我。
ps:目前待業,座標北京,本人適應互聯網快節奏,高強度,持續學習,持續成長,認真,嚴謹,學習積極性強。中小公司大佬求帶走,郵箱:1677593011@qq.com。
掘金我的主頁簡書主頁連接csdn博客主頁連接

參考連接:

BFC神奇背後的原理
深刻理解BFC
什麼是BFC
Block Formatting Context (BFC) 淺析

以上。2017.5.4.

相關文章
相關標籤/搜索