CSS中的IFC和BFC入門


CSS中的IFC和BFC入門

提到CSS,首先會想到的就是盒模型,若是對於盒模型不是很理解的,看這裏。這是一個基礎的系列,看了盒模型還能夠看看box-sizing,好了很少說了,下面介紹今天的重點。css

首先從概念入門,B是Block,I是inline,F [Formatting] C [context]。一句話歸納就是格式化上下文一個是塊級,一個是行級。html

BFC有以下規則:app

 

  1. 內部的盒子會在垂直方向,一個個的放置;
  2. BFC是頁面上的一個隔離的容器
  3. 屬於同一個BFC的 兩個相鄰Box的 上下margin會發生重疊
  4. 計算BFC的高度時,浮動元素也參與計算
  5. BFC的區域不會與float重疊;

觸發BFC的條件:佈局

 

  • body 根元素;post

  • 浮動元素:float 不爲none的屬性值;flex

  • 絕對定位元素:position (absolute、fixed)spa

  • display爲: inline-block、table-cells、flexcode

  • overflow 除了visible之外的值 (hidden、auto、scroll)orm

這裏提出一點,規則是做用於BFC內部的元素,而條件則是做用於BFC容器的,這點要理解。xml

這些只是概念,要想理解,還得結合一些例子來看。

佈局規則一二條是概念,就不介紹了。第三條

 

  • .p {
  • width:200px;
  • height:50px;
  • margin:50px 0;
  • background-color:red;
  • }

 

  •  
    <body>
  • <div class="p"> </div>
  • <div class="p"> </div>
  • </body>

效果如圖所示:

由圖可知,因爲全都存在於body根元素的BFC下,發生了重疊,若是想避免重疊,能夠用另外一個BFC將第二個div包裹起來,能夠本身試驗一下。這裏提一句,若是你直接將第二個div變成BFC(好比添加overflow:hidden),結果仍是同樣的,由於他們兩個仍是處於同一個BFC下。

第四條:浮動元素參與計算BFC高度

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

效果如上,因爲只是一個普通的div,裏面包含的浮動元素並無爲div撐起高度。嘗試一下將div變成BFC看會發生什麼。

第五條:BFC區域不會與float發生重疊。

咱們知道float是脫離文檔流的,若是對其中一個div使用了float,兩個並列的div會發生重疊,這時能夠把非float的div變成BFC,這樣就會避免重疊。

以上就是BFC的內容,要作到理解並運用到實際開發中。

下面說一下IFC,在這以前先看一個例子,這個是我在開發中遇到的問題,

  • .box{
  •  
    width: 150px;
  •  
    height: 150px;
  •  
    display:inline-block;
  •  
    word-wrap:break-word;
  •  
    background:green
  •  
    }
 
  1. <code class="language-css"><div class='box'>asdfasdfasdfffffffffffffffffffffffffffffffffffffffffffffffff</div>  
  2. <div class='box'>asdfasdfasdf</div></code>  
  •  
    < div class=' box'> asdfasdfasdfffffffffffffffffffffffffffffffffffffffffffffffff</ div>
  •  
    < div class=' box'> asdfasdfasdf</ div>

效果以下:

能夠看到第二個inline-block發生了下陷,這裏的知識就涉及到了IFC。這裏也不賣關子,給第二個添加vertical-align:top;屬性就能夠解決問題。

首先說一下行級盒子的寬度和高度,能夠很容易的發現,對<span>這個inline-level box設置寬度和高度並無什麼做用(對於行內元素,設置margin,padding的top 和 bottom也是不起做用的),他有本身的寬高計算方法,高由font-size決定的,寬等於其子行級盒子的外寬度(margin+border+padding+content width)之和

再說一下Inlinebox,總的來講,inlinebox就是佈局中的一行,裏面能夠只包含一個<span>行內元素,也能夠包含多個<span>或者inline-block.

inlinebox也有本身的寬高度計算的方法,寬度取決於內部元素的寬度,最大爲父元素的寬度,linebox的高度取決於linebox元素,通常由最高的元素決定linebox的高度。

這裏我不對於BFC 作過多解釋,若是想了解更深的,能夠參照這篇文章,不過我卻是以爲若是不是太偏執,不須要這樣,畢竟<span>嵌套<span>也許永遠也不會用到這種操做。

要解決上面的問題,更多的應該關注行內元素的對齊方式,默認是baseline對其,來一張圖;

因而可知,以前的對其方式爲baseline對齊顧致使下陷。

下面總結幾條inline元素的baseline位置:

 

  • inline元素的baseline,爲內容盒content-box裏面文本框的基線。
  • inline-block的外邊緣就是margin-box的外邊緣,
  • 若是inline-block內部有內容,則baseline爲內容最下方的baseline,參照剛纔給出的例子。
  • 若是Inline-block內部無內容,則baseline與margin-box的下邊緣重合。
  • 若是overflow屬性不爲visible(默認),則baseline與margin-box的下邊緣重合。

這裏給出一個例子作講解,剩下的能夠本身去嘗試。

  •  
    .box{
  •  
    width: 150px;
  •  
    height: 150px;
  •  
    display:inline-block;
  •  
    word-wrap:break-word;
  •  
    background:green
  • }
  •  
    .box1{
  •  
    width: 150px;
  •  
    height: 150px;
  •  
    overflow:hidden;
  •  
    display:inline-block;
  •  
    word-wrap:break-word;
  •  
    background:green
  •  
    }
  •  
    <div class='box1'>asdfasdfasdfffffffffffffffffffffffffffffffffffffffffffffffff </div>
  •  
    <div class='box'>asdfasdfasdf </div>

執行結果以下,可見baseline與第一個inline-block的margin-box重合了。

IFC和BFC就介紹到這裏,若是有問題歡迎提出指正。

相關文章
相關標籤/搜索