CSS佈局基礎——BFC

来源:http://www.cnblogs.com/yzg1/archive/2016/07/14/5670684.html
-Advertisement-
Play Games

what's BFC? 第一次看到這個名詞,我是拒絕的,css什麼時候還有這個東西?於是迫不及待的google了一下,才發現原來它無時無刻不在我們的css當中,只不過它並不是一個屬性,不需要我們平常使用手寫罷了。但是它的重要性確是杠杠的,可以這麼說,沒有它就就沒有什麼css佈局。 BFC,全稱 Bl ...


what's BFC?

第一次看到這個名詞,我是拒絕的,css什麼時候還有這個東西?於是迫不及待的google了一下,才發現原來它無時無刻不在我們的css當中,只不過它並不是一個屬性,不需要我們平常使用手寫罷了。但是它的重要性確是杠杠的,可以這麼說,沒有它就就沒有什麼css佈局。
BFC,全稱 Block Formatting Context,翻譯成塊級格式化上下文,它就是一個環境,HTML元素在這個環境中按照一定規則進行佈局。一個環境中的元素不會影響到其它環境中的佈局。

看一大堆文字可能有點抽象,現在拿個js函數來比喻說明一下吧,我們現在有一個叫做bfc的函數,而一個函數就是一個塊級作用域,這裡面所有的變數申明、運行都在這個塊級作用域內進行。理所當然,一個環境中的變數不會影響到其它環境變數。

var box =1;
function bfc(){
    var box = "2";
    console.log(box);
}
bfc();//2
console.log(box)//1

所以,我們是不是可以這樣理解:所謂的BFC就是css屬性的執行域?

BFC的生成

既然js可以通過函數等方法來實現塊級作用域,我想那css肯定也是可以通過一些手段來實現BFC的。
這裡BFC的官方文檔寫到:

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.

從這段描述可以清楚知道,以下方法可以創建一個新的塊級執行上下文(BFC):

  1. 浮動元素、
  2. 絕對定位元素,
  3. 塊級元素以及塊級容器(比如inline-block、table-cell、table-capation)
  4. overflow值不為visible的塊級盒子

當然,root元素會自動生成一個BFC,這個應該很好理解,畢竟需要一個根BFC來佈局

執行規則

既然存在了執行環境,那肯定會存在執行規則。BFC的

1.在一個塊級排版上下文中,盒子是從包含塊頂部開始,垂直的一個接一個的排列的。每個盒子的左外邊是觸碰到包含塊的左邊的(對於從右向左的排版,則相反)

這個應該不難理解。就是我們如果在里寫幾個<div>,它會依次垂直排列,並且都是在頁面的最左邊(對於從右向左的排版,則相反)。

2.相鄰兩個盒子之間的垂直的間距是被margin屬性所決定的,在一個塊級排版上下文中相鄰的兩個塊級盒之間的垂直margin是摺疊的。

這句描述是不是超級熟悉,這不是我css常見的邊距摺疊問題嗎?現在知道它出自哪裡了吧,就是這裡。下麵的倆個盒子各有上下20px的間距,加起來應該有40px,但顯然,現在只有20px;

<style>
.top{
    width:100px;
    height:100px;
    background:#000;
    margin:20px 0;
}
.bottom{
    width:100px;
    height:100px;
    background:#000;
    margin:20px 0;
}
</style>
<div  class="top"></div>
<div  class="bottom"></div>
發生邊距摺疊是因為同一個BFC的關係(根BFC)。既然知道原因,解決就好辦了,讓他們倆個不在同一個BFC就ok啦。

3. BFC就是頁面上的一個隔離的獨立容器,容器裡面的子元素不會影響到外面的元素。

通過這條屬性,我們又可以想到哪些呢。對,浮動元素的塌陷問題。我們知道,一個元素中的子元素浮動了,這個父元素就會發生高度塌陷問題。下例中一旦內部的紅色元素浮動,藍色的盒子就無法被撐起,高度會變成0。

<style>
.wrap{
    width:150px;
    background:#ADD9E6;
    margin:20px 0;
}
.in{
    width:100px;
    height:100px;
    background:#FFCCCC;
    margin:20px 0;
    //float:left;
}
</style>
<div class="wrap"><div class="in"></div></div>

現在我們知道了,這是因為浮動元素創建了一個新的BFC,成為了一個獨立的容器,不會影響到外面的父元素了。它的定位規則不再受制於這個父元素了。如何解決這一問題?我們知道只要在在父元素加上overflow:hidden可以清除浮動。但是這又是為什麼?

其實,這就是前面提到的overflow:hidden可以生成一個新的BFC,而這個浮動的子元素,被它所包含了,從而成為一個獨立容器,它的float外溢不了了,外面的元素不再受其浮動的影響,從而達到了清除浮動的作用。


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

-Advertisement-
Play Games
更多相關文章
  • 1. 1 char array1[100]; 2 char* array2; 二者都可以當指針用,使用時有何區別? 1中字元數組,存儲於棧區,sizeof(array1)為100,aray1代表首元素首地址,不可以被賦值,array1[0]這樣可以被賦值,數組大小確定,難以擴容 2中存儲於字元常量區 ...
  • Struts2 總結 1.控制器採用的是 Filter 這個伺服器端組件,相比於 Servlet ,Servlet 能獲取到的資源,Filter 也同樣能獲取到,不同的是 Filter 生命周期初始化和 Servlet 有所區別。 2.Struts2 使用 Filter 和 Interceptors ...
  • 包裝類分為三節來介紹,本節主要介紹基本用法和共同點:與基本類型的相互轉換、裝箱/拆箱、重寫的Object方法、Comparable介面、與String的相互轉換、常用常量、Number、以及不可變性 ... ...
  • 1.激活Tomcat的defaultServlet來處理靜態文件,web.xml配置 a.說到了這裡另外說說url-pattern的配置 2.springmvc處理,spring-mvc.xml配置 3.會把"/**" url,註冊到SimpleUrlHandlerMapping的urlMap中,把 ...
  • 1.本次用到的控制項資料 按鈕組作為翻頁按鈕 : http://v3.bootcss.com/components/#btn-groups-single 2.工程地址:https://github.com/digitalClass/web_page 網站發佈地址: http://115.28.30.2 ...
  • 今天自己寫個樓層效果,有一點煩躁,小地方犯錯誤。各位大神來修改不足啊!!! ...
  • 一、特殊性規則 選擇器的特殊性由選擇器本身的組件確定;特殊性由四個部分組成,其初始值為0,0,0,0。 1. 對於選擇器中的每一個id,加0,1,0,0; 2. 對於選擇器中的每一個類、偽類、屬性選擇,加0,0,1,0; 3. 對於選擇器中的每一個元素、偽元素,加0,0,0,1; 4. 結合符與通配 ...
  • 一、要點: 1.頁面載入時,圖片重合,疊在一起[絕對定位]; 2.第一張顯示,其它隱藏; 3.設置下標,給下標設置顏色讓它隨圖片移動; 4.滑鼠移動到圖片上去,顯示左右移動圖標,滑鼠移走,繼續輪播; 二、實現代碼: html代碼: css代碼: js代碼: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...