5分鐘理解BFC原理

1、BFC概念

BFC 即 Block Formatting Contexts (塊級格式化上下文),它是頁面中的一塊渲染區域,而且有一套渲染規則,它決定了其子元素將如何定位,以及和其餘元素的關係和相互做用。html

具備 BFC 特性的元素能夠看做是隔離了的獨立容器,容器裏面的元素不會在佈局上影響到外面的元素,而且 BFC 具備普通容器所沒有的一些特性。佈局

通俗一點來說,能夠把 BFC 理解爲一個封閉的大箱子,箱子內部的元素不管如何翻江倒海,都不會影響到外部。flex

2、觸發

只要元素知足下面任一條件便可觸發 BFC 特性:spa

  • body 根元素
  • 浮動元素:float 除 none 之外的值
  • 絕對定位元素:position (absolute、fixed)
  • display 爲 inline-block、table-cells、flex
  • overflow 除了 visible 之外的值 (hidden、auto、scroll)

3、BFC的特性及應用

1.同一個BFC下外邊距會發生重疊

代碼以下

<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>BFC</title>
    <style>    
        div{
            width:100px;
            height:100px;
            background:#f0f;
            margin:50px;
        }
    </style>
</head>    
<body>
    <div></div>
    <div></div>
<body>
</html>

運行結果以下圖:

圖片描述

從效果上看,由於兩個 div 元素都處於同一個 BFC 容器下 (這裏指 body 元素) 因此第一個 div 的下邊距和第二個 div 的上邊距發生了重疊,因此兩個盒子之間距離只有 50px,而不是 100px3d

使用BFC原理修改後的代碼以下:

<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>BFC</title>
    <style>
        .box{
            width:200px;
            margin:0 auto;
            overflow:hidden;
        }
        .btn{
            width:100px;
            height:100px;
            background:#f0f;
            margin:50px;
        }
    </style>
</head>    
<body>
    <div class="box">
        <div class="btn"></div>
    </div>
    <div class="box">
        <div class="btn"></div>
    </div>
<body>
</html>

這個時候,兩個盒子之間的邊距就是100px,運行結果以下圖:

圖片描述

2.BFC 能夠包含浮動的元素(清除浮動)

咱們都知道,浮動的元素會脫離文檔流,看例子:code

<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>BFC</title>
    <style>
        .box{
            width:300px;
            margin:0 auto;
            border:1px solid #000;
        }
        .float{
            width:100px;
            height:80px;
            background:#f00;
            float:left;
        
    </style>
</head>    
<body>
    <div class="box">
        <div class="float"></div>
    </div>
<body>
</html>

運行結果以下圖:

圖片描述

因爲浮動元素脫離文檔流,因此容器只剩下了2px的高度,若是觸發BFC,那麼容器就會包裹浮動元素orm

<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>BFC清除浮動的影響</title>
    <style>
        .box{
            width:300px;
            margin:0 auto;
            border:1px solid #000;
            overflow:hidden;
        }
        .float{
            width:100px;
            height:80px;
            background:#f00;
            float:left;
        }
    </style>
</head>    
<body>
    <div class="box">
        <div class="float"></div>
    </div>
<body>
</html>

運行結果以下圖

圖片描述

3.BFC 能夠阻止元素被浮動元素覆蓋

<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>BFC</title>
    <style>
        .box{
            width:300px;
            margin:0 auto;
            border:1px solid #000;
            overflow:hidden;
        }
        .float{
            width:100px;
            height:80px;
            background:#f00;
            float:left;
        }
        .right{
            width:200px;
            height:300px;
            background:#f0f;    
        }
    </style>
</head>    
<body>
    <div class="box">
        <div class="float"></div>
        <div class="right">我是一個沒有浮動,沒有觸發BFC的元素.width:200px;
        height:300px;
        background:#f0f;</div>
    </div>
<body>
</html>

運行結果以下圖:

圖片描述

這個時候,第一個浮動的元素已經覆蓋了第二個元素,可是文本內容不會被覆蓋,若是第二個元素觸發BFC,即第二個元素添加overflow:hidden;就會變成htm

圖片描述

持續更新,歡迎你們指教!

相關文章
相關標籤/搜索