前端CSS理解 —— BFC(块级格式化上下文)

简介: 前端CSS理解 —— BFC(块级格式化上下文)

我走得很慢,但我从不后退。人生苦短,何妨一试。

1.什么是BFC?

       BFC即 Block Formatting Contexts (块级格式化上下文), 是 W3C CSS2.1 规范中的一个概念。BFC是指浏览器中创建了一个独立的渲染区域(内部元素的渲染不会影响边界以外的元素),并且拥有一套渲染规则,他决定了其子元素如何定位,以及与其他元素的相互关系和作用。

2.BFC特性

具有 BFC 特性的元素可以看作是隔离的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。(因此它可以解决一些布局问题)

官方文档对BFC的描述

       In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.

       In a block formatting context, each box's left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (althouah a box's line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).

——百度翻译

       在块格式设置上下文中,框从包含块的顶部开始一个接一个地垂直排列。两个同级框之间的垂直距离由“margin”属性决定。块格式上下文中相邻块级框之间的垂直边距折叠。

       在块格式设置上下文中,每个框的左外边缘都会接触到包含块的左边缘(对于从右到左的格式设置,右边缘会接触)。即使在存在浮动的情况下也是如此(尽管框的行框可能会因浮动而收缩),除非框建立了新的块格式化上下文(在这种情况下,框本身可能会因浮点数而变窄)。

简单概况如下:

  • 在BFC中,box会在垂直方向上一个挨着一个的排布;
  • 垂直方向的间距由margin属性决定;
  • 在同一个BFC中,相邻两个box之间的margin会折叠(collapse);
  • 在BFC中,每个元素的左边缘是紧挨着包含块的左边缘的;

3.触发(创建)BFC

  • html 根元素
  • 浮动元素:float 属性值为 none 以外的值(即浮动元素)
  • 绝对定位元素:position 属性值为 absolute 或 fixed
  • display 属性值为 inline-block、table-cells、flex
  • overflow 属性为 visible 以外的值 (hidden、auto、scroll)

常用的触发方式:给父级元素添加以下任一样式

  • overflow: hidden;
  • display: flex / inline-flex / inline-block;
  • position: absolute / fixed;
  • CSS3新增属性值 display: flow-root;兼容性略逊

4.BFC应用(BFC的作用)

(1)解决浮动高度塌陷

当父级元素没有设置高度(height取默认值:auto)时,子级元素浮动会使父级元素高度塌陷

解决方法:令父级元素触发BFC

10.6.7 'Auto' heights for block formatting context roots

In certain cases (see. e.a. sections 10.6.4 and 10.6.6 above), the heiaht of an element that establishes a block formatting context is computed as follows:

If it only has inline-level children, the height is the distance between the top of the topmost line box and the bottom of the bottommost line box.

lf it has block-level children, the height is the distance between the top margin-edge of the topmost block-level child box and the bottom margin-edge of the bottommost block-level child box.

Absolutely positioned children are ignored, and relatively positioned boxes are considered without their offset. Note that the child box may be an anonymous block box.

In addition, if the element has any floating descendants whose bottom margin edge is below the element's bottom content edge, then the height is increased to include those edges. Only floats that participate in this block formatting context are taken into accounte.g.floats inside absolutely positioned descendants or other floats are not.

 

——百度翻译

10.6.7块格式化上下文根的“自动”高度

在某些情况下(参见上文第10.6.4节和第10.6.6节),建立块格式化上下文的元素的高度计算如下:

如果它只有内联级别的子级,则高度是最上面的行框顶部和最下面的行框底部之间的距离。

如果它有块级别的子框,则高度是最上面的块级别子框的上边距边缘和最下面的块级子框的底边距边缘之间的距离。

绝对定位的子对象将被忽略,相对定位的框将被视为没有偏移。请注意,子框可能是一个匿名阻止框。

此外,如果元素有任何浮动子体,其底部边距边缘低于元素的底部内容边缘,则高度会增加以包括这些边缘。只有参与此块格式化上下文的浮点才会被考虑在内,例如,位于绝对位置的子体中的浮点或其他浮点不被考虑在内。

BFC的高度是auto的情况下,是如下方法计算高度的

1.如果只有inline-level,是行高的顶部和底部的距离;

2.如果有block-level,是由最底层的块上边缘和最底层块盒子的下边缘之间的距离

3.如果有绝对定位元素,将被忽略;

4.如果有浮动元素,那么会增加高度以包括这些浮动元素的下边缘

 

 

(2)解决外边距margin重叠

因为:The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.

两个同级(兄弟)框之间的垂直距离由“margin”属性决定。块格式上下文中相邻块级框之间的垂直边距折叠。

令两个box分别属于不同的BFC即可——“套娃”

 

 

 

相关文章
|
15天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
27 6
|
3月前
|
XML JSON 前端开发
json字符串CSS格式化
完成以上步骤后,你便能在网页中看到格式化后的JSON数据,它们将按照CSS定义的样式进行展示,使数据更易于阅读和理解。通过有效地结合JSON和CSS,你可以创建出更加丰富且易于交互的网页内容。
202 64
|
2月前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
114 1
|
2月前
|
前端开发 JavaScript
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
217 1
|
3月前
|
前端开发
前端基础(五)_CSS文本文字属性、背景颜色属性
本文详细介绍了CSS中关于文本和背景颜色的样式属性。包括字体大小、字体族、字体加粗、字体样式、文本行高、`font`属性、文本颜色、文本对齐方式、文本装饰线、首行缩进等文本属性,以及背景颜色、背景图片、背景重复、背景位置等背景属性。文章通过示例代码展示了这些属性的具体应用和效果。
50 3
前端基础(五)_CSS文本文字属性、背景颜色属性
|
2月前
|
前端开发 容器
前端技术分享:利用CSS Grid布局实现响应式设计
【10月更文挑战第1天】前端技术分享:利用CSS Grid布局实现响应式设计
|
2月前
|
前端开发 UED 容器
前端技术分享:利用 CSS Grid 实现响应式布局
【10月更文挑战第1天】前端技术分享:利用 CSS Grid 实现响应式布局
70 2
|
3月前
|
前端开发
前端基础(二)_HTML常用标签(块级标签、行级标签、行块级标签)
本文详细介绍了HTML中的常用标签,包括块级标签(如`h1`至`h6`、`p`、`div`等)、行级标签(如`span`、`b`、`strong`、`i`、`em`、`sub`、`sup`、`del`、`a`等),以及行块级标签(如`img`)。文章解释了这些标签的用途、特点和基本用法,并通过示例代码展示了如何在HTML文档中使用它们。
151 1
|
3月前
|
前端开发 数据可视化 容器
前端基础(十六)_BFC、box-shadow(盒子阴影)、text-shadow(文字阴影)
本文介绍了前端开发中块级格式化上下文(BFC)的概念和作用,以及如何创建BFC。同时,文章还讲解了`box-shadow`和`text-shadow`属性的用法,包括如何为元素添加阴影效果,并通过示例代码展示了这些属性的具体应用。
38 0
前端基础(十六)_BFC、box-shadow(盒子阴影)、text-shadow(文字阴影)
|
3月前
|
XML JSON 前端开发
json字符串CSS格式化
json字符串CSS格式化
66 4