z-index
属性只对设置了定位属性的元素有效,这些定位属性包括:
position: relative;
position: absolute;
position: fixed;
position: sticky;
如果元素没有设置 position
属性,或者 position
的值是 static
(这是默认值),z-index
是没有效果的。即使设置了 z-index
,元素的层级仍然按照文档流中的顺序来决定。
示例:
<div style="z-index: 100;">This div has no positioning, so z-index won't work.</div>
每一个层叠上下文都是一个独立的层叠体系,它们之间的元素无法影响其他层叠上下文中的元素。常见的创建新的层叠上下文的情况包括:
position
属性为 relative
、absolute
、fixed
或 sticky
,并且 z-index
的值不是 auto
。opacity
属性值小于 1。transform
、filter
、perspective
、clip-path
等属性值不为 none
。will-change
属性指定了这些会影响层叠上下文的属性。当两个元素不在同一个层叠上下文中时,它们的 z-index
值无法相互比较。
示例:
<div style="position: relative; z-index: 2;">
<div style="position: absolute; z-index: 1;">Child with lower z-index</div>
</div>
<div style="position: relative; z-index: 1;">
<div style="position: absolute; z-index: 3;">Another stacking context</div>
</div>
在上面的示例中,最外层的两个 div
创建了不同的层叠上下文,因此它们的子元素的 z-index
值不会互相影响。
在同一个层叠上下文中,子元素的 z-index
值仅相对于父元素的兄弟元素来决定。换句话说,一个元素的 z-index
无法影响到它的父元素,父元素的层叠顺序总是优先于其子元素。
示例:
<div style="position: relative; z-index: 1;">
<div style="position: absolute; z-index: 10;">Child</div>
</div>
<div style="position: relative; z-index: 5;">Sibling</div>
在上述示例中,即使子元素 Child
的 z-index
比 Sibling
高,但由于 Child
是在父元素中,整个父元素(包括子元素)仍然会在 Sibling
元素后面。
除了 z-index
之外,层叠顺序还受到其他因素的影响,如背景和边框、浮动、块级元素、内联元素等。它们在没有 z-index
定义的情况下,按照浏览器的默认层叠顺序进行渲染。
理解 z-index
的工作机制需要了解层叠上下文、层叠顺序,以及 CSS 中的定位属性。只有在正确设置了定位属性且理解层叠上下文的情况下,才能正确地使用 z-index
控制元素的堆叠顺序。