在 Chrome 22 中,position:fixed
元素的版面配置行為與先前版本略有不同。所有 position:fixed
元素現在都會形成新的堆疊內容。這麼做會變更部分網頁的堆疊順序,可能會導致網頁版面配置出現問題。這項新行為與行動裝置 (iOS Safari 和 Android 版 Chrome) 上的 WebKit 瀏覽器行為相符。
堆疊什麼?
大家都知道並喜歡使用 z-index
來決定網頁上元素的深度排序。不過,並非所有 z-index 都相同:元素的 z-index
只會決定其相對於相同堆疊內容中的其他元素的排序。頁面上的大多數元素都位於單一根疊放內容情境中,但具有非自動 z-index
值的絕對或相對定位元素會形成自己的疊放內容情境 (也就是說,所有子項都會在父項中以 z 順序排列,且不會與父項以外的內容交錯)。自 Chrome 22 起,position:fixed
元素也會建立自己的堆疊內容。
如要概略瞭解堆疊內容,請參閱 這篇 MDN 文章。
比較 position:fixed
和 new position:sticky 屬性:position:sticky
一律會建立新的堆疊內容,請參考這點。
動機
行動版瀏覽器 (行動版 Safari、Android 瀏覽器、以 Qt 為基礎的瀏覽器) 會將 position:fixed 元素放入自己的堆疊內容,且已持續一段時間 (自 iOS 5、Android Gingerbread 等版本起),因為這可進行特定捲動最佳化,讓網頁對觸控的回應速度更快。我們做出這項變更的原因有三:
- 在「行動」和「電腦」瀏覽器上顯示不同的轉譯行為,是網頁作者的絆腳石;CSS 應盡可能在所有地方運作相同。
- 在平板電腦上,我們無法確定「行動裝置」或「電腦」堆疊內容建立演算法哪個比較適合。
- 將捲動效能最佳化從行動裝置延伸到電腦,對使用者和作者都很有幫助。
變更的具體內容
以下是顯示不同版面配置行為的範例:https://codepen.io/paulirish/pen/CgAof
經過變更後,兩個版本都會呈現右側的版本。
在這個範例中,綠色方塊有 z-index: 1
、粉紅色方塊有 z-index: 3
,而橘色方塊有 z-index: 2
。藍色方塊是橘色方塊的祖系,且具有 position:fixed
。
如果藍色方塊有自己的堆疊內容,橘色方塊的 z-index
會相對於藍色方塊的堆疊內容計算。由於藍色方塊的 z-index
為 auto
,因此在根堆疊內容中,其堆疊層級為零,這表示橘色方塊會位於綠色和粉紅色方塊後方,因為這兩個方塊在根內容中的 z-index 分別為 1 和 3。
如果藍色方塊沒有取得自己的堆疊內容,橘色方塊的 z-index
會相對於根堆疊內容 (以及綠色和粉紅色方塊) 計算。因此,橘色方塊最終會與粉紅色和綠色方塊交錯排列。
如要進一步瞭解建立堆疊情境的條件 (以及堆疊情境的一般行為),請參閱這篇 MDN 文章。在這個範例中,由於藍色方塊的透明度小於 1,因此右側版本一律會為其提供自己的堆疊內容。行為變更會有效新增另一個建立單獨堆疊內容的條件,也就是元素的 position:fixed。
測試與未來
如要測試頁面是否會變更,請前往 Chrome 的 about:flags
,然後開啟/關閉「固定位置元素建立堆疊內容」。如果版面配置在兩種情況下都會以相同方式運作,就表示設定正確無誤。如果不是,請確認啟用該標記後的顯示效果是否符合你的期望,因為這將是 Chrome 22 的預設設定。
這項變更會移除一項功能,也就是在 position:fixed 子樹中,使用來自外部的非捲動內容交錯內容的功能。任何網頁開發人員都不會刻意這麼做,而且只要將多個 position:fixed 元素指派至 DOM 的不同部分,就能產生相同效果。舉例來說,請參考以下兩個範例:
https://codepen.io/wiltzius/pen/gcjCk
這個頁面會嘗試取得 position:fixed 元素的兩個子 div (overlayA 和 overlayB),並將其中一個置於單獨內容 div 上方,另一個置於同一單獨內容 div 下方。但現在無法執行此操作,因為 position:fixed 元素是其自身堆疊內容,且該元素 (連同所有子項) 會完全位於內容 div 上方或下方。請注意,這個範例適用於 Chrome 21 及更早版本,但不適用於 Chrome 22。
如要修正這個問題,可以將這兩個覆蓋圖層分成各自的 position:fixed 元素。每個都是各自的堆疊內容,其中一個可置於內容 div 之上,另一個可置於內容 div 之下。請參閱已修正的範例,這個範例可在 Chrome 21 和 22 中運作:
https://codepen.io/wiltzius/pen/vhFzG
Chrome 是第一個讓 position:fixed 元素建立自身堆疊內容的電腦版瀏覽器。相關標準是 CSS Z-index 規格 (例如 https://www.w3.org/TR/CSS21/zindex.html)。我們目前尚未就行動版和電腦版瀏覽器的差異做出結論,但考量到行動版和電腦版的行為不同會造成混淆,Chrome 暫時會在兩個平台上採用相同的行為。
2012 年 10 月 1 日更新:本文原始版本指出 CSS z-index
規格已變更,以反映 position: fixed 元素的新行為。這項說法並不正確,雖然在 www-style 清單中曾討論過這項問題,但目前規格尚未做出任何變更。