目錄
什么是BFC?
Box:CSS布局的基本单位
Formatting Context
BFC定义
BFC布局规则
哪些元素会生成BFC
BFC作用与原理
1. 自适应两栏布局
显示效果:
根据BFC布局规则第3条:
根据BFC布局规则第四条:
2. 清除内部浮动
根据BFC布局规则第六条:
效果如下:
3. 防止垂直margin重叠
根据BFC布局规则第二条:
总结
其实以上的几个例子都体现了BFC布局规则第五条:
参考
首頁 web前端 html教學 BFC(Block formatting contexts)初探_html/css_WEB-ITnose

BFC(Block formatting contexts)初探_html/css_WEB-ITnose

Jun 21, 2016 am 08:58 AM

前端工程师求职面试的时候,或多或少都会问到一点BFC(Block formatting contexts)相关的知识。在平时的开发中我也遇到过BFC方面的问题,但是没有好好整理过这方面的知识,所以别人问我的时候,我都不敢说自己知道这么个概念o(╯□╰)o。这两天,我仔细阅读了一些文章来填补这块知识漏洞。

什么是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 formatting context;

  • inline-level box:display属性为inline, inline-block, inline-table的元素,会生成inline-level box。并且参与inline formatting context;

  • run-in box:display属性为run-in的元素,根据上下文决定对象是内联对象还是块级对象。CSS3属性!

  • Formatting Context

    Formatting Context是W3C CSS2.1规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的Formatting Context有Block Formatting Context(BFC)和Inline Formatting Context(IFC)。

    BFC定义

    BFC(Block Formatting Context)块级格式化上下文,它是一个独立的渲染区域,只有Block-level box参与,它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

    BFC布局规则

  • 内部的Box会在垂直方向,一个接一个地放置

  • Box垂直方向的距离由margin决定,属于同一个BFC的两个相邻Box的margin会发生重叠

  • 每个元素的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)

  • BFC的区域不会与float box重叠

  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此

  • 计算BFC的高度时,浮动元素也参与计算

  • 哪些元素会生成BFC

  • 根元素

  • float属性不为none

  • position为absolute或fixed

  • display为inline-block, table-cell, table-caption, flex, inline-flex

  • overflow不为visible

  • BFC作用与原理

    1. 自适应两栏布局

    <style>    body {    width: 300px;    position: relative;  }  .aside {    width: 100px;    height: 150px;    float: left;    background-color: #f66;  }  .main {    height: 200px;    background-color: #fcc;  }</style><body>    <div class="aside"></div>  <div class="main"></div></body>
    登入後複製

    显示效果:

    根据BFC布局规则第3条:

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

    因此,虽然存在浮动的元素aside,但main的左边依然会与包含块的左边相接触

    根据BFC布局规则第四条:

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

    我们可以通过通过触发main生成BFC, 来实现自适应两栏布局:

    .main {    height: 200px;    background-color: #fcc;    overflow: hidden;  }
    登入後複製

    当触发main生成BFC后,这个新的BFC不会与浮动的aside重叠。因此会根据包含块的宽度,和aside的宽度,自动变窄。效果如下:

    2. 清除内部浮动

    <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也会参与计算

    .par {    border: 5px solid #fcc;    width: 300px;    overflow: hidden;  }
    登入後複製

    效果如下:

    3. 防止垂直margin重叠

    <style>    p {    width: 200px;    line-height: 100px;    margin: 100px;    font-weight: bold;    color: #f55;    background-color: #fcc;    text-align: center;  }</style><body>    <p>heihei</p>  <p>gagaga</p></body>
    登入後複製

    显示效果

    两个p之间的距离为100px,发生了margin重叠

    根据BFC布局规则第二条:

    Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠margin重叠规则:* 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值* 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值* 两个外边距一正一负时,折叠结果是两者的相加的和
    登入後複製

    我们可以在p外面包裹一层容器,并触发该容器生成一个BFC。那么两个P便不属于同一个BFC,就不会发生margin重叠了

    <style>    .wrap {    overflow: hidden;  }  p {    width: 200px;    line-height: 100px;    margin: 100px;    font-weight: bold;    color: #f55;    background-color: #fcc;    text-align: center;  }</style><body>    <p>heihei</p>  <div class="wrap"><p>gagaga</p></div></body>
    登入後複製

    显示效果:

    总结

    其实以上的几个例子都体现了BFC布局规则第五条:

    BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此!
    登入後複製

    因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。

    参考

  • 前端精选文摘:BFC 神奇背后的原理

  • 我对BFC的理解

  • 谈外margin collapsing(外边距叠加)

  • 本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    HTML容易為初學者學習嗎? HTML容易為初學者學習嗎? Apr 07, 2025 am 12:11 AM

    HTML適合初學者學習,因為它簡單易學且能快速看到成果。 1)HTML的學習曲線平緩,易於上手。 2)只需掌握基本標籤即可開始創建網頁。 3)靈活性高,可與CSS和JavaScript結合使用。 4)豐富的學習資源和現代工具支持學習過程。

    HTML,CSS和JavaScript的角色:核心職責 HTML,CSS和JavaScript的角色:核心職責 Apr 08, 2025 pm 07:05 PM

    HTML定義網頁結構,CSS負責樣式和佈局,JavaScript賦予動態交互。三者在網頁開發中各司其職,共同構建豐富多彩的網站。

    了解HTML,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

    WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

    Gitee Pages靜態網站部署失敗:單個文件404錯誤如何排查和解決? Gitee Pages靜態網站部署失敗:單個文件404錯誤如何排查和解決? Apr 04, 2025 pm 11:54 PM

    GiteePages靜態網站部署失敗:404錯誤排查與解決在使用Gitee...

    HTML中起始標籤的示例是什麼? HTML中起始標籤的示例是什麼? Apr 06, 2025 am 12:04 AM

    AnexampleOfAstartingTaginHtmlis,beginSaparagraph.startingTagSareEssentialInhtmlastheyInitiateEllements,defiteTheeTheErtypes,andarecrucialforsstructuringwebpages wepages webpages andConstructingthedom。

    如何用CSS3和JavaScript實現圖片點擊後周圍圖片散開並放大效果? 如何用CSS3和JavaScript實現圖片點擊後周圍圖片散開並放大效果? Apr 05, 2025 am 06:15 AM

    實現圖片點擊後周圍圖片散開並放大效果許多網頁設計中,需要實現一種交互效果:點擊某張圖片,使其周圍的...

    HTML,CSS和JavaScript:Web開發人員的基本工具 HTML,CSS和JavaScript:Web開發人員的基本工具 Apr 09, 2025 am 12:12 AM

    HTML、CSS和JavaScript是Web開發的三大支柱。 1.HTML定義網頁結構,使用標籤如、等。 2.CSS控製網頁樣式,使用選擇器和屬性如color、font-size等。 3.JavaScript實現動態效果和交互,通過事件監聽和DOM操作。

    網頁批註如何實現Y軸位置的自適應佈局? 網頁批註如何實現Y軸位置的自適應佈局? Apr 04, 2025 pm 11:30 PM

    網頁批註功能的Y軸位置自適應算法本文將探討如何實現類似Word文檔的批註功能,特別是如何處理批註之間的間�...

    See all articles