子元素的 z-index 只在父元素創建的「層疊上下文」內比較,無法與父元素外部元素直接比較。 父元素的 z-index 決定了整個層疊上下文在父級上下文中的層級。
以下任一條件會使元素創建**新的層疊上下文**:
position: relative/absolute/fixed/sticky 且 z-index 不為 auto(數值、0 皆可)。opacity < 1transform / filter / perspective / clip-path / mask 等非 none 值。isolation: isolatewill-change 指定上述屬性。z-index 不為 auto 的子項。
根層疊上下文 (html)
├── 父元素 A (z-index: 20) → 創建層疊上下文 A
│ ├── 子元素 A1 (z-index: 100) → 僅在 A 內比較
│ └── 子元素 A2 (z-index: 50)
└── 兄弟元素 B (z-index: 10) → 創建層疊上下文 B
└── 子元素 B1 (z-index: 1000) → 僅在 B 內比較
**渲染順序**:A (z:20) 疊在 B (z:10) 上方 → A 內所有子元素**整體**疊在 B 及其子元素上方,無論 A1 z-index 多大。
參考 JSFiddle 示例:
z-index: 20,子元素 z-index: 100。z-index: 10。解決:
position: relative + z-index、opacity 等觸發條件(若布局允許)。body(React/Vue 常用)。事實:z-index 只在**定位元素**或 **Flex/Grid 子項** 生效,但**創建層疊上下文**的條件更多(見上表)。
z-index,查看元素所在層疊上下文層級。outline: 1px solid red 觀察疊加順序。子元素 z-index **不與父元素比較**,而是在父元素創建的**層疊上下文內部**比較。父元素的層級決定了整個家族在外部的高度。理解「層疊上下文」是解決 z-index 疑難雜症的鑰匙。