淺析BFC佈局的概念以及作用

来源:https://www.cnblogs.com/kjz-jenny/archive/2018/08/04/9419755.html
-Advertisement-
Play Games

BFC的概念以及作用 BFC的定義: 直譯為 。它是一個獨立的渲染區域,只有Block level box參與, 它規定了內部的Block level Box如何佈局,並且與這個區域外部毫不相干。 我們常說的文檔流其實分為==定位流、浮動流和普通流==三種。而 其實就是指BFC中的FC。 是`for ...


BFC的概念以及作用

BFC的定義:

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

我們常說的文檔流其實分為==定位流、浮動流和普通流==三種。而普通流其實就是指BFC中的FC。
FCformatting context的首字母縮寫,直譯過來是格式化上下文,它是頁面中的一塊渲染區域,有一套渲染規則,決定了其子元素如何佈局,以及和其他元素之間的關係和作用。

通俗一點的方式解釋:

BFC 可以簡單的理解為某個元素的一個 CSS 屬性,只不過這個屬性不能被開發者顯式的修改,擁有這個屬性的元素對內部元素和外部元素會表現出一些特性,這就是BFC。

BFC的觸發條件

==滿足下列條件之一就可觸發BFC==

  • 【1】根元素,即HTML元素
  • 【2】float的值不為none
  • 【3】overflow的值不為visible
  • 【4】display的值為inline-block、table-cell、table-caption
  • 【5】position的值為absolute或fixed

    BFC佈局規則:

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

BFC佈局規則1:內部的Box會在垂直方向,一個接一個地放置。

我們平常說的盒子是由margin、border、padding、content組成的,實際上每種類型的四條邊定義了一個盒子,分別是分別是content box、padding box、border box、margin box,這四種類型的盒子一直存在,即使他們的值為0.決定塊盒在包含塊中與相鄰塊盒的垂直間距的便是margin-box。

BFC佈局規則2:Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊。

決定塊盒在包含塊中與相鄰塊盒的垂直間距的便是margin-box

BFC佈局規則3:每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反)。即使存在浮動也是如此。

<div class="parent">
    <div class="child"></div>
    //給這兩個子div加浮動,浮動的結果,如果沒有清除浮動的話,父div不會將下麵兩個div包裹,但還是在父div的範圍之內。
    <div class="child"></div>
</div>

解析:給這兩個子div加浮動,浮動的結果,如果沒有清除浮動的話,父div不會將下麵兩個div包裹,但還是在父div的範圍之內,左浮是子div的左邊接觸父div的borderbox的左邊,右浮是子div接觸父div的borderbox右邊,除非設置margin來撐開距離,否則一直是這個規則。

BFC佈局規則4:BFC的區域不會與float box重疊:

<div class="aside"></div>
<div class="text">
    <div class="main"></div>
</div>
<!--下麵是css代碼-->
 .aside {
            width: 100px;
            height: 150px;
            float: left;
            background: #f66;
        }
  .main {
            height: 200px;
            overflow: hidden;//觸發main盒子的BFC
            background: #fcc;
        }
  .text{
            width: 500px;
    }

上面aside盒子有一個浮動屬性,覆蓋了main盒子的內容,main盒子沒有清除aside盒子的浮動。只做了一個動作,就是觸發自身的BFC,然後就不再被aside盒子覆蓋了。所以:BFC的區域不會與float box重疊。

BFC有哪些作用:

  • 1.自適應兩欄佈局
  • 2.可以阻止元素被浮動元素覆蓋
  • 3.可以包含浮動元素——清除內部浮動
  • 4.分屬於不同的BFC時可以阻止margin重疊

    BFC作用1:自適應兩欄佈局

    還是上面的代碼,此時BFC的區域不會與float box重疊,因此會根據包含塊(父div)的寬度,和aside的寬度,自適應寬度。

    BFC 與 Layout

    IE 作為瀏覽器中的奇葩,當然不可能按部就班的支持 BFC 標準,於是乎 IE 中有了 Layout 這個東西。Layout 和 BFC 基本是等價的,為了處理 IE 的相容性,在需要觸發 BFC 時,我們除了需要用觸發條件中的 CSS 屬性來觸發 BFC,還需要針對 IE 瀏覽器使用 zoom: 1 來觸發 IE 瀏覽器的 Layout。

.parent {
            margin-top: 3rem;
            border: 5px solid #fcc;
            width: 300px;
        }
.child {
            border: 5px solid #f66;
            width:100px;
            height: 100px;
            float: left;
        }

BFC作用3:可以包含浮動元素——清除內部浮動

給父divparent加上 overflow: hidden;
清除浮動原理:觸發父div的BFC屬性,使下麵的子div都處在父div的同一個BFC區域之內,此時已成功清除浮動.
還可以向同一個方向浮動來達到清除浮動的目的,清除浮動的原理是兩個div都位於同一個浮動的BFC區域之中

BFC的作用4:阻止margin重疊:

當兩個相鄰塊級子元素分屬於不同的BFC時可以阻止margin重疊
操作方法:給其中一個div外麵包一個div,然後通過觸發外面這個div的BFC,就可以阻止這兩個div的margin重疊
<div class="aside"></div>
<div class="text">
    <div class="main"></div>
</div>
<!--下麵是css代碼-->
 .aside {
            margin-bottom: 100px;//margin屬性
            width: 100px;
            height: 150px;
            background: #f66;
        }
        .main {
            margin-top: 100px;//margin屬性
            height: 200px;
            background: #fcc;
        }
         .text{
            /*盒子main的外麵包一個div,通過改變此div的屬性使兩個盒子分屬於兩個不同的BFC,以此來阻止margin重疊*/
            overflow: hidden;//此時已經觸發了BFC屬性。
        }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉自:http://www.maomao365.com/?p=6973 摘要: 在sql腳本編寫中,如果需要在update delete 中使用表別名的方法,必須按照一定的規則編寫,否則將會出現相應的異常信息,如下所示: 實驗環境:sqlserver 2008 R2 ...
  • 1.顯示分區 show partitions tables; 2.SHELL里導出文件顯示欄位 set hive.cli.print.header ...
  • 最近我問了很多Java開發人員關於最近12個月內他們使用的是什麼大數據工具。 這是一個系列,主題為: 語言 web框架 應用伺服器 SQL數據訪問工具 SQL資料庫 大數據 構建工具 雲提供商 今天我們就要說說大數據。根據維基百科,大數據是數據集的一個廣義的術語,並且該數據集是如此龐大和複雜,以致於 ...
  • 一. 概述 通常來說,死鎖都是應用設計問題,通過調整業務流程,資料庫對象設計,事務大小,以及訪問資料庫的sql語句,絕大部分死鎖都可以避免,下麵介紹幾種避免死鎖的常用 方法. 1. 在應用中,如果不同的程式併發操作多個表,應儘量約定以相同的順序來訪問表,這樣可以大大降低產生死鎖的機會。按順序對錶進行 ...
  • 最早的寫法: 最新的寫法: 新的寫法比原始寫法性能高出太多(原語句執行會超時),最大的原因是對with語句理解有誤!!! ...
  • 在ES6之前,javascript只有全局作用域和函數作用域。所謂作用域就是一個變數定義並能夠被訪問到的範圍。也就是說如果一個變數定義在全局(window)上,那麼在任何地方都能訪問到這個變數,如果這個變數定義在函數內部,那麼就只能在函數內部訪問到這個變數。 全局作用域只要頁面沒關閉就會一直存在,而 ...
  • 不知道從什麼時候開始,單頁網站就悄悄走進人們的視線,尤其是國外的網站,更是鐘愛單頁網站.製作一個全屏滾動的效果,然後每個滾動頁弄一個好看的背景色,配上一些描述性的文字,大家都喜歡這麼弄,仿佛逼格瞬間可以爆表似的.當然,不得不承認,介紹產品的頁面用單頁網站似乎確實高大上的多.在站長之家看到一篇文章,讓... ...
  • 本篇目錄: 1.截取指定位元組數的字元串 2.判斷是否微信 3.獲取時間格式的幾個舉例 4.獲取字元串位元組長度 5.對象克隆、深拷貝 6.組織結構代碼證驗證 7.身份證號驗證 8.js正則為url添加http標識 9.URL有效性校驗方法 10.自定義jsonp方法 11.cookie操作 12.生成 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...