Skip to content

FC (Formatting Context)

格式化上下文是页面中的一块渲染区域,并且有一套渲染规则,决定了子元素如何定位,以及与其他元素的关系及相互作用。

BFC (Block Formatting Context)

块级格式化上下文指的是一块独立的布局区域,盒子内部元素的布局与外部不会互相影响。

触发方式

  • 根元素(<html>)。
  • 浮动元素(float不为none)。
  • 绝对定位元素(positionabsolute/fixed)。
  • overflow不为visible的元素。
  • displayinline-block/table-cell/flex的元素。

布局规则

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

应用场景

  • 自适应两栏布局(左浮动 + 右BFC)。
  • 避免margin重叠问题(触发新的BFC)。
  • 解决父元素高度坍塌问题(父容器触发BFC)。
  • 清除浮动(父容器触发BFC)。

IFC (Inline Formatting Context)

内联格式化上下文指的是内联盒子的渲染区域,行内盒子按照水平方向排列。

触发方式

  • 块级元素中仅包含内联级别元素。

布局规则

  • 在一个IFC内,子元素是水平方向横向排列的,并且垂直方向起点为元素顶部。
  • 子元素只会计算横向样式空间(paddingbordermargin),垂直方向样式空间不会被计算。
  • 在垂直方向上,子元素会以不同形式来对齐vertical-align
  • 能把在一行上的框都完全包含进去的一个矩形区域,被称为该行的行框(line box)。行框的宽度是由包含块(containing box)和与其中的浮动来决定。
  • IFC中的line box一般左右边贴紧其包含块,但float元素会优先排列。
  • IFC中的line box高度由 CSS 行高计算规则来确定,同个IFC下的多个line box高度可能会不同。
  • inline boxes的总宽度少于包含它们的line box时,其水平渲染规则由 text-align 属性值来决定。
  • 当一个inline box超过父元素的宽度时,它会被分割成多个boxes,这些boxes分布在多个line box中。如果子元素未设置强制换行的情况下,inline box将不可被分割,将会溢出父元素。

应用场景

  • 行内元素水平排列。
  • 图标与文字垂直居中。

GFC (Grid Formatting Context)

网格格式化上下文指的是通过display: gird创建的二维布局结构,由网格容器控制子项位置。

触发方式

  • 元素设置display值为grid或者inline-grid

布局规则

  • 通过在网格容器(grid container)上定义网格定义行(grid-template-rows)网格定义列(grid-template columns)属性定义行和列的大小和数量。
  • 使用gap属性何止行和列之间的间距。

应用场景

  • 响应式网页骨架。
  • 复杂仪表盘。
  • 杂志式布局。

FFC (Flexible Formatting Context)

弹性格式化上下文指的是通过display: flex创建的一维弹性容器,按主轴/侧轴分配子项空间。

触发方式

  • 元素设置display值为flex或者inline-flex。

布局规则

  • 设置为 flex 的容器被渲染为一个块级元素。
  • 设置为 inline-flex 的容器被渲染为一个行内元素。
  • 弹性容器中的每一个子元素都是一个弹性项目。弹性项目可以是任意数量的。弹性容器外和弹性项目内的一切元素都不受影响。简单地说,Flexbox 定义了弹性容器内弹性项目该如何布局。

应用场景

  • 卡片式布局。
  • 自动撑开剩余宽度/高度布局。

相关问题

flex: 1代表什么

flex:1flex-grow: 1; flex-shrink:1; flex-basis: 0%;的缩写。

  • flex-grow:定义项目如何分配多余空间;默认为0(有剩余空间也不放大);为1时会占据剩余空间。
  • flex-shrink:定义项目在空间不足时如何收缩;默认为1(空间不足时缩小);为0时空间不足也不缩小。
  • flex-basis:定义项目的基础大小;项目占据的主轴空间。默认值为 auto,表示项目的大小由其内容决定;为0时,项目的初始化大小不考虑内容大小。

Released under the MIT License.