BFC相關知識點

  • 在什么場景下會出現外邊距合并?如何合并?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例
    塊元素直接接觸的垂直外邊距(top、bottom)會合并成成單個外邊距(取當中較大的值)
    • 外邊距合并的情況
      • 毗鄰的兄弟元素的垂直外邊距
        備注:橙色的是外邊距
.child {
    width: 200px;
    height: 100px;
    background-color: red;
    margin: 20px;
}

上面一個div的margin-bottom+下面一個div的margin-top是40px,但是他們合并了,合并后取兩個值中較大的一個


毗鄰元素的垂直外邊距合并

- 父元素與第一個/最后一個子元素的垂直外邊距合并

.parent {
    margin-bottom: 10px;
}

通過設置父元素的margin-bottom為10px,加上最后一個子元素的margin-bottom為20px,應該是30px,但是因為外邊距合并,取他們當中較大的一個就是20px


父元素與最后一個子元素外邊距合并

父元素與最后一個子元素外邊距合并

- 空塊級元素的垂直外邊距

.box4 {
    margin: 20px:
}

一個空的div,設置了marin為20px,意味著有20px的上外邊距和20px的下外邊距,垂直方向上應該有40px,但是上外邊距和下外邊距卻合并了,最后只有20px


空元素外邊距合并

空元素外邊距合并

- 阻止外邊距合并
- 阻止相鄰元素的合并
1. float、絕對定位來脫離文檔流position


默認

浮動和絕對定位 脫離文檔流

2. display: inline-block;的元素與其兄弟元素、子元素和父元素的外邊距都不會合并
inline-block脫離文檔流

因為inline-block不符合外c規范所說的必須是塊級盒子的條件,因為規范中說明,塊級盒子的display屬性必須是以下三種之一:"block"、"list-item"、"table"
- 阻止父元素與子元素的合并
1. 設置padding和border,阻止子元素和父元素的外邊距直接接觸


設置padding

通過設置padding來阻止合并
設置border

通過設置border來阻止合并
2. 設置overflow形成BFC來阻止合并
overflow: hidden;

3. 設置display: inline-block:
- 父元素設置display: inline-block;
父元素設置display: inline-block;

首先對毗鄰的兄弟元素外邊距不合并,然后對子元素的外邊距也不合并
- 子元素設置display: inline-block;
子元素設置display: inline-block;

與父元素的外邊距不合并,與毗鄰的兄弟元素也不合并

參考:深入理解BFC和Margin Collapse

  • 在什么場景下會出現外邊距合并?如何合并?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例
    塊元素的垂直外邊距(top、bottom)直接接觸會合并成成單個外邊距(數字大的那個)
    • 外邊距合并的情況
      • 毗鄰的兄弟元素的垂直外邊距
      • 父元素與第一個/最后一個子元素的垂直外邊距合并
      • 空塊級元素的垂直外邊距
  • 去除inline-block內縫隙有哪幾種常見方法?
    本質是因為HTML會把多個空格當成一個
    • 去除HTML標簽的空隙
    <div class="wrapper">
        <span>哈哈</span>
        <span>哈哈</span>
        <span>哈哈</span>
        <span>哈哈</span>
    </div>
    
    改成
    <div class="wrapper">
        <span>哈哈</span><span>哈哈</span><span>哈哈</span><span>哈哈</span>
    </div>
    
    或者
    <div class="wrapper">
        <span>哈哈</span
        ><span>哈哈</span
        ><span>哈哈</span
        ><span>哈哈</span>
    </div>
    
    • 利用浮動
    span {
        float: left;
    }
    
    • 利用負margin
    span {
        margin-left: -5px;
    }
    
    • 父元素設置font-size: 0;子元素再設置回來
    .wrapper {
        font-size: 0;
    }
    span {
        font-size: 16px;
    }
    
    • 父元素設置word-spacing
    .wrapper {
        word-spacing: -5px;
    }
    

    注意:
    word-spacing:
    <blockquote>The word-spacing CSS property specifies the spacing behavior between tags and words.</blockquote>
    設置的是單詞和標簽間的空隙


    word-spacing

    letter-space:
    <blockquote>The letter-spacing CSS property specifies spacing behavior between text characters.</blockquote>
    而letter-space設置的是字母間的空隙,所以不能用來消除行內元素的空隙,因為字與字之間的空隙也會變小


    letter-space

    所以就會出現這種情況:
    不能用letter-space消除標簽間的空隙
  • 父容器使用overflow: auto| hidden撐開高度的原理是什么?
    當overflow屬性的值不為visible時,會觸發BFC,就是塊級格式上下文,BFC可以消除浮動帶來的父元素高度坍塌的影響
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1,.box2,.box3 {
            width: 200px;
            height: 100px;
            background-color: orange;
            float: left;
            margin: 5px;
        }

        .wrapper {
            overflow: hidden;
        }
    </style>
</head>
<body>
    <div class="wrapper">
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
    </div>
</body>
</html>
overflow: hidden;
  • BFC是什么?如何形成BFC,有什么作用?
    <blockquote>Boxes in the normal flow belong to a formatting context, which may be block or inline, but not both simultaneously. Block-level boxes participate in a block formatting context. Inline-level boxes participate in an inline formatting context.</blockquote>
    在w3c規范中這樣說道,每個文檔流中的盒子必定屬于一個格式化環境,要么塊級格式化環境,要么行內格式化環境,其中,塊級元素在塊級格式化環境中,行內元素在行內格式化環境中
    其實HTML根元素html就是一個默認的塊級格式化上下文,因為當頁面的內容在視窗顯示不下的時候,會出現滾動條,意味著html根元素的overflow屬性的值為auto
    那么塊級格式化上下文是什么呢,通俗來說,就是一個獨立的布局環境,外面的元素不能影響里面的元素,里面的元素也不能影響外面的元素,那么BFC的布局規則是怎樣的呢
    • BFC布局規則
      1. 內部的BOX會在垂直方向,一個接一個地放置
      2. BOX垂直方向的距離由margin決定。屬于同一個BFC的兩個相鄰的BOX的margin會發生重疊
      3. 每個元素的margin-box的左邊與包含塊的border-box的左邊相接觸(對于從左往右的格式,反之相反)。及時存在浮動也是如此
      4. BFC的區域不會與float box重疊
      5. BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此
      6. 計算BFC高度時,浮動元素也參與計算
    • 如何觸發BFC
      <blockquote>Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with 'overflow' other than 'visible' (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.</blockquote>
      浮動元素,絕對定位元素,塊級容器但是不是塊級盒子(例如:display的值為inline-block、table-cell、table-caption),塊級元素的overflow屬性的值不為visible
    • BFC的作用
      1. 清除內部浮動
      .wrapper {
          overflow: hidden;
      }
      

清除浮動

2. 自適應兩欄布局
.main { overflow: hidden; }
自適應兩欄布局

3. 阻止垂直外邊距合并

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1 {
            width: 200px;
            height: 100px;
            background-color: red;
            margin-bottom: 20px;
        }

        .wrapper {
            background-color: #eee;
            overflow: hidden;
        }

        .box2 {
            width: 200px;
            height: 100px;
            background-color: #ccc;
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <div class="box1"></div>
    <div class="wrapper">
        <div class="box2"></div>
    </div>
</html>
阻止外邊距合并
BFC的用法都體現了規則的第5條:

<blockquote>BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此</blockquote>
因為BFC內部和外部互不影響,所以當外部元素浮動時,BFC通過自身變窄不與浮動元素重疊來消除的影響,而當內部元素浮動時,為了不影響外部元素,所以把浮動元素的高度計算在內,阻止margin合并也是為了內部元素不與外部元素互相影響

  • 浮動導致的父容器高度塌陷指什么?為什么會產生?有幾種解決方法
    指的是當父容器下的子元素都浮動了之后,子元素脫離了當前的文檔流,所以父元素的高度為0


    父元素高度坍塌
    • 利用clearfix
    .clearfix:after {
        content: 0;
        display: block;
        clear: both;
    }
    
    • 觸發BFC
    .wrapper {
        overflow: hidden;
    }
    
  • 以下代碼每一行的作用是什么? 為什么會產生作用? 和BFC撐開空間有什么區別?

        /*在clearfix類的最后加上內容*/
        .clearfix:after{
        /*所要加上的內容是空的*/
            content: '';
        /*顯示為塊級元素*/
            display: block;
        /*清除兩邊的浮動,clear屬性是作用在浮動元素的后續元素和塊級元素上*/
            clear: both;
        }
        .clearfix{
        /* *是property hack,表示只有IE7及以下的版本可以識別,zoom相當于觸發IE的BFC*/
            *zoom: 1;
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,796評論 1 92
  • 一、在什么場景下會出現外邊距合并?如何合并?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例 在CSS當中,相...
    dengpan閱讀 597評論 0 0
  • 1.在什么場景下會出現外邊距合并?如何合并?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例 概念:在CSS當...
    饑人谷_任磊閱讀 697評論 0 3
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 965評論 0 2
  • 一,浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 浮動模型是一種可視化格式模型,浮動...
    DeeJay_Y閱讀 901評論 0 4