什么是BFC?看这一篇就够了

什么是BFC?看这一篇就够了BFC 定义 BFC Blockformatt 直译为 块级格式化上下文 它是一个独立的渲染区域 只有 Block levelbox 参与 它规定了内部的 Block levelBox 如何布局 并且与这个区域外部毫不相干 在解释什么是 BFC 之前 我们需要先知道 Box FormattingCo 的概念 Box css 布局的基本单位 Box 是 CSS 布局

BFC 定义

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

在解释什么是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 fomatting context;
  • inline-level box:display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与 inline formatting context;
  • run-in box: css3 中才有, 这儿先不讲了。
Formatting Context

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

BFC是一个独立的布局环境,其中的元素布局是不受外界的影响,并且在一个BFC中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。

BFC的布局规则

  • 内部的Box会在垂直方向,一个接一个地放置。
  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
  • 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  • BFC的区域不会与float box重叠。
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  • 计算BFC的高度时,浮动元素也参与计算。

如何创建BFC

  • 1、float的值不是none。
  • 2、position的值不是static或者relative。
  • 3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex
  • 4、overflow的值不是visible

BFC的作用

1.利用BFC避免margin重叠。

一起来看一个例子:

 
   
    
     
     防止margin重叠 
      
     

看看我的 margin是多少

看看我的 margin是多少

 
   
    
     
     防止margin重叠 
      
     

看看我的 margin是多少

看看我的 margin是多少

在这里插入图片描述

2.自适应两栏布局

根据:

  • 每个盒子的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
 
   
    
     
     Document 
      
     
LEFT
RIGHT

又因为:

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

所以我们让right单独成为一个BFC

 
   
    
     
     Document 
      
     
LEFT
RIGHT

right会自动的适应宽度,这时候就形成了一个两栏自适应的布局。

3.清楚浮动。

当我们不给父节点设置高度,子节点设置浮动的时候,会发生高度塌陷,这个时候我们就要清楚浮动。

比如这样:

 
   
    
     
     清除浮动 
      
     

这个时候我们根据最后一条:

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

给父节点激活BFC

 
   
    
     
     清除浮动 
      
     

总结

以上例子都体现了:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200464.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:47
下一篇 2026年3月20日 上午10:47


相关推荐

  • Claude Code使用教程

    Claude Code使用教程

    2026年3月16日
    1
  • 谈谈序列化—实体bean一定要实现Serializable接口?

    谈谈序列化—实体bean一定要实现Serializable接口?导读 最近在做项目的过程中 发现一个问题 就是我们最开始的时候 传递参数包括返回类型 都有 map 类型 但是由于 map 每次都要匹配 key 值 很麻烦 所以在之后就将参数传递和返回类型全都改成了实体 bean 并且让每个 bean 都实现了 Serializable 接口 然后 在这里的时候 就有点疑惑 首先 为什么要进行序列化 其次 每个实体 bean 都必须实现 serializabel 接口吗 最后 我做一些项目的

    2026年3月17日
    2
  • Unity Odin从入门到精通(三):静态检查器详解

    Unity Odin从入门到精通(三):静态检查器详解前言:开发者可以使用静态检查器来选择项目工程、Unity引擎、.Net框架中所有的类型,并查看其所有的静态成员。打开静态检查器:在Unity的菜单栏中选择【Tools->OdinInspector->StaticInspector】菜单项来打开静态检查器。如下图所示:查看静态检查器的源码:首先在Rider当中切换到Assemblies视图。接着在该视图的列表当中选择Sirenix.OdinInspector.Editor程序集。然后从该程序集的列表当中选择Sirenix.Odi

    2022年7月21日
    15
  • springboot项目启动原理_相关滤波器的基本原理

    springboot项目启动原理_相关滤波器的基本原理一、springboot启动原理及相关流程概览springboot是基于spring的新型的轻量级框架,最厉害的地方当属自动配置。那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置二、springboot的启动类入口用过springboot的技术人员很显而易见的两者之间的差别就是视觉上很直观的:springboot有自己独立的启动类(独立…

    2025年10月29日
    5
  • 零基础学Java(12)静态字段与静态方法

    零基础学Java(12)静态字段与静态方法静态字段与静态方法之前我们都定义的main方法都被标记了static修饰符,那到底是什么意思?下面我们来看看静态字段如果将一个字段定义为static,每个类只有一个这样的字段。而对于非静态的实例

    2022年7月29日
    8
  • Java 枚举(enum) 详解五种常见的用法

    Java 枚举(enum) 详解五种常见的用法nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp Java 枚举 enum 详解五种常见的用法一 枚举型常量 packagecom yang 首先枚举是一个特殊的 class 这个 class 相当于 finalstatic 修饰 不能被继承 他的构造方法强制被私有化 下面有一个默认的构造方法

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号