BFC與IFC學習筆記

BFC是什么

BFC全稱是Block Formatting Context,即塊格式化上下文。它是CSS2.1規(guī)范定義的,關于CSS渲染定位的一個概念。

視覺格式化模型

視覺格式化模型(visual formatting model)是用來處理文檔并將它顯示在視覺媒體上的機制,它也是CSS中的一個概念。

視覺格式化模型定義了盒(Box)的生成,盒主要包括了塊盒、行內盒、匿名盒(沒有名字不能被選擇器選中的盒)以及一些實驗性的盒(未來可能添加到規(guī)范中)。盒的類型由display屬性決定。

塊盒(block box)

  • 當元素的CSS屬性displayblocklist-itemtable時,它是塊級元素 block-level;
  • 視覺上呈現為塊,豎直排列;
  • 塊級盒參與(塊格式化上下文);
  • 每個塊級元素至少生成一個塊級盒,稱為主要塊級盒(principal block-level box)。一些元素,比如<li>,生成額外的盒來放置項目符號,不過多數元素只生成一個主要塊級盒。

行內盒(inline box)

  • 當元素的CSS屬性display的計算值為inline,inline-blockinline-table時,稱它為行內級元素;

  • 視覺上它將內容與其它行內級元素排列為多行;典型的如段落內容,有文本(可以有多種格式譬如著重),或圖片,都是行內級元素;

  • 行內級元素生成行內級盒(inline-level boxes),參與行內格式化上下文(inline formatting context)。同時參與生成行內格式化上下文的行內級盒稱為行內盒(inline boxes)。所有display:inline的非替換元素生成的盒是行內盒;

  • 不參與生成行內格式化上下文的行內級盒稱為原子行內級盒(atomic inline-level boxes)。這些盒由可替換行內元素,或 display 值為 inline-blockinline-table 的元素生成,不能拆分成多個盒;

    置換元素(replaced element)

    一個內容不受CSS視覺格式化模型控制,CSS渲染模型并不考慮對此內容的渲染,且元素本身一般擁有固有尺寸(寬度,高度,寬高比)的元素,被稱之為置換元素。這類元素,瀏覽器根據元素的標簽和屬性,來決定元素的具體顯示內容。
    常見的置換元素有這些:img,input,textarea,select,button

    除置換元素之外,所有的元素都是非置換元素。

匿名盒(anonymous box)xj

匿名盒又分匿名塊盒與匿名行內盒,因為匿名盒沒有名字,不能利用選擇器來選擇它們,所以它們的所有屬性都為inherit或初始默認值;

三個定位方案

在定位的時候,瀏覽器就會根據元素的盒類型和上下文對這些元素進行定位,可以說盒就是定位的基本單位。定位時,有三種定位方案,分別是常規(guī)流,浮動以及絕對定位。

常規(guī)流(Normal flow)

  • 在常規(guī)流中,盒一個接著一個排列;
  • 在塊級格式化上下文里面, 它們豎著排列;
  • 在行內格式化上下文里面, 它們橫著排列;
  • positionstaticrelative,并且floatnone時會觸發(fā)常規(guī)流;
  • 對于靜態(tài)定位(static positioning),position: static,盒的位置是常規(guī)流布局里的位置;
  • 對于相對定位(relative positioning),position: relative,盒偏移位置由這些屬性定義topbottom,leftandright。即使有偏移,仍然保留原有的位置,其它常規(guī)流不能占用這個位置。

浮動(Floats)

  • 盒稱為浮動盒(floating boxes);
  • 它位于當前行的開頭或末尾;
  • 這導致常規(guī)流環(huán)繞在它的周邊,除非設置 clear 屬性;

絕對定位(Absolute positioning)

  • 絕對定位方案,盒從常規(guī)流中被移除,不影響常規(guī)流的布局;
  • 它的定位相對于它的包含塊,相關CSS屬性:top,bottom,leftright;
  • 如果元素的屬性positionabsolutefixed,它是絕對定位元素;
  • 對于position: absolute,元素定位將相對于最近的一個relativefixedabsolute的父元素,如果沒有則相對于body

外邊距疊加(margin collapse)

兩個或多個毗鄰的普通流中的盒子(可能是父子元素,也可能是兄弟元素)在垂直方向上的外邊距會發(fā)生疊加,這種形成的外邊距稱之為外邊距疊加。注意浮動元素和絕對定位元素的外邊距不會折疊。

產生外邊距折疊的場景:

  • 相鄰元素之間

    毗鄰的兩個元素之間的外邊距會折疊(除非后一個元素需要清除之前的浮動)。

  • 父元素與其第一個或最后一個子元素之間

  • 空的塊級元素

一些需要注意的地方:

  • 上述情況的組合會產生更復雜的外邊距折疊。
  • 即使某一外邊距為0,這些規(guī)則仍然適用。因此就算父元素的外邊距是0,第一個或最后一個子元素的外邊距仍然會“溢出”到父元素的外面。
  • 如果參與折疊的外邊距中包含負值,折疊后的外邊距的值為最大的正邊距與最小的負邊距(即絕對值最大的負邊距)的和。
  • 如果所有參與折疊的外邊距都為負,折疊后的外邊距的值為最小的負邊距的值。這一規(guī)則適用于相鄰元素和嵌套元素。

塊格式化上下文

塊格式上下文是頁面CSS 視覺渲染的一部分,用于決定塊盒子的布局及浮動相互影響范圍的一個區(qū)域。

BFC的觸發(fā)方法:

  • 根元素或其它包含它的元素;
  • 浮動 (元素的float不為none);
  • 絕對定位元素 (元素的position為absolute或fixed);
  • 行內塊inline-blocks(元素的 display: inline-block);
  • 表格單元格(元素的display: table-cell,HTML表格單元格默認屬性);
  • overflow的值不為visible的元素;
  • 彈性盒 flex boxes (元素的display: flex或inline-flex);

但其中,最常見的就是overflow:hidden、float:left/right、position:absolute。也就是說,每次看到這些屬性的時候,就代表了該元素觸發(fā)了一個BFC了。

BFC的范圍

BFC包含創(chuàng)建該上下文元素的所有子元素,但不包括創(chuàng)建了新BFC的子元素的內部元素。

BFC的布局規(guī)矩

  • 內部的盒會在垂直方向一個接一個排列(可以看作BFC中有一個的常規(guī)流);

  • 處于同一個BFC中的元素相互影響,可能會發(fā)生margin collapse;

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

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

  • 計算BFC的高度時,考慮BFC所包含的所有元素,浮動元素也參與計算;

  • 浮動盒區(qū)域不疊加到BFC上;

    浮動定位和清除浮動時只會應用于同一個BFC內的元素。浮動不會影響其它BFC中元素的布局,而清除浮動只能清除同一BFC中在它前面的元素的浮動。外邊距折疊也只會發(fā)生在屬于同一BFC的塊級元素之間。

BFC用途

  • 清除浮動
  • 防止垂直margin合并
  • 布局:自適應兩欄布局

IFC

Inline Formatting Contexts,也就是“內聯格式化上下文”。

觸發(fā)條件

  • 塊級元素中僅包含內聯級別元素

IFC布局規(guī)則

  • IFC中的line box一般左右都貼緊整個IFC,但是會因為float元素而擾亂。float元素會位于IFC與與line box之間,使得line box寬度縮短。
  • IFC中時不可能有塊級元素的,當插入塊級元素時(如p中插入div)會產生兩個匿名塊與div分隔開,即產生兩個IFC,每個IFC對外表現為塊級元素,與div垂直排列。

IFC用途

  • 水平居中:當一個塊要在環(huán)境中水平居中時,設置其為inline-block則會在外層產生IFC,通過text-align則可以使其水平居中。
  • 垂直居中:創(chuàng)建一個IFC,用其中一個元素撐開父元素的高度,然后設置其vertical-align:middle,其他行內元素則可以在此父元素下垂直居中。
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 1,071評論 0 2
  • 1.浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 任何定義為float的元素,都可以...
    QQQQQCY閱讀 305評論 0 0
  • 1.CSS基本概念 1.1 CSS的定義 CSS(Cascading Style Sheets)層疊樣式表,主要用...
    寥寥十一閱讀 2,047評論 0 6
  • BFC box,Formatting Context在解釋 BFC 是什么之前,需要先介紹 Box、Formatt...
    詹亮的小倉庫閱讀 322評論 0 7
  • 主要內容: 浮動的介紹、清除浮動、各種定位、BFC以及外邊距合并的介紹。 浮動 什么是浮動元素 浮動元素是floa...
    苦瓜_6閱讀 650評論 0 0

友情鏈接更多精彩內容