自動記數的CSS原生語法:sibling-index()、sibling-count()
CSS 中「兄弟元素」的應用與痛點
在網頁切版與動畫設計中,我們經常遇到需要根據「元素是第幾個」或「總共有幾個元素」來改變樣式的情境。例如:
- 交錯動畫 (Staggered Animation):讓列表中的項目一個接一個出現,而不是同時出現。
- 動態寬度:根據容器內有多少個項目,自動計算每個項目的寬度。
- 階梯狀視覺:依序改變背景色深淺或位置偏移。
在過去,要純用 CSS 達成這些效果非常繁瑣。我們通常只能依賴 :nth-child() 寫死一堆規則(例如寫 50 行 CSS 來對應 50 個項目),或是使用 SCSS 的迴圈在編譯時產生代碼。更靈活的做法則是依賴 JavaScript 去計算並動態賦予 CSS 變數(如 --index, --total)。因此原生的 CSS 解決方案因此備受期待。
![]() |
| 此圖片由AI生成 |
sibling-index() 與 sibling-count()
sibling-index()返回該元素在兄弟節點中的索引值(通常從 1 開始計算,具體依實作而定)。它相當於 JavaScript 中遍歷 DOM 得到的 index。
sibling-count()返回該元素的父容器下,包含自己在內共有多少個兄弟節點總數。它相當於 JavaScript 中的 parentNode.children.length。
基本語法範例:
.item {
/* 讓每個項目的動畫延遲時間隨索引增加 */
animation-delay: calc(sibling-index() * 0.1s);
/* 根據總數量自動計算寬度 */
width: calc(100% / sibling-count());
}
CodePen 實例解析
接下來我們透過 CodePen 實作一些簡單的範例。
See the Pen sibling-index(), sibling-count() by cj (@cjzopen) on CodePen.
自動計數與視覺堆疊
在範例中,透過 sibling-index(),我們可以為每一個卡片或列表項目設定獨立的 Z 軸層級或顏色變化,而不需要手動撰寫 nth-child(1), nth-child(2)... 等冗長的選擇器。
例如,若要製作一個卡片堆疊效果,越後面的卡片越往右移:
.card {
/* 只要寫這一行,所有卡片都會自動依序排列 */
transform: translateX(calc(sibling-index() * 20px));
}
這意味著,無論你後來在 HTML 中增加或減少了多少個 .card 元素,CSS 都不需要修改,樣式會自動適應。
目前的限制
雖然這兩個功能看起來非常強大,但現階段使用上仍有極大的限制,開發者必須謹慎評估:
- 目前主要僅有 Chromium 核心瀏覽器支援此語法。
- 無法藉用此語法寫出自訂的::before ::after 樣式。
總結與 CSS 未來展望
sibling-index() 與 sibling-count() 的出現,標誌著 CSS 正逐漸從單純的「樣式描述語言」演進為具備更多邏輯運算能力的語言。這讓「樣式」與「DOM 結構」的耦合度更低,樣式表變得更聰明。
雖然目前僅限於 Chromium 瀏覽器體驗,但隨著 CSS 規範的推進,未來我們有望在所有主流瀏覽器中,享受到這種「寫一行抵一百行」的開發體驗。


留言
張貼留言