CSS 捲動觸發動畫即將推出!

發布日期:2025 年 12 月 12 日

2023 年,我們推出了捲動驅動動畫,讓您透過捲動前進 (或倒轉) 動畫。使用捲動驅動動畫時,動畫進度會隨著捲動從 0% 推進到 100%。停止捲動時,動畫會暫停;向上捲動時,動畫會反向播放。

捲動式動畫的下一個章節將於 2026 年推出,Chrome 145 將支援捲動觸發動畫。這類動畫會根據時間觸發,並在捲動偏移量達到特定值時啟動。

這類效果現在可以在 CSS 中宣告,因此不需要再使用 IntersectionObserver

時間軸觸發條件、動畫觸發條件和動作

觸發動畫

如要在 CSS 中設定捲動觸發的動畫,請先為元素附加一般 CSS 動畫:

animation: unclip 0.35s ease-in-out both;

這項動畫會使用 DocumentTimeline 做為驅動程式,並執行 0.35 秒。網頁載入後,系統會自動觸發動畫。如要變更觸發條件,請使用新的 animation-trigger CSS 屬性:

animation-trigger: --t play-forwards play-backwards;

在這裡,動畫會設為由觸發條件 --t 觸發。觸發條件啟動時,系統會對動畫叫用 play-forwards 動作;觸發條件停用時,系統則會叫用 play-backwards 動作。

規格包含完整動作清單

建立觸發條件

但這個--t觸發條件是什麼?這是名為「--t」的觸發條件。如果是捲動觸發的動畫,則為「時間軸觸發」,會使用「捲動進度時間軸」或「檢視進度時間軸」做為來源。

如要定義時間軸觸發條件,請使用 timeline-trigger 屬性 (或其相關的簡寫)。舉例來說,如要建立名為 --t 的觸發條件,並使用檢視時間軸做為來源,請使用下列指令:

timeline-trigger-name: --t;
timeline-trigger-source: view();

這個建立的觸發條件 --t 會根據與相符元素相關聯的檢視時間軸啟用和停用。由於檢視時間軸的預設範圍是cover 範圍,因此觸發條件也會在該範圍內或範圍外啟用和停用。

調整觸發條件的範圍

如要調整觸發條件應處於啟用或停用狀態的位置,請在觸發條件中指定啟用和有效範圍。在以下範例中,啟用範圍設為 entry 100% exit 0%,表示主體進入該範圍後,就會觸發動作。

timeline-trigger:
  --t
  view()
  entry 100% exit 0%
;

由於上述程式碼片段未指定有效範圍,因此啟用範圍也會做為有效範圍。如果超出有效範圍,觸發條件就會停用。

結合已定義的 animation-trigger 時,這會在視覺上產生以下效果:主體完全進入捲動埠時,動畫會向前播放;主體即將離開捲動埠時,動畫會向後播放。

這段示範影片的觸發範圍設為 entry 100% exit 0%
影片也顯示偵錯線,指出範圍的開始和結束位置。

啟動範圍和有效範圍可能不同。例如:

timeline-trigger:
  --t
  view()
  entry 100% exit 0% / entry 0% exit 100%
;

在這裡,當主體位於 entry 100% exit 0% 範圍內時,就會觸發動作。觸發條件會保持有效,直到離開 entry 0% exit 100% 範圍為止。

從視覺上看,這會讓動畫在主體進入捲動檢視區塊時向前播放,且與先前不同的是,動畫會保持啟用狀態,直到主體完全離開捲動檢視區塊為止。

錄製示範,並將觸發範圍設為 entry 100% exit 0% / entry 0% exit 100%
示範也會顯示偵錯行,指出範圍的開始和結束位置。有效範圍會封閉捲動埠,因此無法看到偵錯線。

限制觸發條件的範圍

觸發條件會向全域顯示,也就是說,最後一個宣告特定名稱觸發條件的相符項目會「勝出」。如要限制觸發條件的顯示範圍,請使用 trigger-scope 屬性。這與 anchor-scope 的使用方式類似。

trigger-scope: --t; /* List of dashed idents, or `all` */

如果 CSS 規則宣告的觸發條件符合多個元素,您就需要使用 trigger-scope

示範

在下列示範中,表單會分割到各種全高區塊。當表單的每個部分進入檢視畫面時,系統會使用捲動觸發的動畫,以動畫方式顯示表單。離開捲動埠時,會以動畫效果隱藏。

這項功能的捲動觸發動畫邏輯如下:

@keyframes card {
  from { translate: 0 -50% 0; }
}

@keyframes card-contents {
  from { opacity: 0; height: 0px; }
  to { opacity: 1; height: auto; }
}

.card {
  overflow-y: clip; /* Hide any overflow in the y-axis */

  timeline-trigger:
    --t
    view()
    contain 15% contain 85% / entry 100% exit 0%
  ;
  trigger-scope: --t;

  animation: unclip var(--duration) ease-in-out both;
  animation-trigger: --t play-forwards play-backwards;
}

.card > * {
  interpolate-size: allow-keywords; /* To animate to `height: auto` */

  animation: card-contents var(--duration) ease-in-out both;
  animation-trigger: --t play-forwards play-backwards;
}

程式碼剖析如下:

  • timeline-trigger 名為 --t,來源設為追蹤相符元素的檢視時間軸。
  • 觸發條件的啟動範圍為 contain 15% contain 85%。當拍攝目標位於該範圍內時,觸發條件就會啟用。
  • 啟用後,只要主體位於 entry 100% exit 0% 的有效範圍內,觸發條件就會保持啟用狀態。
  • unclip 動畫已附加至元素。
  • 動畫已設為使用 --t 做為觸發來源。觸發條件啟動後,動畫會開始正向播放。
  • 當觸發條件停用 (也就是主體離開有效範圍時),動畫會反向播放。
  • 卡片內容也會使用相同的觸發條件 --t,以動畫效果顯示和隱藏。

如果瀏覽器不支援 timeline-trigger,這個範例會使用 IntersectionObserver 做為備用選項。

更多示範

如果捲動觸發的動畫不夠用,請參閱下列範例:

「認識怪物」示範的錄製內容。

意見回饋

我們很想聽聽你的意見,以便持續改善這項功能。歡迎透過社群媒體與我們聯絡,或在 CSS 工作群組中提出問題,提供意見回饋。

如果遇到錯誤,請回報 Chromium 錯誤,讓我們瞭解情況。已知錯誤清單:請參閱 Chromium 錯誤追蹤器