BFC深入理解

来源:http://www.cnblogs.com/Uncle-Keith/archive/2016/12/10/6158136.html
-Advertisement-
Play Games

BFC 在上一篇文章中, "清除浮動方法解析" ,我們談及了一些使用css屬性解決浮動帶來的影響。但是在解決浮動帶來的影響的方法中,如果細心思考,會產生如下疑問: 為什麼 可以清除浮動帶來的影響? 能否用其他css屬性清除浮動帶來的影響? 種種的疑問,會讓你覺得CSS真的不容易精通,說精通過於高大上 ...


BFC

在上一篇文章中,清除浮動方法解析,我們談及了一些使用css屬性解決浮動帶來的影響。但是在解決浮動帶來的影響的方法中,如果細心思考,會產生如下疑問:

  • 為什麼overflow可以清除浮動帶來的影響?
  • 能否用其他css屬性清除浮動帶來的影響?

種種的疑問,會讓你覺得CSS真的不容易精通,說精通過於高大上,就連掌握都挺難的。

清除浮動方法解析文章中,只是稍微說明瞭一下上面兩個問題的原因是BFC(塊級格式化上下文,Block Formatting Contexts)。在分享BFC之前,有必要談談另外一個概念。也就是可視化格式模型

可視化格式模型

我們知道,CSS元素可分為兩種,塊級元素和行內元素。塊級元素顯示為塊內容,對應著CSS元素框的‘塊框’。行內元素顯示在一行中,對應著CSS元素框的‘行內框’。

塊框在DOM中從上到下一個接一個地垂直排列,每一個塊框之間地垂直距離由框的垂直外邊距決定。如果在某個div內定義了一段純文本,此時這段純文本會被包含在匿名塊框內。

行內框在DOM中從左到右一個接一個地水平排列,由一行形成的水平框稱為行框,行框的高度總是足以容納它包含的所有行內框。行內框(行內元素)可以通過水平paddingbordermargin來改變兩兩行內框的水平間距。但是,垂直borderpaddingmargin不影響兩兩行內框的垂直間距,同時垂直方向不占據任何空間。如果想要改變行內框(行內元素)的高度,可以使用line-height來改變。
line-heignt主要用於控制行框的高度。

看個圖示。上為水平,下為垂直。

水平距離改變,垂直border不占據空間,因此擋住了文字。

W3school中指出,display屬性可以規定某個元素生成框的類型。比如說,將某個行內元素設置display:block,此時,行內元素對應的行內框因為display屬性的影響,行內框變成了塊框,即行內元素可以擁有像塊級元素一樣的特性。

BFC(Block Formatting Context,塊級格式化上下文)

知道可視化格式模型之後,我們來談談BFC。

我理解的BFC,其實就像一個隱藏技能,這種隱藏的技能是被動的,需要通過其他技能的使用才能發揮它的作用。在CSS中,BFC其實就是一個隱藏屬性,這種隱藏屬性需要其他特定的CSS屬性定義之後才會被觸發。當觸發了BFC這個隱藏屬性之後,就可以解決一系列的問題。

從可視化格式模型上來說,每一個塊框都可以看成是一個擁有隱藏的BFC屬性,在DOM中從上到下垂直排列,塊框之間的距離由外邊距決定。

普通文檔流的父級塊框就是自帶隱藏BFC屬性的,不同的塊框可能會在內部產生塊級格式化上下文。

觸發BFC的條件:

  • 父級塊框自帶隱藏BFC屬性
  • 浮動元素
  • 絕對定位元素(包括absolutefixed
  • 框類型display為:inline-block|table-cell|table-caption
  • overflow屬性為hidden|auto|scroll

BFC可以解決的問題:

1.(BFC與margin)同一個父級塊框下,兄弟元素和父子元素的margin會發生重疊問題

2.(BFC與float)父元素高度塌陷問題、兄弟元素覆蓋問題

BFC與margin

margin重疊的解決方法:讓元素處於不同的BFC屬性環境下。

兄弟元素

在同一個父級塊框下,兄弟元素和父子元素的margin會發生重疊,並且這種重疊會遵循一定得規則:同號取大,異號相加。具體可以看看關於margin的介紹。傳送門:CSS margin

兄弟元素的margin重疊的解決方法:任一個兄弟元素的屬性設置如下:

float:left|right或者position:absolute|fixed或者display:inline-block|table-cell|table-caption

父子元素

父子元素的margin重疊解決方法:父元素設置以下任意屬性:overflow:hidden|auto|scroll,或者給父元素設置paddingborder屬性。

如果元素沒有垂直border或者padding,那麼父元素的高度就是它包含的子元素的頂部和底部邊框邊緣之間的距離。因此,包含的子元素的頂部和底部外邊距就突出到容器元素的外邊。因此,可以通過添加垂直border或者padding,外邊距就不會疊加了,而且父元素的高度就是它包含的子元素的頂部和底部外邊距邊緣之間的距離。

.father { 
    backgrund:blue;
    width:500px;
    height:50px;
    margin-top:15px;
    overflow:hidden; //padding:1px;  //border:1px solid green;
}
.child {
    height:30px;
    width:500px;
    background:pink;
    margin-top:15px;    
}


BFC與浮動

兄弟元素

在兩個兄弟元素a和b中,如果a元素設置了float屬性,b元素的佈局會受到影響,此時a元素會覆蓋在b元素上,如果b元素存在文字,那麼文字會環繞a元素顯示。

<div class="float"></div>
<div class="clearfloat">
    沒有設置overflow:hidden|auto|scroll;沒有設置overflow:hidden|auto|scroll;沒有設置overflow:hidden|auto|scroll;
</div>

<div class="float"></div>
<div class="clearfloat">
    設置overflow:hidden|auto|scroll設置overflow:hidden|auto|scroll設置overflow:hidden|auto|scroll空空空空補充內容
</div>

使其中一個兄弟元素觸發BFC之後就不會被其浮動元素覆蓋,使用這種float+overflow的方式可以實現一側固定,一側自適應的佈局效果。

父子元素

BFC與浮動如果針對父子元素,當然是解決父元素高度塌陷的問題了。

在W3C中指出 'Auto' heights for block formatting context roots。

也就是BFC會根據子元素的情況自動適應高度,即使其子元素中包括浮動元素。

給父元素設置以下任意屬性,觸發BFC隱藏屬性: overflow:hidden|auto|scrollposition:absolutefloat:left|rightdisplay:inline-block

父元素觸發BFC隱藏屬性前

父元素觸發BFC隱藏屬性後




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

-Advertisement-
Play Games
更多相關文章
  • 合理運用向上造型 ,能夠減少代碼量,優化代碼.總結如下: 1,向上造型 類型提升,自動類型轉換 基本類型自動類型轉換 byte → short → int → long → float → double ↑ char 引用類型自動類型轉換(向上造型) 小類型 → 自動轉換 → 大類型 //父類引用調 ...
  • 相關知識自行搜索,直接上乾貨。。。 使用的資源: nginx主伺服器一臺,nginx備伺服器一臺,使用keepalived進行宕機切換。 tomcat伺服器兩台,由nginx進行反向代理和負載均衡,此處可搭建伺服器集群。 redis伺服器一臺,用於session的分離共用。 nginx主伺服器:19 ...
  • HTTP API介面安全設計 API介面調用方式 HTTP + 請求簽名機制 HTTP + 參數簽名機制 HTTPS + 訪問令牌機制 有沒有更好的方案? OAuth授權機制 OAuth2.0服務的幾種授權流程 ... ...
  • 這個小案例主要是對transform的應用。 時鐘的3個表針分別是3個png圖片,通過setInterval來讓圖片轉動。時,分,秒的轉動角度分別是30,6,6度。 首先,通過new Date函數獲取當前時間,通過date.getSeconds(),date.getMinutes(),date.ge ...
  • js的this是什麼?關於這個東西,博客園裡面有太多的解釋了,不過,本人看了一下,感覺對this解釋的有點複雜了,因此,本人在此給this一個簡單易於理解的定義。 this其實是js的一個對象,至於是什麼對象呢?很簡單,this這個對象就是:誰調用它它就指向誰。 關於這一點,其實,博客園的文章已經說 ...
  • 想給訂閱號做一個網頁,如果進入後發現沒關註微信公眾號就提示關註。但是微信對訂閱號做了限制,無論是否認證都是不能網頁授權獲取用戶信息的,這就給網頁內直接判斷用戶是否關註該訂閱號造成了困難。 解決這個問題通過另一個網站授權或認證的服務號間接完成以下以認證的服務號為例說明下如何在網頁中判斷訂閱號是否被關註 ...
  • 一、獲取內聯樣式 在這種情況下,獲取和設置樣式只靠style屬性就可以,因為element.style屬性返回的是類似數組的一組樣式屬性及對應值,因此訪問具體樣式的時候可以採取兩種方式即“ele.style.屬性名稱”和“ele.style['屬性名稱']”。但是,要註意的是,針對css樣式里bac ...
  • 眼看就要期末了,我的專業課也迎來了第二次的期末作業 《網上購物系統》。雖然老師的意圖是在鍛煉我們後臺的能力,但是想著還是不利用網上的模板,準備自己寫,以來別人寫的靜態頁看不懂,再著可以鍛煉自己做網頁的能力。所以趁有點小進展就想分享自己的作業進展狀態。下麵是我頁面運行的截圖。 可能粘貼的圖片沒有任何的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...