網站導覽

設計變數

動態效果

動畫簡寫、持續時間值與緩動曲線。

本頁目錄

類別

類別宣告
animate-<animation>animation: var(--animate-<animation>);
animation-<duration>animation-duration: var(--duration-<duration>);
transition-<duration>transition-duration: var(--duration-<duration>);
animation-delay-<duration>animation-delay: var(--duration-<duration>);
transition-delay-<duration>transition-delay: var(--duration-<duration>);
animation-<easing>animation-timing-function: var(--easing-<easing>);
transition-<easing>transition-timing-function: var(--easing-<easing>);

animation- 與 transition- 前綴都同時讀取 duration 與 easing 命名空間。自訂鍵必須在兩個命名空間之間保持不同,否則相同的鍵會產生歧義。animate- 讀取的則是完整動畫簡寫。

值

十個動畫 token 包含關鍵影格名稱,並會無限重複。七個持續時間提供時間長度,九條緩動曲線則將時間進度對應到值進度。視覺比較只播放一次,初始狀態為暫停,並遵循減少動態效果偏好。

動畫

類別值
animate-fadefade 1s infinite
animate-flashflash 1s infinite
animate-floatfloat 3s ease-in-out infinite
animate-heartheart 1s infinite
animate-jumpjump 1s infinite
animate-pingping 1s infinite
animate-pulsepulse 1s infinite
animate-rotaterotate 1s linear infinite
animate-shakeshake 1s infinite
animate-zoomzoom 1s infinite
比較全部動畫
這裡的每個預設動畫只播放一次,初始狀態為暫停。「播放」、「暫停」與「重播」控制原生時間軸。偏好減少動態效果時,內容會保持靜止;上方表格仍保留完整的預設簡寫值。

持續時間

類別值
transition-fastest75ms
transition-faster.1s
transition-fast.15s
transition-normal.2s
transition-slow.3s
transition-slower.5s
transition-slowest.8s
比較全部持續時間
所有標記都沿著相同路徑以線性時間函數移動,只有持續時間不同。初始狀態為暫停,可一起播放或重播。偏好減少動態效果時,標記會保持靜止。

緩動

類別值
transition-smoothcubic-bezier(.4, 0, .2, 1)
transition-softcubic-bezier(.33, 1, .68, 1)
transition-crispcubic-bezier(.16, 1, .3, 1)
transition-snapcubic-bezier(.2, 0, 0, 1)
transition-acceleratecubic-bezier(.4, 0, 1, 1)
transition-deceleratecubic-bezier(0, 0, .2, 1)
transition-overshootcubic-bezier(.34, 1.56, .64, 1)
transition-rewindcubic-bezier(.36, 0, .66, -.56)
transition-springcubic-bezier(.68, -.6, .32, 1.6)
比較全部緩動曲線
所有標記都在一秒內走過相同路徑,只有時間函數不同。超越終點或倒退的曲線可能讓標記越過路徑端點。偏好減少動態效果時,標記會保持靜止。

覆寫動畫的一個部分

animate-pulse 設定完整的 animation 簡寫,包括 1s 的持續時間。條件相同時,animation-slow 會排在簡寫之後,並將持續時間替換為 300ms。關鍵影格名稱與迭代次數維持不變;調整 class 屬性中的順序也不會改變結果。

持續時間 class 改變時間設定,但保留相同關鍵影格

兩者使用相同的 pulse 關鍵影格。長條量測的是一次迭代的持續時間,不是動畫進度或渲染速度。預設集會重複播放,這個比較則單獨呈現一次迭代。

文字說明
  1. animate-pulse 簡寫提供 pulse 1s infinite,每次迭代的持續時間為一秒。
  2. 條件相同時,animation-slow 會排在 animate-pulse 之後,只將持續時間替換為 var(--duration-slow),也就是 300ms。pulse 關鍵影格與無限迭代次數維持不變。
  3. 兩條水平長條都從零開始,在同一條毫秒軸上呈現 1000:300 的長度比例。它們量測的是宣告的單次迭代持續時間,不是效能,也不是形狀移動的距離。
  4. 預設的 pulse token 會無限重複。需要只播放一次時,請加入原生迭代次數或定義自訂 token;調整 class 名稱的順序不會改變生成規則的順序。

使用持續時間或緩動家族調整其中一個部分,或使用它們的變數組成自訂動畫 token。(animation-duration:450ms) 這類明確的原生宣告可以提供字面值覆寫。兩條長條以相同時間尺度呈現一次迭代,不是在比較渲染效能。

動畫 token 會保留其值所參照的關鍵影格。單獨的持續時間或緩動 class 不會指定動畫名稱。轉場也需要有屬性值發生變更;transition-fast 提供的是持續時間,不是 hover 狀態或屬性清單。

延遲改變的是效果開始時間,不會拉長持續時間。緩動則改變持續時間內的進度。控制點超出垂直 0–1 範圍的曲線,可能產生超越端點或倒退的效果;不過動畫屬性本身仍可能限制實際渲染的值。

非必要的動態效果請加上 @motion-safe 條件。若要讓預設動畫只播放一次,請在相同條件下加入 (animation-iteration-count:1)。如何為元件組成進場動畫,請見主題指南;擷取頁面狀態之間的轉場,則由檢視轉場指南說明。

用法

允許動態效果時,為連結 hover 後的背景變化加入緩動。連結會返回值對照表。

<a href="#values" class="… (transition-property:background-color) transition-fast@motion-safe transition-smooth@motion-safe bg-surface-inset:hover">View motion values</a>
產生的 CSS
@layer theme {  :root,  :host {    --color-zinc-5: oklch(96.5% .0011 265);    --color-zinc-100: oklch(15% .0016 265)  }  :root,  :host {    --color-surface-inset: light-dark(var(--color-zinc-5), var(--color-zinc-100))  }  :root,  :host {    --duration-fast: .15s;    --easing-smooth: cubic-bezier(.4, 0, .2, 1)  }}@layer utilities {  .\(transition-property\:background-color\) {    transition-property: background-color  }  .bg-surface-inset\:hover:hover {    background-color: var(--color-surface-inset)  }  @media (prefers-reduced-motion: no-preference) {    .transition-fast\@motion-safe {      transition-duration: var(--duration-fast)    }  }  @media (prefers-reduced-motion: no-preference) {    .transition-smooth\@motion-safe {      transition-timing-function: var(--easing-smooth)    }  }}

自訂

以持續時間與緩動 token 組成動畫,並在原生 CSS 中宣告關鍵影格:--animate-reveal 會建立 animate-reveal。

@theme {  --animate-reveal:    reveal var(--duration-slow) var(--easing-crisp) both;}@keyframes reveal {  from { opacity: 0; translate: 0 .5rem; }}
產生的 CSS
@keyframes reveal {  from {    opacity: 0;    translate: 0 .5rem;  }}@layer theme {  :root,  :host {    --duration-slow: .3s;    --easing-crisp: cubic-bezier(.16, 1, .3, 1)  }  :root,  :host {    --animate-reveal: reveal var(--duration-slow) var(--easing-crisp) both  }}@layer utilities {  @media (prefers-reduced-motion: no-preference) {    .animate-reveal\@motion-safe {      animation: var(--animate-reveal)    }  }}