前端三十|04. [CSS] z-index 與 Stacking Context 的關係是什麼?

Schaos
Schaos’s Blog
Published in
6 min readSep 19, 2019

--

不知道大家有沒有這樣的經驗:在排版時無論 z-index 怎麼調整,元素仍然被其他東西蓋住,怎麼調都調不好;今天我們將會深入理解這背後的原因,一起來聊聊 z-index 及與它相關的 堆疊環境(Stacking Context)

本系列文已經重新編校彙整編輯成冊,並正式出版囉!

前端三十:從 HTML 到瀏覽器渲染的前端開發者必備心法好評販售中!

喜歡我文章內容的讀者們,歡迎您前往購買支持

z-index

相信這個 CSS 屬性大家應該都不陌生,是用來指定元素在 z 軸的「高度」(越大越靠近使用者);在 CSS2.1 的規格 中指明:

For a positioned box, the ‘z-index’ property specifies:

1. The stack level of the box in the current stacking context.
2. Whether the box establishes a stacking context.

這邊的 positioned box 指的是 position 屬性不為預設值(static)的元素(box 指盒模型);所以 z-index 即為指定元素在 堆疊環境 中的 堆疊層級,且它只在 positioned box 上生效。

眼尖的同學應該已經注意到了,又出現了 昨天文章 就已經提到過的 Stacking Context,那麼它究竟是什麼呢?

堆疊環境 Stacking Context

在網頁排版時,預設的元素排列會是由上到下、由左到右的依序排列;開發者如果想要調整或固定特定元素的位置,會透過設定 positionrelativeabsolutefixed,讓指定的元素可以從原本的排列位置移動,甚至離開(Out of Flow)。而這時,也就產生了一個新的 CSS 堆疊環境,從此這個元素及它的子元素,就自成一國,他們的排列也就與其他的堆疊環境無關了。

功能

那這些自成一國的堆疊環境,對開發者來說有什麼影響呢?

很簡單!堆疊環境內的元素、屬性變動,是不會觸發其他堆疊環境的回流(Reflow)的喔~

昨天討論的瀏覽器的渲染步驟,其實還有最後一步:一個 Render Tree 經過計算後會轉換成許多堆疊環境,也可以理解成…

--

--