什麼是BFC?對bfc的簡單理解

零下一度
發布: 2017-07-02 09:38:13
原創
12024 人瀏覽過

引子

在講BFC之前,先來看看一個範例

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     
 <meta charset="UTF-8"> 5     <title>BFC</title> 6     
 <style type="text/css"> 7         
 .div1 {background-color: #FCE38A; width: 200px; height: 100px;} 8         
 .div2 {background-color: #EAFFD0; width: 200px; height: 100px;} 9         
 .div3 {background-color: #95E1D3; width: 200px; height: 100px;}10     
 </style>11 </head>12 13 <body>14     <div class="div1">div1</div>15     
 <div class="div2">div2</div>16     <div class="div3">div3</div>17 </body>18 
 </html>
登入後複製

可以看到,區塊級元素的排列順序是從上往下,即使所在行的寬度可以容納多個元素,現在同時為div1與div2添加外邊距

##本來div1的下邊距為50px,div2的上邊距為50px,依道理他們之間的距離應為100px才對,可是這裡卻只有50px了,這是因為在一個區塊級排版上下文中相鄰的兩個塊級盒子之間的垂直margin是折疊的,也就是在

CSS學習筆記07 盒子模型中介紹過的外邊距合併,那如何解決這種外邊距合併的現象呢,這就牽涉到下面要介紹的BFC了。

什麼是BFC

Block Formatting Contexts 即區塊級格式化上下文,它是一個獨立的渲染區域,只有Block-level box參與, 它規定了內部的Block-level Box(display 屬性為block, list-item, table 的元素)如何佈局,並且與這個區域外部毫不相干。其中 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來對整個頁面進行佈局,在沒有建立一個新的BFC的時候,整個文件就這一個BFC。

BFC的規則

  • 內部的box會在垂直方向,從頂部開始一個接著一個地放置(上面的例子可以看出)

  • 同一個BFC中,在兩個相鄰的區塊級元素中,垂直margin會發生折疊

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

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

  • BFC就是頁面上的一個隔離的獨立容器,容器裡面的子元素不會影響到外面的元素,反之亦然

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

#觸發BFC

  • 根元素

  • float屬性不為none(如:left | right)

  • overflow的值不為visible(如:hidden | auto | scroll)

  • #display屬性值為inline-block | flex | inline-flex | table-cell | table-caption

  • position為absolute或fixed

#應用BFC

解決margin疊加問題

還是上面的那個例子,因為此時頁面的元素的在一個標準流中,所以這個時候body元素就是一個BFC,根據規則

同一个BFC中,在两个相邻的块级元素中,垂直margin会发生折叠
登入後複製
現在給div1設定display:inline-block屬性

此時由於div1元素透過display:inline-block觸發了BFC,此時的div1就是一個獨立的BFC了,根據規則

BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然
登入後複製
所以這時候就不會發生margin重疊了。

清除內部浮動

當一個標準流中的盒子中所有的子元素都進行了浮動,並且沒有給盒子設置高度時,那麼這個盒子的整個高度就會塌陷,什麼意思呢,看下面的例子

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>BFC清除内部浮动</title> 6     <style type="text/css"> 7         .child {background-color: #95E1D3; border: 1px solid #FCE38A; width: 100px; height: 100px;} 8         .parent {width: 300px; border: 1px solid #95E1D3;} 9     </style>10 </head>11 <body>12     <div class="parent">13         <div class="child"></div>14         <div class="child"></div>15     </div>16 </body>17 </html>
登入後複製

#父容器的被兩個子div撐起來了,現在給child添加浮動

這個時候,父容器變成了2條重合的線了,也就是高度變成0了,也就是所說的高度塌陷。根據規則

计算BFC的高度时,浮动元素也参与计算
登入後複製

这时候可以触发parent生成BFC,那么parent在计算高度时,parent内部的浮动元素child也会参与计算

布局

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>BFC布局</title> 6     <style type="text/css"> 7         .left {width: 100px; height: 100px; background-color: #FCE38A; float: left;} 8         .right {width: 300px; height: 150px; background-color: #95E1D3;} 9 10     </style>11 </head>12 <body>13     <div class="left"></div>14     <div class="right"></div>15 </body>16 </html>
登入後複製

根据规则

每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反),即使存在浮动也是如此
登入後複製

所以即使left设置了左浮动,right的的左边依然会与包含块的左边(即body)相接触。接着我们可以根据规则

BFC的区域不会与float box重叠
登入後複製

让right触发产生BFC,这样right就不会与left重叠了

这样就形成了常见的两列布局。

总之记住一点BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,同样的,外面的元素也不会影响到容器里面的子元素。

以上是什麼是BFC?對bfc的簡單理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!