BFC到底是什么?IFC、GFC、FFC?

1、BFC的定义

我们常说的文档流分为普通流、浮动流与定位流三种。
FC(formatting context格式化上下文),指的是一块渲染区域,依靠渲染规则,决定其子元素如何布局及与其他元素的关系和作用。
FC分为BFC、IFC、GFC和FFC,其中BFC(block formatting context)块级格式化上下文
BFC可以简单的理解为某个元素的一个css属性,只不过这个属性不能被开发者显式的修改,拥有这个属性的元素对内部元素和外部元素会表现出一些特性,这就是BFC。

2、关于BFC、IFC、GFC和FFC

CSS2.1中只有BFC和IFC, CSS3中才有GFC和FFC。

What’s FC?
一定不是KFC,FC的全称是:Formatting Contexts,是W3C CSS2.1规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

BFC

BFC(Block Formatting Contexts)直译为"块级格式化上下文"。Block Formatting Contexts就是页面上的一个隔离的渲染区域,容器里面的子元素不会在布局上影响到外面的元素,反之也是如此。如何产生BFC?
float的值不为none。
overflow的值不为visible。
position的值不为relative和static。
display的值为table-cell, table-caption, inline-block中的任何一个。
那BFC一般有什么用呢?比如常见的多栏布局,结合块级别元素浮动,里面的元素则是在一个相对隔离的环境里运行。

IFC

IFC(Inline Formatting Contexts)直译为"内联格式化上下文",IFC的line box(线框)高度由其包含行内元素中最高的实际高度计算而来(不受到竖直方向的padding/margin影响)
IFC中的line box一般左右都贴紧整个IFC,但是会因为float元素而扰乱。float元素会位于IFC与与line box之间,使得line box宽度缩短。 同个ifc下的多个line box高度会不同。 IFC中时不可能有块级元素的,当插入块级元素时(如p中插入div)会产生两个匿名块与div分隔开,即产生两个IFC,每个IFC对外表现为块级元素,与div垂直排列。
那么IFC一般有什么用呢?
水平居中:当一个块要在环境中水平居中时,设置其为inline-block则会在外层产生IFC,通过text-align则可以使其水平居中。
垂直居中:创建一个IFC,用其中一个元素撑开父元素的高度,然后设置其vertical-align:middle,其他行内元素则可以在此父元素下垂直居中。

GFC

GFC(GridLayout Formatting Contexts)直译为"网格布局格式化上下文",当为一个元素设置display值为grid的时候,此元素将会获得一个独立的渲染区域,我们可以通过在网格容器(grid container)上定义网格定义行(grid definition rows)和网格定义列(grid definition columns)属性各在网格项目(grid item)上定义网格行(grid row)和网格列(grid columns)为每一个网格项目(grid item)定义位置和空间。
那么GFC有什么用呢,和table又有什么区别呢?首先同样是一个二维的表格,但GridLayout会有更加丰富的属性来控制行列,控制对齐以及更为精细的渲染语义和控制。

FFC

FFC(Flex Formatting Contexts)直译为"自适应格式化上下文",display值为flex或者inline-flex的元素将会生成自适应容器(flex container),可惜这个牛逼的属性只有谷歌和火狐支持,不过在移动端也足够了,至少safari和chrome还是OK的,毕竟这俩在移动端才是王道。
Flex Box 由伸缩容器和伸缩项目组成。通过设置元素的 display 属性为 flex 或 inline-flex 可以得到一个伸缩容器。设置为 flex 的容器被渲染为一个块级元素,而设置为 inline-flex 的容器则渲染为一个行内元素。
伸缩容器中的每一个子元素都是一个伸缩项目。伸缩项目可以是任意数量的。伸缩容器外和伸缩项目内的一切元素都不受影响。简单地说,Flexbox 定义了伸缩容器内伸缩项目该如何布局。

此部分原文:https://www.cnblogs.com/dingyufenglian/p/4845477.html

3、BFC的特点

1.内部的box会在垂直方向上,一个接一个地放置

<header>我是header</header>
<div>我是div</div>

在这里插入图片描述

2.box垂直方向的距离由margin决定,属于同一个bfc的两个box相邻的margin会发生重叠

 <style>
     .one{
          width: 100px;
          height: 100px;
          background-color: pink;
          margin:10px;
      }
      .two{
          width: 100px;
          height: 100px;
          background-color: yellow;
          margin:10px;
      }
 </style>
 <body>
    <div class="one"></div>
    <div class="two"></div>
</body>

在这里插入图片描述

3.BFC区域内部box的左边margin与BFC区域左边border相接触(如果是从右到左格式化则相反,即使浮动也一样)

<style>
    aside{
          width: 60px;
          height: 40px;
          background-color: pink;
          float:left;
      }
      main{
          width: 150px;
          height: 150px;
          background-color: blue;
      }
</style>
<body>
    <aside>有浮动块</aside>
    <main>无浮动块</main>
</body>

在这里插入图片描述

4.bfc的区域不会与float box重叠,不存在层级,即永远在同一层

<style>
    aside{
          width: 60px;
          height: 40px;
          background-color: pink;
          float:left;
      }
      main{
          width: 150px;
          height: 150px;
          background-color: blue;
          float:left;
      }
</style>
<body>
    <aside>有浮动块</aside>
    <main>无浮动块</main>
</body>

在这里插入图片描述

5.bfc是一个隔离的独立容器,容器内的子元素不会影响外面的元素

<style>
   .parent{
        width: 300px;
        border:1px solid red;
    }
    .one,
    .two{
        width: 50px;
        height: 50px;
        float: left;
        background-color: orange;
        margin-left: 10px;
    }
</style>
<div class="parent">
   <div class="one"></div>
   <div class="two"></div>
</div>

当父元素本身不是BFC区域时,子元素的大小不会加入的父元素大小的计算中,因此出现了高度塌陷
在这里插入图片描述

而当我们把父元素设置为BFC渲染区域时(给父元素样式加float:left),则浮动子元素会参与父元素总体大小的计算
在这里插入图片描述

4、BFC的触发条件

1.根元素,即html

2.float不为none

3.position为absolute或fixed

4.display为inline-block、table-cell、table-caption、flex、inline-flex

5.overflow不为visible

5、BFC的作用

1.自适应两栏布局

2.可以阻止元素被浮动元素覆盖

3.可以包含浮动元素——内部清除浮动

给父div加上 overflow: hidden;清除浮动原理:触发父div的BFC属性,使下面的子div都处在父div的同一个BFC区域之内,此时已成功清除浮动。还可以向同一个方向浮动来达到清除浮动的目的,清除浮动的原理是两个div都位于同一个浮动的BFC区域之中。

4.属于不同的BFC时可以阻止margin重叠

当两个相邻块级子元素分属于不同的BFC时可以阻止margin重叠。操作方法:给其中一个div外面包一个div,然后通过触发外面这个div的BFC,就可以阻止这两个div的margin重叠。

文章主体原文链接:https://blog.csdn.net/m0_46613429/article/details/119213853?spm=1001.2014.3001.5501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值