CSS--理解塊級格式上下文(BFC)

1.BFC 定義

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

通俗地來講:建立了 BFC的元素就是一個獨立的盒子,裏面的子元素不會在佈局上
影響外面的元素(裏面怎麼佈局都不會影響外部),BFC任然屬於文檔中的普通流html

2.BFC的生成:

知道了BFC怎麼觸發BFC
知足如下條件之一均可以觸發BFC,變身爲BFC佈局

  1. 根元素
  2. float屬性不爲none
  3. position不爲static和relative
  4. overflow不爲visible
  5. display爲inline-block, table-cell, table-caption, flex, inline-flex

你會發現BFC無處不在,只是本身用的時候不知道而已flex

3.BFC佈局規則:

變身爲BFC後有什麼特性呢,如下:code

  1. 內部的Box會在垂直方向,一個接一個地放置。
  2. Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊
  3. 每一個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,不然相反)。即便存在浮動也是如此。
  4. BFC的區域不會與float box重疊。
  5. BFC就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素。反之也如此。
  6. 計算BFC的高度時,浮動元素也參與計算

4.BFC做用:

用起來come bobyorm

1.防止外邊距重疊

bfc致使的屬於同一個bfc中的子元素的margin重疊(Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊)htm

問題:由圖能夠看到,String1和String2 之間只有20px的margin,按理來講應該是40px,但這是在bfc中致使了他們的margin重疊blog

代碼:文檔

<style>
.container1{
        /* 經過overflow:hidden能夠建立bfc */
        overflow: hidden;
        background-color: red;
        width: 300px;
    }
    .sub1{
        margin: 20px 0px;
        background-color: #dea;
    }
</style>
<div class="container1">
        <div class="sub1">String1</div>
        <div class="sub1">String2</div>
</div>

解決方法:咱們能夠在div外面包裹一層容器,並觸發該容器生成一個BFC。那麼兩個div便不屬於同一個BFC,就不會發生margin重疊了。it

代碼:

<style>
    .newbfc{
            overflow: hidden;
    }
</style>
<div class="container1">
        <div class="sub1">String1</div>
        <div class="newbfc"><div class="sub1">String2</div></div>
</div>

2.清除浮動:

問題:當元素的子元素都浮動後,會出現高度坍塌的現象,即父容器的高度不會被撐開

代碼:

<style>
    .pre2{
        width: 200px;
        border: 2px solid red;
    }
    .float1,.float2{
        width: 100px;
        height: 100px;
        float: left;
    }
    .float1{
        background-color: #dee;
    }
    .float2{
        background-color: #dcc;
    }
</style>
<div class="pre2">
        <div class="float1"></div>
        <div class="float2"></div>
</div>

解決方法:

bfc的規則:計算BFC的高度時,浮動元素也參與計算因此只要將父容器設置爲bfc就能夠把子元素包含進去:
這個容器將包含浮動的子元素,它的高度將擴展到能夠包含它的子元素,在這個BFC,這些元素將會回到頁面的常規文檔流。

.pre2{
        width: 200px;
        border: 2px solid red;
        /* 設置overflow*/
        overflow:hidden;
    }

3.解決佈局:防止文字環繞

代碼:

<style>
.container2{
        overflow: hidden;
        width: 200px;
    }
    .box{
        float: left;
        width: 100px;
        height: 30px;
        background-color: #daa;
    }
</style>

<div class="container2">
        <div class="box"></div>
        <p style="background-color: #eea">sdfadsfdff fffffffds fsfffff sfd  fsdsdfsdf fffffff</p>
</div>

這個p元素並無移動,可是它卻出如今浮動元素的下方。p元素的line boxes(指的是文本行)進行了移位。此處line boxes的水平收縮爲浮動元素提供了空間。

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

解決這個問題只要將p元素添加overflow:hidden使其成爲一個新的bfc就能夠了

本篇是我的筆記,可常常看看。向前走,也別忘記要多回顧

你執着的等待,卻未曾離開

Ry(元)

相關文章
相關標籤/搜索