BFC浅析

当我第一次接触到BFC时,我的三观基本上都被颠覆了。在平时编程中我们会经常遇到BFC,只不过那些与BFC相关的现象——比如外边距折叠我们往往都忽略掉。

1.什么是BFC

BFC是Block Formatting Context的缩写,翻译成中文就是“块级格式化上下文”。
简单来说,BFC是一个具有特殊CSS样式的HTML盒子,下面的样式只要满足一项,就说明这个盒子是BFC:

  • 是body元素
  • float: left | right
  • position: fixed | absolute
  • display: inline-block | table-cell | table-caption | flex | inline-flex
  • overflow: hidden | scroll | auto

2.执行规则

BFC的执行规则有以下五种:
2.1 在同一个块级排版上下文内,盒子是从包含块顶部开始,垂直的一个接一个的排列的。每个盒子的左外边是紧贴着父元素的左边
这个规则不难理解,如果我们写若干个div,那么它们应该从上往下一次排列,一行只有一个div,并且紧贴容器左侧。

2.2 相邻两个盒子之间的垂直的间距是被margin属性所决定的,在一个块级排版上下文中相邻的两个块级盒之间的垂直margin是折叠的,这时候总的外边距并不是两者相加,而是取最大的外边距作
所谓“外边距折叠”在之后“BFC常见作用”中会详细讨论,折叠的仅仅是垂直方向上的margin,水平方向上则不会。

2.3 BFC就是页面上的一个隔离的独立容器,容器里面的元素的布局不会影响到外面的元素

2.4 BFC的区域不会与float的元素区域重叠(之后会展示)

2.5 计算BFC高度时,浮动元素也参与计算(之后会展示)

3.BFC常见作用

3.1 解决外边距折叠
发生边距折叠是因为同一个BFC的关系,解决方法是将其置于不同的BFC。举个栗子,下面这段代码

.fold{
	width:100px;
	height:30px;
	margin:10px 0;
	background-color:red;
}
.bfca{
	width:150px;
	height:30px;
	margin:20px 0;
	background-color:red;
}

<div>
	<div class="fold"></div>
	<div class="bfca"></div>
</div>

如果按照正常计算方法,.fold与.bfca垂直方向上的间距应该是30px。然而,事实却不是这样子的
这里写图片描述
鹅MAZING,这里两个div的间距是20px。这即是上面介绍的BFC的执行规则中的第二条,取.fold下边距与.bfca上边距中的最大值作为两种垂直方向上的间距。那么如何解决这个问题呢?前面已经剧透——将两个div置于不同的BFC

.fold{
	width:100px;
	height:30px;
	margin:10px 0;
	background-color:red;
}
.bfca{
	width:150px;
	height:30px;
	margin:20px 0;
	background-color:red;
}
.go{
	overflow: hidden;//在.bfca外面添加了一个div,并将其变为bfc
}

<div>
	<div class="fold"></div>
	<div class="go">
		<div class="bfca"></div>
	</div>
</div>

这里写图片描述
这样一来明显可以发现两个div间距变大了,此时再去测量就会发现间距变成了30px
这里两个margin都是正数,如果都是负数或者一正一负也会发生折叠的情况:
两个外边距都是负数时,折叠结果是两者绝对值的较大值
两个外边距一正一负时,折叠结果是两者的相加的和

3.2 高度塌陷
我们先来看这段代码

.collapse div{
	float: left;
	background-color: lightgreen;
	margin: 10px;
}
.collapse{
	width: 200px;
	background-color: red; 
}

<div class="collapse">
    <div>float 1</div>
    <div>float 2</div>
</div>

这时,效果应该是酱紫
这里写图片描述
并没有红色的部分,具体原因是两个子div设置了float,脱离了文档流,不能将父元素的高度撑起来,导致父元素高度塌陷。我们可以将代码修改一下

.collapse div{
	float: left;
	background-color: lightgreen;
	margin: 10px;
}
.collapse{
	overflow: hidden;//这里多了overflow属性设置
	width: 200px;
	background-color: red; 
}

<div class="collapse">
    <div>float 1</div>
    <div>float 2</div>
</div>

再看效果
这里写图片描述
出现了红色,证明父元素被撑起来了重点内容

3.3 不被浮动元素覆盖
来看这段代码

.noFloat{
	width:300px;
	height:50px;
	background-color: green;
}
.havaFloat{
	float:left;
	width:50px;
	height:23px;
	background-color: red;
}

<div class="cover">
	<div class="havaFloat"></div>
	<div class="noFloat"></div>
</div>

效果是这样子的
这里写图片描述
绿色有一部分被红色遮住了,因为float使元素脱离文档流,导致它“不按套路来”。现在将代码做如下修改

.noFloat{
	overflow: hidden;
	width:300px;
	height:50px;
	background-color: green;
}
.havaFloat{
	float:left;
	width:50px;
	height:23px;
	background-color: red;
}

<div class="cover">
	<div class="havaFloat"></div>
	<div class="noFloat"></div>
</div>

现在再看
这里写图片描述
呀哈,遮不住了。

以上就是我总结的对BFC的浅析,其实HTML、CSS并不那么简单,要学的东西还很多。

03-19
<think>好的,用户想了解BFC的概念以及如何解决相关的CSS布局问题。首先,我需要回忆BFC的定义和作用。根据引用[5],BFC是块级格式化上下文,它让内部元素和外部元素互不影响,形成一个隔离的环境。这有助于解决布局中的一些常见问题,比如外边距折叠、浮动元素导致的父容器高度塌陷等。 接下来,我需要解释BFC的工作原理。根据引用[4]和[5],创建BFC的方法包括设置overflow为hidden、auto,或者使用display: flow-root等。例如,当父元素包含浮动子元素时,父元素的高度可能会塌陷,这时候给父元素添加overflow: hidden可以触发BFC,使其包含子元素,恢复高度,如引用[4]中的例子。 然后,我应该列举BFC的常见应用场景。比如防止外边距折叠,这时候可以将其中一个元素放入BFC容器中,阻止外边距合并。处理浮动元素导致的高度塌陷也是一个重要应用,如引用[3]中的代码示例所示,使用.newBFC类来创建新的BFC,确保父容器正确包裹浮动内容。 用户可能需要知道如何创建BFC,所以需要列出触发条件。引用[5]提到了overflow非visible,还有display: inline-block、table-cell等属性。同时,需要说明不同触发方式可能带来的副作用,比如overflow: hidden可能会隐藏溢出内容,而display: flow-root更语义化且无副作用。 最后,生成相关问题,帮助用户进一步理解BFC的应用和深入知识。比如如何解决浮动布局问题,或者外边距折叠的处理方法。这些相关问题应该覆盖用户可能遇到的典型场景,引导他们深入学习。 需要注意使用正确的中文术语,确保解释清晰,同时引用提供的资料来支持回答的准确性。例如,在解释父容器高度塌陷时,引用[4]中的例子来说明overflow: hidden的作用。同时,代码示例要符合用户提供的引用内容,保持一致性。 总结回答结构:先定义BFC,然后工作原理,触发条件,应用场景,代码示例,最后相关问题。确保每个部分都引用相关资料,比如引用[5]定义,引用[4]和[3]的例子,引用[5]的触发条件等。这样用户能清晰理解BFC的概念和应用,解决实际布局问题。</think>### Block Formatting Context (BFC) 详解 #### 1. BFC 基础定义 BFC(块级格式化上下文)是 CSS 中的一种渲染模式。**当一个元素形成 BFC 后,其内部布局与外部完全隔离**,内部元素的垂直外边距不会与外部元素重叠,且能包含浮动元素[^5]。例如: ```css .container { overflow: hidden; /* 触发 BFC */ } ``` #### 2. BFC 核心作用原理 通过创建独立渲染区域实现以下效果: - **阻止外边距折叠**:相邻块级元素默认会合并外边距,BFC 可阻止这种合并 - **包含浮动元素**:解决父元素高度塌陷问题(如浮动子元素导致父元素高度为 0)[^4] - **阻止文字环绕**:避免浮动元素导致文本环绕现象 #### 3. BFC 触发条件 通过 CSS 属性触发: ```css /* 常用触发方式 */ .element { overflow: hidden | auto; /* 最常用方式 */ display: flow-root; /* 最语义化的方式 */ float: left | right; position: absolute | fixed; display: inline-block | table-cell; } ``` #### 4. 典型应用场景 **场景 1:清除浮动** 当父元素包含浮动子元素时,添加 BFC 触发属性可自动计算高度: ```css .container { background-color: red; overflow: hidden; /* 触发 BFC */ } ``` 此时容器高度会包含浮动子元素[^3]。 **场景 2:防止外边距合并** 两个相邻元素的上下边距默认会合并,通过添加 BFC 容器隔离: ```html <div class="newBFC"> <p>内容1</p> </div> <p>内容2</p> <style> .newBFC { overflow: hidden; /* 新建 BFC */ } </style> ``` 此时两个 `<p>` 的外边距不再合并[^2]。 #### 5. 代码示例解析 ```css /* 父容器高度塌陷问题解决方案 */ .container { background-color: red; overflow: hidden; /* 触发 BFC 包含浮动元素 */ } p { margin: 10px 0; background-color: lightgreen; } ``` 通过给父容器添加 `overflow: hidden`,成功包含浮动子元素并计算正确高度[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值