常见概念
区块格式化上下文 BFC
区块格式化上下文(Block Formatting Context, BFC)是 web 页面的可视 CSS 渲染的一部分,是块级盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域
INFO
BFC,是 CSS 中的一个概念,定义了元素如何渲染内容以及与其他元素的交互,对元素布局和清除浮动方面有很大影响
主要特点:
1、BFC 是独立的布局环境
2、内部盒子会垂直排列
块级盒子会在垂直方向上一个接一个地排列
3、清除浮动的影响
4、不重叠外边距
创建 BFC 的方式:
文档的根元素(
<html>
)浮动元素(即
float
值不为none
的元素)绝对定位元素(
position
值为absolute
或fixed
的元素)行内块元素 display: inline-block/flex/grid
表格单元格(
display
值为table-cell
,HTML 表格单元格默认值)匿名表格单元格元素(display 值为 table(HTML 表格默认值)、table-row(表格行默认值)、table-row-group(表格体默认值)、table-header-group(表格头部默认值)、table-footer-group(表格尾部默认值)或 inline-table)
overflow 值不为 visible 或 clip 的块级元素
display 值为 flow-root 的元素
contain 值为 layout、content 或 paint 的元素
弹性元素(display 值为 flex 或 inline-flex 元素的直接子元素),如果它们本身既不是弹性、网格也不是表格容器
网格元素(display 值为 grid 或 inline-grid 元素的直接子元素),如果它们本身既不是弹性、网格也不是表格容器
多列容器(column-count 或 column-width 值不为 auto,且含有 column-count: 1 的元素)
column-span 值为 all 的元素始终会创建一个新的格式化上下文,即使该元素没有包裹在一个多列容器中
格式化上下文影响布局,通常,我们会为定位和清除浮动创建新的 BFC,而不是更改布局,因为它将:
包含内部浮动。
BFC 让浮动内容和周围的内容等高
排除外部浮动。
正常文档流中建立的 BFC 不得与元素本身所在的块格式化上下文中的任何浮动的外边距重叠
阻止外边距重叠。
可以创建新的 BFC 避免两个相邻元素之间的外边距重叠
层叠上下文
假定用户正面向(浏览器)视窗或网页,而 HTML 元素沿着其相对于用户的一条虚构的 z 轴排开,层叠上下文
就是对这些 HTML 元素的一个三维构想。众 HTML 元素基于其元素属性按照优先级顺序占据这个空间。
某些元素的渲染顺序是由其 z-index
的值影响的。这是因为这些元素具有能够使他们形成一个层叠上下文的特殊属性。
文档中的层叠上下文由满足以下任意一个条件的元素形成:
文档根元素(
<html>
);position 值为 absolute(绝对定位)或 relative(相对定位)且
z-index
值不为 auto 的元素;position 值为 fixed(固定定位)或 sticky(粘滞定位)的元素(沾滞定位适配所有移动设备上的浏览器,但老的桌面浏览器不支持);
flex (flex) 容器的子元素,且
z-index
值不为 auto;grid (grid) 容器的子元素,且
z-index
值不为 auto;opacity 属性值小于 1 的元素(参见 the specification for opacity);
mix-blend-mode 属性值不为 normal 的元素;
以下任意属性值不为 none 的元素:
transform
filter
backdrop-filter
perspective
clip-path
mask / mask-image / mask-border
isolation 属性值为 isolate 的元素;
will-change 值设定了任一属性而该属性在 non-initial 值时会创建层叠上下文的元素(参考这篇文章);
contain 属性值为 layout、paint 或包含它们其中之一的合成值(比如 contain: strict、contain: content)的元素。
z-index 不起作用的原因
1、没有设置 position
2、层叠上下文问题:z-index 只在同一个层叠上下文中有效
创建层叠上下文?
position: absolute/relative 且 z-index 不为 auto
position: fixed/sticky
设置 transform、filter、opacity(值小于 1)、perspective、clip-path、will-change、mix-blend-mode 等属性
display: flex/grid 等
3、元素的父级有较高的 z-index
4、兄弟元素的层叠顺序
5、opacity 或其他样式的影响
6、浏览器兼容问题
7、浮动元素和 z-index
8、遮挡元素的其他属性