自動記數的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 規範的推進,未來我們有望在所有主流瀏覽器中,享受到這種「寫一行抵一百行」的開發體驗。

留言

這個網誌中的熱門文章

如何產生醒目顯示文字的連結?讓使用者一目瞭然的功能(Scroll to Text Fragment)

用CSS的 min max與vw cqw,設計有極限值的RWD響應式文字

Google Search Console 網頁發現方式多了「參照網頁」