关于BFC理解

BFC(Block Formatting Context,块格式上下文)是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域。对其的理解能够帮你更好的布局页面。 原文链接请戳这里

常见的定位方案

在进入BFC话题前,先来捋一下常见的定位方案,定位方案是控制元素的布局,主要有三种常见的方案:

普通流(正常文档流)

在普通流中,元素按照其在HTML的先后位置至上而下布局,在这个过程中,行内元素水平排列,直到当行被占满然后换行,块级元素则被渲染为完整的一个新行,除非另外指定,否则所有元素默认都是流定位。也可以说,普通流中元素的位置由该元素在HTML文档中的位置决定。

额外:⚠️

HTML中,元素可以分成块级元素(block-level elements)和行内元素(inline-level elements)。具体的解析会另开一篇博文出来讲解。

下面给出普通流的一个例子:

<body>
	<span>first</span>
	<a href="javascript:;">second</a>
	<div class="demo demo1"></div>
	<div class="demo demo2"></div>
</body>
复制代码
html,body{
	margin: 0;
	padding: 0;
}
.demo{
	width: 200px;
	height: 200px;
}
.demo1{
	background: red;
}
.demo2{
	background: blue;
}
复制代码

浮动

在浮动布局中,元素首先按照普通流的位置出现,然后根据浮动的方向尽可能的向左边或右边偏移,其效果和印刷排版中的文本环绕相似。如下:

<body>
	<div class="container">
		<div class="left"></div>
		文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容文本内容
	</div>
</body>
复制代码
html,body{
    margin: 0;
    padding: 0;
}
body{
    padding: 100px;
}
.container{
    border: 1px dotted red;
}
.container .left{
    width: 50px;
    height: 50px;
    background: blue;
    float: left;
}
复制代码

⚠️为什会内容环绕呢,而不是跟浮动元素重合呢?

《CSS权威指南》中指出,浮动的目的,最初只能用于图像,的就是为了允许其他内容(如文本)“围绕”该图像。而后来的CSS允许浮动任何元素。

绝对定位

在绝对定位布局中,元素会整体脱离普通流(浮动布局可以理解成脱离父元素文本流),因此绝对定位不会对其兄弟元素造成影响,而具体的位置由绝对定位的坐标决定。

什么是BFC

Formatting context(格式上下文)是W3C CSS2.1规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

BFC即Block Formatting Content(块级格式上下文),它属于上述定位方案的普通流。具有BFC特性的元素可以看作是**隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且BFC具有普通容器所没有的一些特性。**后面介绍。

简单来说,可以把BFC理解成一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部的元素。

触发BFC的条件

下面的方式会创建块格式上下文

  • 根元素或包含根元素的元素,这里我理解为body元素
  • 浮动元素(元素的float不是none
  • 绝对定位元素(元素的positionabsolutefixed
  • 行内块元素(元素的displayinline-block
  • 表格单元格(元素的displaytable-cell,html表格单元格默认为该值)
  • 表格标题(元素的displaytable-caption,html表格标题默认为该值)
  • 匿名表格单元格元素(元素的displaytabletable-rowtable-row-grouptable-header-grouptable-footer-group(分别是html table、row、tbody、thead、tfoot的默认属性)或inline-table
  • overflow值不为visible的块元素
  • display值为flow-root的元素
  • contain值为layout、content或strict的元素
  • 弹性元素(displayflexinline-flex元素的直接子元素)
  • 网格元素(displaygridinline-grip元素的直接子元素)
  • 多列容器(元素的column-countcolumn-width不为auto,包括column-count为1)
  • column-spanall的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中

创建了块格式上下文的元素中的所有内容都会被包含在BFC中。以上的创建方式参考自块格式化上下文

BFC的特性(作用)

简单罗列下BFC的特性:

  1. 内部的box会在垂直方向,从顶部开始一个接一个地放置
  2. box垂直方向的距离由margin决定。属于同一个BFC的两个相邻的box的margin会发生叠加,结果值并集
  3. 在BFC中,每个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)。(对于从右到左的格式来说,则触碰到右边缘),即使是浮动也是如此。即不会发生margin穿透
  4. 形成了BFC的区域不会与float box重叠(可阻止因浮动元素引发的文字环绕现象)
  5. 计算BFC高度时,浮动元素也参与计算(BFC会确切包含浮动的子元素,即闭合浮动)

注意⚠️,对于第五点,原本浮动元素是应该脱离文档流的,但是BFC中会计算其高度。

BFC的一些应用

实现自适应的两栏布局

应用了第四点BFC的区域不会与float box重叠的特性。一边浮动,另一边自适应的部分形成BFC,那么两者就不会重叠,避免了文字环绕及类似情形。

<body>
	<div class="container">
        <div class="left">left</div>
        <div class="right">right</div>
	</div>
</body>
复制代码
html,body{
    margin: 0;
    padding: 0;
}
body{
    padding: 50px;
}
.container {
    width: 100%;
}
.left {
    width: 100px;
    height: 150px;
    background-color: blue;
    float: left;
}
.right {
    height: 200px;
    background-color: red;
    overflow: hidden; /*把.right这个自适应的box变成BFC,避免与.left box这个有float属性的元素重叠*/
}
复制代码

解决父元素高度塌陷

高度塌陷产生的原因:父元素未设置固定的高度,完全由子元素高度撑开;当子元素float之后脱离了文档流,父元素内部就没有支撑,造成了高度的塌陷

解决这种问题我上之前的博文中有总结,地址请戳CSS清除浮动。这里再简单的说下原理:

也就是用到了BFC的特性五:闭合内部浮动

<body>
	<div class="container">
	    <div class="left">left</div>
	</div>
</body>
复制代码
html,body{
    margin: 0;
    padding: 0;
}
.container {
    width: 100%;
    border: 1px solid red;
    overflow: hidden; /*形成BFC,使其能闭合浮动 box*/
}
.left {
    width: 100px;
    height: 150px;
    background-color: blue;
    float: left;
}
复制代码

margin重叠解决

在正常的文档流中,在垂直方向上兄弟box的margin会取交集(取最大的显示),为神马会出现这种情况呢?可以说是一种bug,也可以说是一种规范。我比较倾向于后者。

<body>
    <div class="top">top</div>
    <div class="bottom">bottom</div>
</body>
复制代码
.top {
    width: 100px;
    height: 100px;
    background-color: blue;
    margin-bottom: 100px;
}
.bottom{
    width: 100px;
    height: 100px;
    background-color: red;
    margin-top: 50px;
}
复制代码

上面出现的情况是BFC的特性三:属于同一个BFC的两个相邻的box的margin会发生叠加,结果值并集。那么,我们将他们隔离成不同的BFC不久解决问题了嘛。

<body>
    <div class='wrap'>
        <div class="top">top</div>
    </div>
    <div class="bottom">bottom</div>
</body>
复制代码
.top {
    width: 100px;
    height: 100px;
    background-color: blue;
    margin-bottom: 100px;
}
.bottom{
    width: 100px;
    height: 100px;
    background-color: red;
    margin-top: 50px;
}
.wrap{
    overflow: hidden; /*将.top box包含在另外一个BFC中隔离开*/
}
复制代码

后话

使用好BFC能够是你更好的布局。文中部分内容参考网络内容。

各位大佬轻喷,还请多多指正。放上github地址github.com/reng99求指教就逃:)

<think>我们正在讨论BFC(块级格式化上下文)的概念及其在网页布局中的作用。据引用内容,BFC是一个独立的渲染区域,内部元素按照特定规则布局,并且与外部元素隔离。以下将逐步解释BFC的定义、触发条件、规则和应用场景。###1.BFC的定义BFC全称是块级格式化上下文(BlockFormattingContext),它是Web页面中的一块独立渲染区域。引用[2]将其比喻为“独立王国”,即在这个区域内的元素布局不受外界影响,同时也不会影响外部的元素。###2.触发BFC的条件据引用[4],以下方式可以触发BFC:-元素(`<html>`)-浮动元素(`float`不为`none`)-绝对定位元素(`position`为`absolute``fixed`)-行内块元素(`display:inline-block`)-表格单元格(`display:table-cell`)-表格标题(`display:table-caption`)-`overflow`不为`visible`的块元素(常用`overflow:hidden`、`auto``scroll`)-弹性元素(`display:flex``inline-flex`的直接子元素)###3.BFC的布局规则引用[4]详细描述了BFC的布局规则:-内部的盒子会垂直排列,一个接一个地放置。-垂直方向上的边距(margin)会发生重叠(仅在同一BFC内)。-BFC区域不会与浮动元素重叠。-BFC内部的元素不会影响外部的布局,外部元素也不会影响BFC内部的布局。###4.BFC的应用场景####(1)清除浮动当父元素包含浮动元素时,父元素的高度会塌陷(即高度为0)。引用[3]指出,通过触发父元素BFC(如设置`overflow:hidden`),可以清除浮动,使父元素重新包裹浮动元素。####(2)防止外边距重叠(MarginCollapse)相邻块级元素的垂直外边距会合并(取最大值)。引用[2]和[4]提到,将其中一个元素放入BFC中,可以阻止它与外部元素的外边距重叠。####(3)避免浮动元素覆盖引用[5]以“后台布局”为例:左侧浮动菜单和右侧内容区域。若右侧不触发BFC,则会被浮动菜单覆盖。通过触发右侧的BFC(如设置`overflow:auto`),可实现左右分栏布局。####(4)隔离独立布局区域引用[1]和[4]强调,BFC的隔离特性可用于创建独立的组件,确保组件内部样式不影响外部。###示例代码以下是一个利用BFC避免浮动覆盖的布局示例:```html<style>.sidebar{float:left;width:200px;}.content{overflow:auto;/*触发BFC*/}</style><divclass="sidebar">左侧浮动菜单</div><divclass="content">右侧内容区域,触发BFC后不会与浮动元素重叠</div>```###总结BFC是CSS布局中的重要概念,它通过创建独立的渲染区域解决浮动清除、外边距重叠、浮动覆盖等问题。掌握触发条件(如`overflow:hidden`)和应用场景,能有效提升页面布局的稳定性。§§相关问题§§1.BFC与IFC(内联格式化上下文)有什么区别?2.如何利用BFC解决多栏自适应布局?3.为什么BFC能阻止外边距合并?4.BFC在响应式设计中的应用有哪些?</think>### BFC(块级格式化上下文)详解 #### 1. BFC 是什么? BFC(Block Formatting Context)是CSS中的**独立渲染区域**,其内部元素按照特定规则布局,并与外部环境隔离。引用[2]将其比喻为"独立王国":在这个特殊区域内的元素布局不受外界干扰,也不会影响外部元素。 #### 2. 核心布局规则(引用[4]) - **垂直排列**:内部盒子从包含块顶部开始垂直堆叠 - **边距重叠**:仅发生在同一BFC内的相邻元素间 - **浮动隔离**:不与外部浮动元素重叠 - **布局独立**:内部/外部元素互不影响 ```css /* 触发BFC的常见方式 */ .container { overflow: hidden; /* 最常用方式 */ display: inline-block; position: absolute; float: left; /* 非none值 */ } ``` #### 3. 实际应用场景 ##### ① 清除浮动(引用[3]) 当父元素包含浮动子元素时,高度会塌陷: ```html <div class="parent"> <div class="float-child"></div> </div> ``` 通过触发父元素BFC解决: ```css .parent { overflow: hidden; /* 触发BFC包裹浮动元素 */ } ``` ##### ② 防止外边距重叠(引用[1][4]) 相邻元素的垂直边距会合并: ```html <div class="box1">上盒子</div> <div class="box2">下盒子</div> ``` 通过创建独立BFC隔离: ```css .wrapper { display: flow-root; /* 新标准触发方式 */ } <div class="wrapper"><div class="box2"></div></div> ``` ##### ③ 自适应两栏布局(引用[5]) 左侧浮动+右侧自适应: ```html <div class="sidebar">浮动菜单</div> <div class="content">主内容区</div> ``` 触发右侧BFC避免重叠: ```css .content { overflow: auto; /* 触发BFC区域不重叠 */ } ``` #### 4. 触发条件总结(引用[4]) | 触发方式 | 示例 | |------------------------|--------------------------| | `overflow` 非visible | `overflow: hidden` | | 浮动元素 | `float: left/right` | | 绝对定位 | `position: absolute/fixed` | | 行内块元素 | `display: inline-block` | | 弹性/网格容器 | `display: flex/grid` | | 表格相关元素 | `display: table-cell` | > **关键理解**:BFC如同快递箱(引用[5]),每个箱子独立封装内容,即使内部损坏(如浮动/边距问题)也不会影响其他箱子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值