bfc

  BFC 已經是一個耳聽熟聞的詞語了,網上有許多關于 BFC 的文章,介紹了如何觸發 BFC 以及 BFC 的一些用處(如清浮動,防止 margin 重疊等)。雖然我知道如何利用 BFC 解決這些問題,但當別人問我 BFC 是什么,我還是不能很有底氣地解釋清楚。于是這兩天仔細閱讀了CSS2.1 spec 和許多文章來全面地理解BFC。

一、BFC是什么?

  在解釋 BFC 是什么之前,需要先介紹 Box、Formatting Context的概念。

  Box: CSS布局的基本單位

  Box 是 CSS 布局的對象和基本單位, 直觀點來說,就是一個頁面是由很多個 Box 組成的。元素的類型和 display 屬性,決定了這個 Box 的類型。 不同類型的 Box, 會參與不同的 Formatting Context(一個決定如何渲染文檔的容器),因此Box內的元素會以不同的方式渲染。讓我們看看有哪些盒子:

  • block-level box:display 屬性為 block, list-item, table 的元素,會生成 block-level box。并且參與 block fomatting context;
  • inline-level box:display 屬性為 inline, inline-block, inline-table 的元素,會生成 inline-level box。并且參與 inline formatting context;
  • run-in box: css3 中才有, 這兒先不講了。

  Formatting context

  Formatting context 是 W3C CSS2.1 規范中的一個概念。它是頁面中的一塊渲染區域,并且有一套渲染規則,它決定了其子元素將如何定位,以及和其他元素的關系和相互作用。最常見的 Formatting context 有 Block fomatting context (簡稱BFC)和 Inline formatting context (簡稱IFC)。

  CSS2.1 中只有?BFC?和?IFC,?CSS3?中還增加了?GFC?和?FFC。

  BFC 定義

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

  BFC布局規則:

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

二、哪些元素會生成BFC?

  1. 根元素
  2. float屬性不為none
  3. position為absolute或fixed
  4. display為inline-block, table-cell, table-caption, flex, inline-flex
  5. overflow不為visible

三、BFC的作用及原理

  1. 自適應兩欄布局

  代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<style>
????body {
????????width: 300px;
????????position: relative;
????}
????.aside {
????????width: 100px;
????????height: 150px;
????????float: left;
????????background:?#f66;
????}
????.main {
????????height: 200px;
????????background:?#fcc;
????}
</style>
<body>
????<div?class="aside"></div>
????<div?class="main"></div>
</body>

  頁面:
  

  根據BFC布局規則第3條:

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

  因此,雖然存在浮動的元素aslide,但main的左邊依然會與包含塊的左邊相接觸。

  根據BFC布局規則第四條:

BFC的區域不會與float box重疊。

  我們可以通過通過觸發main生成BFC, 來實現自適應兩欄布局。

1
2
3
.main {
????overflow: hidden;
}

  當觸發main生成BFC后,這個新的BFC不會與浮動的aside重疊。因此會根據包含塊的寬度,和aside的寬度,自動變窄。效果如下:

  

  2. 清除內部浮動

  代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<style>
????.par {
????????border: 5px solid?#fcc;
????????width: 300px;
????}
????.child {
????????border: 5px solid?#f66;
????????width:100px;
????????height: 100px;
????????float: left;
????}
</style>
<body>
????<div?class="par">
????????<div?class="child"></div>
????????<div?class="child"></div>
????</div>
</body>

  頁面:
  

  根據BFC布局規則第六條:

計算BFC的高度時,浮動元素也參與計算

  為達到清除內部浮動,我們可以觸發par生成BFC,那么par在計算高度時,par內部的浮動元素child也會參與計算。

  代碼:

1
2
3
.par {
????overflow:?hidden;
}

  效果如下:
  ??

  3. 防止垂直 margin 重疊

  代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<style>
????p {
????????color:?#f55;
????????background:?#fcc;
????????width:?200px;
????????line-height:?100px;
????????text-align:center;
????????margin:?100px;
????}
</style>
<body>
????<p>Haha</p>
????<p>Hehe</p>
</body>

  頁面:
  

  兩個p之間的距離為100px,發送了margin重疊。
  根據BFC布局規則第二條:

Box垂直方向的距離由margin決定。屬于同一個BFC的兩個相鄰Box的margin會發生重疊

  我們可以在p外面包裹一層容器,并觸發該容器生成一個BFC。那么兩個P便不屬于同一個BFC,就不會發生margin重疊了。
  代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<style>
????.wrap {
????????overflow: hidden;
????}
????p {
????????color:?#f55;
????????background:?#fcc;
????????width: 200px;
????????line-height: 100px;
????????text-align:center;
????????margin: 100px;
????}
</style>
<body>
????<p>Haha</p>
????<div?class="wrap">
????????<p>Hehe</p>
????</div>
</body>

  效果如下:
  

總結

  其實以上的幾個例子都體現了BFC布局規則第五條:

BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此。

  因為BFC內部的元素和外部的元素絕對不會互相影響,因此, 當BFC外部存在浮動時,它不應該影響BFC內部Box的布局,BFC會通過變窄,而不與浮動有重疊。同樣的,當BFC內部有浮動時,為了不影響外部元素的布局,BFC計算高度時會包括浮動的高度。避免margin

本文出處【http://www.cnblogs.com/lhb25/】

?

以下來源于《HTML 5 移動Web開發實戰詳解》 林瓏 著

BFC的元素可以當做一個密閉的大箱子,箱子外部的元素不與箱子內部的元素產生作用,此時在這個BFC元素內的元素有如下的特征:
1、外邊距將不再與上下文之外的元素折疊
2、其內可以包含浮動元素
3、可以組織浮動元素被覆蓋
4、框會一個接一個地被垂直放置,它們的起點是一個包含快的頂部。即,BFC中的文字將不會環繞鄰接的浮動盒子排布,而是豎直排布,因為行框將會一個接一個的垂直放置

如何觸發BFC:
1、浮動元素,浮動元素本身形成一個BFC
2、絕對定位元素
3、行內塊元素(display:inline-block)
4、表格單元格和標題(display:table-cell或display:table-caption)
5、overflow為非visible的元素

轉載于:https://www.cnblogs.com/wpbars/p/5955033.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457148.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457148.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python語法異常 Exception

常見異常&#xff1a;Exception 所有異常的基類AttributeError 特性應用或賦值失敗時引發IOError 試圖打開不存在的文件時引發IndexError 在使用序列中不存在的索引時引發KeyError …

Python的Django框架中forms表單類的使用方法詳解

Form Form的驗證思路 前端&#xff1a;form表單 后臺&#xff1a;創建form類&#xff0c;當請求到來時&#xff0c;先匹配&#xff0c;匹配出正確和錯誤信息。 Django的Form驗證實例&#xff1a; 創建project&#xff0c;進行基礎配置文件配置 settings.py settings.py之…

java讀取gpx文件,從Leaflet導出GPX文件

我想要做的是讓用戶通過選擇Leaflet中的一些GeoJson功能來創建GPX文件 . 我這樣做的方法是創建一個新的GeoJson圖層來存儲所選的特征&#xff0c;然后用一個名為togpx(https://github.com/tyrasd/togpx)的插件將其轉換為gpx . 現在我有一個gpx文件&#xff0c;但我沒有t know h…

Mono Compatibility

The easiest way to describe what Mono currently supports is:Everything in .NET 4.5 except WPF, WWF, and with limited WCF and limited ASP.NET 4.5 async stack. System.Web and WCF are candidates for ‘almost immediate’ porting from the .NET reference source …

Python的Django框架中forms表單類的使用方法詳解2

用戶表單是Web端的一項基本功能,大而全的Django框架中自然帶有現成的基礎form對象,本文就Python的Django框架中forms表單類的使用方法詳解。 Form表單的功能 自動生成HTML表單元素檢查表單數據的合法性如果驗證錯誤&#xff0c;重新顯示表單&#xff08;數據不會重置&#xf…

生動形象的理解API是如何工作的!

API(Application Programming Interface,應用程序編程接口) 簡單來說&#xff0c;就是其他人開發出來一塊程序&#xff0c;你想用&#xff0c;他會告訴你調用哪個函數&#xff0c;給這個函數傳什么參數&#xff0c;然后又會返回給你一個什么樣的結果&#xff0c;你不需要知道他…

ann matlab,人工神經網絡ann及其matlab仿真.ppt

人工神經網絡ann及其matlab仿真人工神經網絡 的研究方法及應用劉 長 安2004. 12. 31 引 言 利用機器模仿人類的智能是長期以來人們認識自然、改造自然和認識自身的理想。 研究ANN目的&#xff1a; (1)探索和模擬人的感覺、思維和行為的規律&#xff0c;設計具有人類智能的計算機…

字符串與樹的結合

https://leetcode.com/problems/scramble-string/?tabDescription 雖然題目不常見&#xff0c;但是里面關于字符串調轉和遞歸的思路&#xff0c;還是很有代表性的。 https://discuss.leetcode.com/topic/14337/share-my-4ms-c-recursive-solution/2 這個解法也把里面關于遞歸的…

ubuntu 安裝過程所需軟件

ubuntu 開發過程好用的軟件 Remarkable 一個用于書寫文檔的好工具&#xff0c;包括方便書寫數學公式。安裝過程 點擊上面“remarkable”下載.deb文件&#xff0c;然后雙擊會跳轉到ubuntun的軟件安裝中心&#xff0c;點擊install進行安裝。 sublime text3 配置 自定義快捷鍵Pref…

Day05-循環和列表字符串、元組和字典

一、字符串 字符串就是由若干個不同的unicode字符組成的不可變序列 1 .字符串創建 #單引號字符串 str1 天要下雨&#xff0c;娘要嫁人&#xff0c;由他去吧 str2 str() #空串 str3 str([10,20,30]) ? #雙引號字符串 str2 "天要下雨&#xff0c;娘要嫁人&#xff…

@查看MySQL版本的方法

1.在終端下:mysql -V. [rootlocalhost bin]# mysql -V; mysql Ver 14.14 Distrib 5.6.21, for Linux (x86_64) using EditLine wrapper [rootlocalhost bin]# mysql -v; ERROR 1045 (28000): Access denied for user rootlocalhost (using password: NO) 注意&#xff0c;這…

echarts 柱狀圖 ,顏色和顯示設置

最近在使用echart開發圖標&#xff0c;api里面雖然有些設置&#xff0c;但是如果想讓柱狀圖每個柱的顏色都不相同&#xff0c;簡單的通過color設置是沒有作用的&#xff0c;這里&#xff0c;就要用到其他的方式了 下面只是列舉下我認為比較常用的&#xff0c;其他的比較簡單&am…

Pycharm 專業版 導入系統pip安裝的包

Pycharm 專業版 導入系統pip安裝的包 在setting 中找到project interpeter ,點擊設置圖標&#xff0c;點擊Add&#xff0c;得到如圖所示選擇 System Interpreter即可,這樣 用pip安裝的包都加再進來了

nodejs express

2019獨角獸企業重金招聘Python工程師標準>>> 創建express服務器 //app.js文件 var express require(express); var app express(); //指定更目錄顯示的內容 app.get(/, function(req, res){ res.send(Hello World); }); //指定監聽端口 var server app.listen(…

JS常見知識點

1、寫一個按照下面方式調用都能正常工作的 sum 方法 console.log(sum(2,3)); // Outputs 5 console.log(sum(2)(3)); // Outputs 5 解決方案 function sum() {var fir arguments[0];if (arguments.length 2) {return arguments[0] arguments[1]} else {return function (sec…

格雷碼 matlab,基于格雷碼的結構光重建代碼(MATLAB版本)

【實例簡介】該代碼為brown university相關技術人員編寫&#xff0c;旨在用于學習研究3D結構光的原理、算法實現和應用。由于原有的網站( http://mesh.brown.edu/byo3d/index.html )近期無法訪問&#xff0c;為了便于3D愛好者可以方便學習相關內容&#xff0c;特將該網站部分代…

Day06-函數

函數 一、集合&#xff08;set) 特點:不允許有重復元素&#xff0c;如果添加重復元素&#xff0c;則會自動過濾&#xff0c;可以進行交集、并集的運算。 本質&#xff1a;無序且無重復元素的數據結構 1 創建集合 s1 set() #空集合 不能是{}&#xff0c;這是字典 s2 {1…

在TextView中實時顯示數據

//下面實時更新顯示在textView中的數據handler new Handler();runnable new Runnable(){Overridepublic void run(){// TODO Auto-generated method pushupTextView.setText(Integer.toString(Number.pushup_number)); handler.postDelayed(this, 1000); }}; handle…

DuangDuangDuang!碼云項目的 Readme.md 特殊技能

為什么80%的碼農都做不了架構師&#xff1f;>>> 我們在 碼云 上創建新項目的時候&#xff0c;常常會看到默認使用 README 文件初始化該項目&#xff08;如圖1 所示&#xff09;&#xff0c;然后在新建項目的根目錄下就會生成一個 README.md 文件&#xff08;如圖2 …

java sunjce,無法初始化類javax.crypto.SunJCE_b

我已經開發了一個Javaservlet應用程序&#xff0c;并且在我的開發PC上&#xff0c;一切正常&#xff0c;包括按計劃使用SFTP通過端口8443等上的HTTPS并以適當的SSL證書通過PDF復制PDF。但是&#xff0c;當我嘗試在實時服務器上運行該應用程序時&#xff0c;會收到錯誤消息。jav…