1. FC-Formatting Context
FC的全称是Formatting Context,元素在标准流里面都是属于一个FC的。
-
块级元素的布局属于 Block Formatting Context(BFC),也就是block level box都是在BFC中布局的
-
行内级元素的布局属于 Inline Formatting Context(IFC),而inline level box都是在IFC中布局的
2. BFC官方文档解读
-
官方文档的描述
-
简单概括如下:
-
在BFC中,box会在垂直方向上一个挨着一个的排布
-
垂直方向的间距由margin属性决定
-
在同一个BFC中,相邻两个box之间的margin会折叠(collapse)
-
在BFC中,每个元素的左边缘是紧挨着包含块的左边缘的
-
-
在哪些具体的情况下会创建BFC:
-
根元素(
<html>) -
浮动元素(元素的 float 不是 none)
-
绝对定位元素(元素的 position 为 absolute 或 fixed)
-
行内块元素(元素的 display 为 inline-block)
-
表格单元格(元素的 display 为 table-cell,HTML表格单元格默认为该值),表格标题(元素的 display 为 table-caption,HTML表格标题默认为该值)
-
匿名表格单元格元素(元素的 display 为 table、table-row、 table-row-group、table-header-group、table-footer-group(分别是HTML table、row、tbody、thead、tfoot 的默认属性)或 inline-table)
-
overflow 计算值(Computed)不为 visible 的块元素
-
弹性元素(display 为 flex 或 inline-flex 元素的直接子元素)
-
网格元素(display 为 grid 或 inline-grid 元素的直接子元素)
-
display 值为 flow-root 的元素
-
3. BFC的应用
3.1 消除折叠效果
- 官方描述
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.
-
给某一个元素放到另外一个BFC中
<style> .container { /* 形成BFC */ overflow: auto; } .box1 { height: 200px; width: 400px; background-color: orange; margin-bottom: 30px; } .box2 { height: 150px; background-color: purple; margin-top: 50px; } </style> <div class="container"> <div class="box1"></div> </div> <div class="box2"></div>
3.2 浮动高度塌陷
注意:BFC不能解决绝对定位元素的高度塌陷问题
-
BFC解决高度塌陷需要满足两个条件:
-
浮动元素的父元素触发BFC,形成独立的块级格式化上下文(Block Formatting Context)
-
浮动元素的父元素的高度是auto的
<style> .container { background-color: orange; /* 形成BFC */ overflow: auto; } .item { width: 400px; height: 200px; box-sizing: border-box; border: 1px solid #000; float: left; background-color: #f00; } </style> <div class="container clear_fix"> <div class="item"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> </div> -
-
BFC的高度是auto的情况下,计算高度的方法如下:
-
如果只有inline-level,是行高的顶部和底部的距离
-
如果有block-level,是最底层的块上边缘和最底层块盒子的下边缘之间的距离
-
如果有绝对定位元素,将被忽略 (所以解决不了绝对定位元素高度塌陷的问题)
-
如果有浮动元素,那么会增加高度以包括这些浮动元素的下边缘
-
4. 说说你对BFC的理解(面试题)
- block format context(块级格式化上下文)
- 是页面的一块渲染区域 并且有一套渲染规则,决定了子元素如何定位以及与其他元素之间的排列布局之间的关系
- BFC是一个独立的布局环境 相当于是一个容器 在其中按照一定的规则对块级元素进行摆放,并且不会影响其他的布局环境中的盒子,如果一个元素触发BFC则BFC中的元素布局不受外界的影响
- 块级元素在标准流中的布局是属于BFC的
- 创建BFC的条件:
- 根元素: body/:root
- float left/right
- position absolute/fixed
- overflow: 除visible
- display: inline-block/table-cell/table-caption ,flex/grid...
- 特点
- 垂直方向 自上而下排布
- 垂直方向的间距由margin决定
- 同一个BFC中 盒子之间的margin会折叠
- BFC中 每个元素的左边缘紧挨着包含快的左边缘
- 计算 BFC 的高度时,需要计算浮动元素的高度
- BFC内部不会影响外部元素
- BFC区域不会与浮动的元素发生重叠