BFC、IFC
2024-11-27
BFC、IFC
BFC
块级格式化上下文(Block formatting contexts)。它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。通俗的讲,就是一个特殊的块,内部有自己的布局方式,不受外边元素的影响。
渲染规则
- 内部的box会在垂直方向一个个排列
- 属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠(塌陷),与方向无关。margin 水平方向不会发生重叠
- 每个元素的左外边距与包含块的左边界相接触(从左向右),即使浮动元素也是如此。(这说明 BFC 中子元素不会超出他的包含块,而 position 为 absolute 的元素可以超出他的包含块边界)
- BFC 的区域不会与 float 的元素区域重叠
- 计算 BFC 的高度时,浮动子元素也参与计算
- BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然
产生条件
- 根元素,html元素本身就是BFC
- 浮动元素:float属性不为none(脱离文档流)
- 绝对定位元素:position 属性为 absolute 或 fixed (绝对与固定定位)
- 非块级盒子的块级容器:display 属性为 inline-block、table-cell、table-caption、flex、inline-flex、grid、inline-grid、flow-root(最佳,无副作用) ,定义成块级的非块级元素
- overflow 属性不为 visible(- overflow: auto/ hidden),非溢出的可见元素
这些元素创建了BFC
BFC应用
1自适应两栏布局
利用 BFC 的这一个原理就可以实现两栏布局,左边定宽,右边自适应。不会相互影响,哪怕高度不相等。BFC 的区域不会和浮动区域重叠,所以就可以把侧边栏固定宽度且左浮动,而对右侧内容触发 BFC,使得它的宽度自适应该行剩余宽度。
2解决垂直外边距重叠问题
让两个元素不在同一个BFC中即可解决
3清除内部浮动
我们在给子元素设置了float: left|right之后父元素会坍塌,所以清除浮动需要解决的问题就是让父元素的高度恢复正常。而用 BFC 清除浮动的原理就是:计算 BFC 的高度时,浮动元素也参与计算。 只要触发父元素的 BFC 即可,如设置overflow:hidden
。
IFC
内联格式化上下文(Inline Formatting Context)
IFC 的形成条件非常简单,块级元素中仅包含内联级别元素,需要注意的是当IFC中有块级元素插入时,会产生两个匿名块将父元素分割开来,产生两个 IFC。
渲染规则
- 子元素在水平方向上一个接一个排列,在垂直方向上将以容器顶部开始向下排列
- 节点无法声明宽高,其中 margin 和 padding 在水平方向有效,在垂直方向无效
- 节点在垂直方向上以不同形式对齐
- 能把在一行上的框都完全包含进去的一个矩形区域,被称为该行的线盒(line box)。线盒的宽度是由包含块(containing box)和与其中的浮动来决定
- IFC 中的 line box 一般左右边贴紧其包含块,但 float 元素会优先排列。
- IFC 中的 line box 高度由 line-height 计算规则来确定,同个 IFC 下的多个 line box 高度可能会不同
- 当内联级盒子的总宽度少于包含它们的 line box 时,其水平渲染规则由 text-align 属性值来决定
- 当一个内联盒子超过父元素的宽度时,它会被分割成多盒子,这些盒子分布在多个 line box 中。如果子元素未设置强制换行的情况下,inline box 将不可被分割,将会溢出父元素。
应用场景
1水平居中
当一个块要在环境中水平居中时,设置其为 inline-block 则会在外层产生 IFC,通过 text-align 则可以使其水平居中。
2垂直居中
创建一个 IFC,用其中一个元素撑开父元素的高度,然后设置其vertical-align: middle
,其他行内元素则可以在此父元素下垂直居中。