目錄
問題1.區塊級元素都是在BFC中佈局的,那麼這個BFC在哪裡呢
問題2.BFC的作用
作用2:解决浮动高度塌陷问题
首頁 web前端 css教學 什麼是BFC?深入了解BFC,聊聊作用

什麼是BFC?深入了解BFC,聊聊作用

Jul 08, 2022 am 11:29 AM
css bfc

什麼是BFC?以下這篇文章帶大家了解BFC,聊聊BFC的作用。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

什麼是BFC?深入了解BFC,聊聊作用

之前在面試位元組的時候,面試官問了我有了解BFC嗎,我當時其實有看很多文章,但是總是記不住,感覺每個文章講的都差不多,然後面試時候也沒答出來,但是在聽了王紅元老師講解的之後,感覺茅塞頓開,所以想分享給大家。以下內容都是根據王紅元老師的前端系統課學習的總結,覺得講的非常清晰,非常感謝王紅元老師

在了解BFC(Block Formatting Context)之前,我們先來看看FC(Formatting Context)是什麼:

什麼是BFC?深入了解BFC,聊聊作用

#這段話來自W3C官網,我們可以得到以下資訊:

  • 所有的盒子都屬於一個FC

  • 區塊級元素的佈局屬於一個BFC。例如div/p/h1等 -> BFC佈局中

  • 行內級元素的佈局屬於一個IFC。例如img/a/span/i -> IFC佈局中

簡單理解:塊級元素所在的佈局和上下文就是BFC,行內級元素所在的佈局和上下文就是IFC

問題1.區塊級元素都是在BFC中佈局的,那麼這個BFC在哪裡呢

##首先我們先看一下W3C的官方解釋:

什麼是BFC?深入了解BFC,聊聊作用

MDN上整理出的下了情況會創建BFC:

    根元素(html)
  • 浮動元素(元素的float值不是none)
  • 絕對定位元素(元素的position為absolute或fixed)
  • 行內塊元素(元素的display為inline-block)
  • #表格單元格(元素的display為table-cell,HTML表格單元格預設為該值,表格標題(元素的display為table-caption,HTML表格標題預設為該值)row,tbody,thead,tfoot的預設屬性)或inline -table)
  • overflow計算值(Computed)不為visible的區塊元素
  • #彈性元素(display為flex或inline-flex元素的直接子元素)
  • 網格元素(display為grid或inline-grid元素的直接子元素)
  • display值為flow-root的元素
由此可見

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div></div>
    <div></div>
  </body>
</html>
登入後複製

這段程式碼中的box1和box2都是在html根元素的BFC中佈局的

問題2.BFC的作用

先看一下官方文件對BFC作用的描述:

什麼是BFC?深入了解BFC,聊聊作用

我們可以得到的資訊:

  • 在一個BFC中,盒子會從包含區塊的頂部開始,在垂直方向上會一個挨著一個擺放,可能很多人都對這一點習以為常,但這點是BFC幫助我們實現的。當我們對某個盒子設定一個margin-top的時候,BFC會幫助我們解析,然後會在盒子佈局時候給一個上邊距

  • 在一個BFC中,每個元素的左邊緣都會緊貼著包含塊的左邊緣

  • 在同一個BFC中,在垂直方向上,相鄰兩個盒子的margin會重疊,值取兩者中較大的(可以利用此特性解決margin重疊問題)

#作用1:利用BFC解決margin重疊問題
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box1 {
        height: 200px;
        width: 400px;
        background-color: orange;

        margin-bottom: 30px;
      }
      .box2 {
        height: 150px;
        background-color: purple;

        margin-top: 50px;
      }
    </style>
  </head>
  <body>
    <div></div>
    <div></div>
  </body>
</html>
登入後複製

此時box1和box1此時同處於html的BFC中,且box1和box2在垂直方向上相鄰,所以會出現margin重疊,取兩者其中較大的值50px

什麼是BFC?深入了解BFC,聊聊作用

如何解決呢? 可能很多人會想到直接為box1增加一個BFC,所以直接為box1加上個overflow:hidden屬性

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box1 {
        height: 200px;
        width: 400px;
        background-color: orange;

        margin-bottom: 30px;

        overflow: hidden;
      }
      .box2 {
        height: 150px;
        background-color: purple;

        margin-top: 50px;
      }
    </style>
  </head>
  <body>
    <div></div>
    <div></div>
  </body>
</html>
登入後複製

結果呢?

什麼是BFC?深入了解BFC,聊聊作用

發現並不起作用。或許此時很多人就懵了,box1此時不是明明已經形成了BFC了嘛,為什麼還會重疊?讓我來給你解釋一下,首先此時box1確實是已經形成了BFC(可以理解成box1內部形成了BFC),但是對於box1這個元素的本身,還是和box2同屬於html的BFC中,所以還是會發生margin重疊

所以我們要給box1套一層,然後給box1外層的盒子設定BFC

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      /* 给box1外层增加一个container盒子,并设置BFC */
      .container {
        overflow: hidden;
      }
      .box1 {
        height: 200px;
        width: 400px;
        background-color: orange;

        margin-bottom: 30px;
      }
      .box2 {
        height: 150px;
        background-color: purple;

        margin-top: 50px;
      }
    </style>
  </head>
  <body>
    <div>
      <div></div>
    </div>
    <div></div>
  </body>
</html>
登入後複製

此時box1屬於container的BFC,而box2屬於html的BFC,不屬於同一個BFC,所以就能解決margin重疊問題

什麼是BFC?深入了解BFC,聊聊作用

作用2:解决浮动高度塌陷问题

当我们给container里面的四个item设置浮动的时候,很明显,这几个元素都会脱离文档流,此时container不会有高度

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .container {
        background-color: orange;
      }

      .item {
        width: 400px;
        height: 200px;
        box-sizing: border-box;
        border: 1px solid #000;
        float: left;
        background-color: #f00;
      }
    </style>
  </head>
  <body>
    <div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>
  </body>
</html>
登入後複製

什麼是BFC?深入了解BFC,聊聊作用

很多网上博主说,通过给container设置一个BFC,内部的浮动元素就会向其汇报高度,然后container就能解决浮动高度塌陷问题,这个做法是正确的,但是这个说法其实是错误,并不是因为其内部的浮动元素向其汇报了高度

事实上,想通过BFC解决高度塌陷问题需要满足两个条件:

  • 浮动元素的父元素触发BFC,形成独立的块级格式化上下文(BFC)

  • 浮动元素的父元素高度为auto

首先我们先看一段W3C的描述

什麼是BFC?深入了解BFC,聊聊作用

大致意思为BFC的高度是auto情况下,高度是这样计算:

  • 如果只有inline-level,是行高的顶部和底部的距离
  • 如果有block-level,是有最底层的块上边缘和最底层块盒子的下边缘之间的距离(有margin也会计算在内)
  • 如果有绝对定位元素,将被忽略(所有我们无法通过BFC解决绝对定位的高度塌陷问题)
  • 如果有浮动元素,那么会增加高度以包括这些浮动元素的下边缘(这才是BFC能解决浮动元素塌陷问题的原因,并不是因为浮动元素向上汇报了高度)

所以我们直接给container通过添加overflow属性设置BFC,则由于上述第四条4特性,container会增加高度来包括内部四个item浮动元素下边缘,所以解决了浮动塌陷问题

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .container {
        background-color: orange;
        /* 通过overflow形成BFC */
        overflow: hidden;
      }

      .item {
        width: 400px;
        height: 200px;
        box-sizing: border-box;
        border: 1px solid #000;
        float: left;
        background-color: #f00;
      }
    </style>
  </head>
  <body>
    <div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>
  </body>
</html>
登入後複製

什麼是BFC?深入了解BFC,聊聊作用

(学习视频分享:web前端入门

以上是什麼是BFC?深入了解BFC,聊聊作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1253
24
vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

了解HTML,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

HTML,CSS和JavaScript的角色:核心職責 HTML,CSS和JavaScript的角色:核心職責 Apr 08, 2025 pm 07:05 PM

HTML定義網頁結構,CSS負責樣式和佈局,JavaScript賦予動態交互。三者在網頁開發中各司其職,共同構建豐富多彩的網站。

bootstrap怎麼寫分割線 bootstrap怎麼寫分割線 Apr 07, 2025 pm 03:12 PM

創建 Bootstrap 分割線有兩種方法:使用 標籤,可創建水平分割線。使用 CSS border 屬性,可創建自定義樣式的分割線。

bootstrap怎麼插入圖片 bootstrap怎麼插入圖片 Apr 07, 2025 pm 03:30 PM

在 Bootstrap 中插入圖片有以下幾種方法:直接插入圖片,使用 HTML 的 img 標籤。使用 Bootstrap 圖像組件,可以提供響應式圖片和更多樣式。設置圖片大小,使用 img-fluid 類可以使圖片自適應。設置邊框,使用 img-bordered 類。設置圓角,使用 img-rounded 類。設置陰影,使用 shadow 類。調整圖片大小和位置,使用 CSS 樣式。使用背景圖片,使用 background-image CSS 屬性。

bootstrap怎麼設置框架 bootstrap怎麼設置框架 Apr 07, 2025 pm 03:27 PM

要設置 Bootstrap 框架,需要按照以下步驟:1. 通過 CDN 引用 Bootstrap 文件;2. 下載文件並將其託管在自己的服務器上;3. 在 HTML 中包含 Bootstrap 文件;4. 根據需要編譯 Sass/Less;5. 導入定製文件(可選)。設置完成後,即可使用 Bootstrap 的網格系統、組件和样式創建響應式網站和應用程序。

bootstrap怎麼調整大小 bootstrap怎麼調整大小 Apr 07, 2025 pm 03:18 PM

要調整 Bootstrap 中元素大小,可以使用尺寸類,具體包括:調整寬度:.col-、.w-、.mw-調整高度:.h-、.min-h-、.max-h-

bootstrap按鈕怎麼用 bootstrap按鈕怎麼用 Apr 07, 2025 pm 03:09 PM

如何使用 Bootstrap 按鈕?引入 Bootstrap CSS創建按鈕元素並添加 Bootstrap 按鈕類添加按鈕文本

See all articles