BFC、IFC、GFC和FFC

基本概念

Box 是 CSS 佈局的對象和基本單位, 直觀點來講,就是一個頁面是由不少個Box 組成的。元素的類型和 display 屬性,決定了這個 Box 的類型。 不一樣類型的 Box, 會參與不一樣的 Formatting Context(一個決定如何渲染文檔的容器),所以Box內的元素會以不一樣的方式渲染。讓咱們看看有哪些盒子:
  • block-level box:display 屬性爲 block, list-item, table 的元素,會生成 block-levelbox。而且參與 block fomatting context;
  • inline-level box:display 屬性爲 inline, inline-block, inline-table 的元素,會生成inline-level box。而且參與 inline formatting context;
  • Formatting context 是 W3C CSS2.1 規範中的一個概念。它是頁面中的一塊渲染區域,而且有一套渲染規則,它決定了其子元素將如何定位,以及和其餘元素的關係和相互做用。最多見的 Formatting context 有 Block fomattingcontext (簡稱BFC)和 Inline formatting context (簡稱IFC)。

常見的會生成BFC的元素:html

  • 根元素
  • float不爲none
  • position爲absolute或fixed
  • display爲inline-block, table-cell, table-caption, flex,inline-flex 
  • overflow不爲visible

 BFC的使用

1,自適應兩欄佈局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style>
    body {
        width: 300px;
        position: relative;
    } 
    .aside {
        width: 100px;
        height: 150px;
        float: left;
        background: #f66;
    } 
    .main {
        height: 200px;
        background: #fcc;
    }
   </style>
   <body>
        <div class="aside"></div>
        <div class="main"></div>
   </body>
</html>
根據BFC佈局規則:每一個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,不然相反)。即便存在浮動也是如此。  所以,上面的代碼會產生下面的效果:
 
 因爲 BFC的區域不會與float box重疊。此時,若是想要兩個元素再也不重疊,只須要讓第二個元素造成BFC就能夠了:
.main {
        height: 200px;
        background: #fcc;
        overflow: hidden;
    }

 

 2,清除內部浮動

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
    <style>
        .par {
            border: 5px solid #fcc;
            width: 300px;
        } 
        .child {
            border: 5px solid #f66;
            width:100px;
            height: 100px;
            float: left;
        }
       </style>
       <body>
            <div class="par">
                <div class="child"></div>
                <div class="child"></div>
            </div>
       </body>
</html>

因爲內部元素產生了浮動,因此父級元素會高度丟失,產生下面的效果:ide

 

因爲計算BFC的高度時,浮動元素也參與計算,爲達到清除內部浮動,咱們能夠觸發par生成BFC,那麼par在計算高度時,par內部的浮動元素child也會參與計算。佈局

.par {
            border: 5px solid #fcc;
            width: 300px;
            overflow: hidden;
        } 

 

固然,除了overflow之外,還能夠使用float等方法觸發par生成BFCflex

3,防止垂直 margin 重疊

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style> 
    p { 
        color: #f55;
        background: #fcc;
        width: 200px;
        line-height: 100px;
        text-align:center;
        margin: 100px;
     }
    </style>
    <body>
        <p>Haha</p>
        <p>Hehe</p>
    </body>
</html>
Box垂直方向的距離由margin決定。因爲 屬於同一個BFC的兩個相鄰Box的margin會發生重疊,所以,上面的兩個p元素就會產生margin重疊。
 

 爲了不這種margin重疊,咱們能夠在p外面包裹一層容器,並觸發該容器生成一個BFC。那麼兩個P便不屬於同一個BFC,就不會發生margin重疊了。ui

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style>
    .wrap {
        overflow: hidden;
    }
    p {
        color: #f55;
        background: #fcc;
        width: 200px;
        line-height: 100px;
        text-align:center;
        margin: 100px;
    }
</style>
    <body>
        <p>Haha</p>
        <div class="wrap"><p>Hehe</p></div>
    </body>
</html>

 

IFC

IFC(Inline Formatting Contexts)直譯爲"內聯格式化上下文",IFC的linebox(線框)高度由其包含行內元素中最高的實際高度計算而來(不受到豎直方向的padding/margin影響) 

FFC

FFC(Flex Formatting Contexts)直譯爲"自適應格式化上下文",display值爲flex或者inline-flex的元素將會生成自適應容器(flex container)。

GFC

GFC(GridLayout Formatting Contexts)直譯爲"網格佈局格式化上下文",當爲一個元素設置display值爲grid的時候,此元素將會得到一個獨立的渲染區域,咱們能夠經過在網格容器(grid container)上定義網格定義行(grid definition rows)和網格定義列(grid definition columns)屬性各在網格項目(grid item)上定義網格行(grid row)和網格列(grid columns)爲每個網格項目(grid item)定義位置和空間。 
相關文章
相關標籤/搜索