<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          BFC 的形成和作用

          共 3641字,需瀏覽 8分鐘

           ·

          2021-09-19 15:48

          作者:HZFEStudio

          來源:SegmentFault 思否社區(qū)


          完整高頻題庫倉(cāng)庫地址:

          https://github.com/hzfe/awesome-interview

          完整高頻題庫閱讀地址

          https://hzfe.github.io/awesome-interview/

          相關(guān)問題

          BFC 有什么用,如何觸發(fā)

          談?wù)勀銓?duì) BFC 的理解

          回答關(guān)鍵點(diǎn)

          盒模型 視覺格式化模型 包含塊 正常流
          BFC 是什么
          BFC 全稱為 block formatting context,中文為“塊級(jí)格式化上下文”。它是一個(gè)只有塊級(jí)盒子參與的獨(dú)立塊級(jí)渲染區(qū)域,它規(guī)定了內(nèi)部的塊級(jí)盒子如何布局,且與區(qū)域外部無關(guān)。
          BFC 有什么用
          修復(fù)浮動(dòng)元素造成的高度塌陷問題。
          避免非期望的外邊距折疊。
          實(shí)現(xiàn)靈活健壯的自適應(yīng)布局。

          觸發(fā) BFC 的常見條件
          • <html> 根元素。

          • float 的值不為 none。

          • position 的值不為 relative 或 static。

          • overflow 的值不為 visible 或 clip(除了根元素)。

          • display 的值為 table-cell,table-caption,或 inline-block 中的任意一個(gè)。

          • display 的值為 flow-root,flow-root,或 list-item。

          • flex items,即 display 的值為 flex 或 inline-flex 的元素的直接子元素(該子元素 display 不為 flex,grid,或 table)。

          • grid items,即 display 的值為 grid 或 inline-grid 的元素的直接子元素(該子元素 display 不為 flex,grid,或 table)。

          • contain 的值為 layout,content,paint,或 strict 中的任意一個(gè)。

          • column-span 設(shè)置為 all 的元素。


          提示display: flow-root,contain: layout 等是無副作用的,可在不影響已有布局的情況下觸發(fā) BFC。

          知識(shí)點(diǎn)深入

          1. 前置知識(shí)點(diǎn)

          盒模型(box model)
          盒模型描述了一個(gè)由元素生成的矩形盒子,視覺格式化模型決定這些盒子的大小、位置以及屬性(例如顏色、背景、邊框尺寸等等)。
          盒子的具體構(gòu)成如下圖所示:

          術(shù)語解析
          由于視覺格式化模型描述中,有許多相近的術(shù)語,在此先行列出解釋。
          • box(盒子):一個(gè)抽象概念,在畫布上占據(jù)一塊空間,通常由元素(element)生成。一個(gè)元素可能生成多個(gè)盒子(如偽元素、list-item 元素)。

          • principal box(主要盒子):元素生成的多個(gè)盒子中,用來包含它的后代盒子和它生成的內(nèi)容的盒子,也是參與任何定位方案的盒子。

          • block-level box(塊級(jí)盒子):參與 BFC 布局的盒子,通常由塊級(jí)元素生成。

          • block container box(塊容器):在 CSS2.2 中,除了 tabel box 或替換元素的主要盒子,一個(gè)塊級(jí)盒子也是塊容器,但不是所有的塊容器都是塊級(jí)盒子(如非替換內(nèi)聯(lián)塊盒子)。塊容器主要側(cè)重于其子元素的定位、布局。

          • block box(塊盒子):如果一個(gè)塊級(jí)盒子同時(shí)也是塊容器,則可以稱作塊盒子。

          • block(塊):當(dāng)沒有歧義時(shí),作為 block box, block-level box 或 block container box 的簡(jiǎn)寫。


          (注:盒子有“塊盒子”和“塊級(jí)盒子”,元素只有“塊級(jí)元素”,而沒有“塊元素”)

          2. 視覺格式化模型(visual formatting model)

          視覺格式化模型描述了用戶代理(如瀏覽器)在可視化媒體(如顯示器)上處理文檔樹(document tree)的過程。下面各小節(jié)是視覺格式化模型中與 BFC 強(qiáng)相關(guān)的描述:

          2.1 包含塊(containing block)

          大部分情況下,包含塊是一個(gè)由元素最近的祖先塊容器的內(nèi)容區(qū)域(content area)確定的矩形區(qū)域,包含塊本身不是盒子,是一個(gè)矩形區(qū)域。元素的大小,位置,及偏移等布局信息根據(jù)包含塊的尺寸進(jìn)行計(jì)算。

          2.2 正常流(normal flow)

          正常流是瀏覽器的默認(rèn)布局方式。在正常流中的盒子,屬于 BFC,IFC,或其他格式化上下文之一。

          2.3 格式化上下文(formatting context)

          格式化上下文是一系列相關(guān)盒子進(jìn)行布局的環(huán)境。不同的格式化上下文有不同的布局規(guī)則。目前常見的格式化上下文有以下這些:
          • 塊級(jí)格式化上下文(BFC,block formatting context)。

          • 內(nèi)聯(lián)格式化上下文(IFC,inline formatting context)。

          • 彈性格式化上下文(FFC,flex formatting context),在 CSS3 中定義。

          • 柵格格式化上下文(GFC,grid formatting context),在 CSS3 中定義。

          2.4 獨(dú)立格式化上下文(independent formatting context)

          一個(gè)盒子要么建立一個(gè)新的獨(dú)立格式化上下文,要么延續(xù)其包含塊的格式化上下文。除了特殊說明,建立新的格式化上下文就是在建立一個(gè)獨(dú)立格式化上下文。
          當(dāng)一個(gè)盒子建立一個(gè)獨(dú)立格式化上下文時(shí),它創(chuàng)建了一個(gè)新的獨(dú)立布局環(huán)境。除了通過改變盒子本身的大小,盒子內(nèi)部的后代不會(huì)影響格式化上下文外部的規(guī)則和內(nèi)容,反之亦然。

          2.5 塊級(jí)格式化上下文規(guī)范及解析

          根據(jù) W3C CSS2.1 視覺格式化模型一章的定義,BFC 相關(guān)規(guī)范描述如下:
          1. 浮動(dòng)元素,絕對(duì)定位元素,不是塊級(jí)盒子的塊級(jí)容器(如 inline-block,table-cells,table-captions)以及 overflow 值不為 visible 的塊級(jí)盒子,都會(huì)為他們的內(nèi)容創(chuàng)建 BFC(注:觸發(fā) BFC 的條件)。

          2. 在 BFC 中,盒子從包含塊的頂部開始,在垂直方向上一個(gè)接一個(gè)的排列。相鄰盒子之間的垂直間隙由它們的 margin 值決定。在同一個(gè) BFC 中,相鄰塊級(jí)盒子的垂直外邊距會(huì)合并(注:參與 BFC 布局的都是塊級(jí)元素)。

          3. 在 BFC 中,每一個(gè)盒子的左外邊緣(margin-left)會(huì)觸碰到包含塊的左邊緣。即使是存在浮動(dòng)元素也是如此,除非該盒子建立了一個(gè)新的 BFC。


          結(jié)合規(guī)范第三點(diǎn)與獨(dú)立格式化上下文的知識(shí),我們可以有以下推論:
          1. BFC 內(nèi)外互不影響。

          2. BFC 包含內(nèi)部的浮動(dòng)(解決內(nèi)部浮動(dòng)元素導(dǎo)致的高度塌陷)。

          3. BFC 排斥外部的浮動(dòng)(觸發(fā) BFC 的元素不會(huì)和外部的浮動(dòng)元素重疊)。

          4. 外邊距折疊的計(jì)算不能跨越 BFC 的邊界。

          5. 各自創(chuàng)建了 BFC 的兄弟元素互不影響(注:在水平方向上多個(gè)浮動(dòng)元素加一個(gè)或零個(gè)觸發(fā) BFC 的元素可以形成多列布局)。


          通過 BFC 可以實(shí)現(xiàn)靈活健壯的自適應(yīng)布局,在一行中達(dá)到類似 flexbox 的效果,示例如下:
          兩欄自適應(yīng)布局

          多列自適應(yīng)布局

          參考資料

          1. 塊級(jí)格式化上下文

            https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flow_Layout/Intro_to_formatting_contexts


          2. 包含塊:MDN

            https://developer.mozilla.org/en-US/docs/web/css/containing_block


          3. 包含塊:W3C

            https://www.w3.org/TR/CSS22/visudet.html#containing-block-details


          4. 視覺格式化模型:MDN

            https://developer.mozilla.org/en-US/docs/web/css/visual_formatting_model


          5. 視覺格式化模型:W3C

            https://www.w3.org/TR/CSS22/visuren.html


          6. 盒模型:MDN

            https://developer.mozilla.org/en-US/docs/web/css/css_box_model/introduction_to_the_css_box_model


          7. 盒模型:W3C

            https://www.w3.org/TR/CSS22/box.html


          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产亚洲精久久久久久无码苍井空 | 肏逼综合网| 青青草成人在线免费观看视频 | 草大逼网| A片小视频 |