当z-index似乎不起作用时,通常是由于对CSS层叠上下文(stacking context)理解不够深入导致的。以下是系统性的排查和解决方法:
问题:z-index只对定位元素(position值不为static的元素)有效
/* 无效 */
.element {
z-index: 10;
position: static; /* 默认值 */
}
/* 有效 */
.element {
z-index: 10;
position: relative/absolute/fixed/sticky;
}
问题:子元素的z-index只在父元素的层叠上下文中有效
.parent {
position: relative;
z-index: 1; /* 创建新的层叠上下文 */
}
.child {
position: absolute;
z-index: 9999; /* 只在parent的上下文中有效 */
}
CSS默认层叠顺序(从下到上): 1. 根元素的背景和边框 2. 普通流中的非定位块级元素 3. 浮动元素 4. 普通流中的非定位行内元素 5. 定位元素(z-index:auto或0) 6. 定位元素(z-index>0)
以下属性也会创建新的层叠上下文: - opacity < 1 - transform不为none - filter不为none - will-change指定了上述属性 - isolation: isolate - mix-blend-mode不为normal
.parent {
position: relative;
z-index: 10; /* 高于同级元素 */
}
/* 避免 */
.unnecessary-context {
opacity: 0.99;
transform: translateZ(0);
}
/* 改为 */
.optimized {
/* 无特殊属性 */
}
.container {
isolation: isolate; /* 显式创建独立层叠上下文 */
}
:root {
--z-modal: 1000;
--z-dropdown: 500;
--z-tooltip: 200;
}
.modal {
z-index: var(--z-modal);
}
通过理解这些原理和采用系统化的排查方法,您应该能够解决大多数z-index失效的问题。