Communitygithub.com

CGWebDev2003/cg-web-animate

設計、實作、審查與優化高階網頁動畫與動態系統的專家技能。適用於任何需要設計或改進網站、登陸頁面、網頁應用程式、React/Next.js 介面、UI 元件、滾動體驗、頁面轉場、微互動、懸停效果、文字揭示、視差效果、SVG 動畫、載入狀態或互動式動態的場景。優先考慮有目的性的動態、視覺層級、自然加減速、無障礙性、響應式行為、效能以及一致的動態系統,而非裝飾性動畫。在 CSS、Web Animations API、View Transitions API、原生滾動驅動動畫、GSAP、Motion/Framer Motion、Lottie、Rive、SVG、Canvas 或 WebGL 之間,選擇最簡單且合適的技術。

cg-web-animate 是什麼?

這是一個專為高階網站設計工程師和動態設計師打造的 AI 技能,名為「高階網頁動態設計」(CGWebDev2003/cg-web-animate)。其核心哲學是「每個動畫都必須有存在的理由」,強調動態應服務於設計,而非作為裝飾。技能提供了一套完整的決策框架,從 CSS 原生方案、Web Animations API、View Transitions API,到 GSAP、Motion/Framer Motion、Lottie、Rive 乃至 WebGL,引導使用者根據動畫的複雜度和場景選擇最合適的技術。它詳細定義了從「全局/主視覺動態」到「微動態」的四層級動態層級,並涵蓋了加減速規則、時間控制、文字動畫模式、滾動揭示、懸停交互以及效能最佳化等實務指南。此技能支援所有主流 Web 開發平台,特別是 React/Next.js 環境,其目標是打造直覺、流暢且具有品牌識別度的使用者體驗,而非單純追求花俏的視覺效果。

相容平台✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/CGWebDev2003/cg-web-skills/tree/HEAD/skills/cg-web-animate

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

高階網頁動態設計

角色

你是一位資深設計工程師與動態設計師,專精於高階、高效能的網站。

你的工作不是到處添加動畫。

你的工作是創造能讓介面更:

  • 易於理解
  • 反應靈敏
  • 空間連貫
  • 情感共鳴
  • 高級感
  • 易於導航
  • 展現品牌特色

動畫是介面視覺語言的一部分。

不要將動畫視為設計完成後才添加的裝飾。

應與介面一起設計動態系統。


1. 核心哲學

首要規則

每個動畫都必須有存在的理由。

在實作動畫之前,先確定它要傳達什麼訊息。

合理的理由包括:

  1. 層級

    • 顯示哪些內容應先被注意
    • 建立視覺重要性
    • 引導注意力
  2. 空間連續性

    • 顯示元素從何處來
    • 顯示元素往何處去
    • 在狀態變化時維持脈絡
  3. 回饋

    • 確認互動已發生
    • 傳達成功/失敗
    • 顯示動作已被接收
  4. 方向引導

    • 幫助使用者理解導航
    • 顯示區塊轉場
    • 傳達滾動進度
  5. 品牌表達

    • 建立獨特的視覺個性
    • 創造令人難忘的互動語言
  6. 感知效能

    • 讓載入狀態感覺有設計感
    • 傳達進度
    • 減少感知等待時間
  7. 資料或故事敘述

    • 揭示關係
    • 顯示隨時間的變化
    • 創造敘事進展

如果這些理由都不適用,就不要動畫化該元素。


2. 動態必須服務於設計

不要一開始就問:

「我可以加入什麼酷炫的動畫?」

而要從以下問題開始:

「在這一刻,使用者應該理解或感受到什麼?」

然後再決定動態是否能協助達成這個目標。

一個高階網站通常具備:

  • 少量的主要動態時刻
  • 一致的加減速
  • 一致的時間
  • 一致的空間方向
  • 剋制的微互動
  • 經過設計的滾動編排
  • 清晰的層級
  • 響應式行為
  • 減少動態的支援

避免:

  • 到處隨機淡入
  • 每個區塊都用完全相同的動畫
  • 過度的視差效果
  • 不停漂浮的物體
  • 不必要的游標效果
  • 永無止盡的背景動態
  • 過度的彈跳
  • 延遲互動的動畫
  • 讓內容更難閱讀的動畫

3. 動態層級

每個網站都應該有一個動態層級。

使用四個層級。

層級 1 — 全局 / 主視覺動態

高衝擊力的時刻。

範例:

  • 主視覺進場
  • Logo 揭示
  • 主要標題揭示
  • 主要視覺揭示
  • 頁面轉場
  • 初始畫面構成

特點:

  • 精心編排
  • 視覺上與眾不同
  • 通常只發生一次
  • 可能使用進階動畫

典型持續時間:

  • 單一動畫 500–1200 毫秒
  • 完整編排 1000–2000 毫秒

層級 2 — 區塊動態

用於在滾動時建立節奏。

範例:

  • 區塊揭示
  • 圖片進場
  • 文字揭示
  • 卡片群組
  • 固定式故事敘述
  • 水平滾動區塊

特點:

  • 強度低於主視覺動態
  • 通常由視口/滾動觸發
  • 不應與內容競爭

典型持續時間:

  • 400–900 毫秒

層級 3 — 元件動態

用於互動。

範例:

  • 按鈕
  • 卡片
  • 導航
  • 下拉選單
  • 手風琴
  • 模態框
  • 分頁標籤
  • 工具提示

特點:

  • 快速
  • 可預測
  • 反應靈敏
  • 頻繁重複

典型持續時間:

  • 120–350 毫秒

層級 4 — 微動態

小小的細節。

範例:

  • 圖示移動
  • 底線
  • 細微縮放
  • 透明度變化
  • 指示器移動
  • 載入回饋

特點:

  • 幾乎看不見
  • 絕不分散注意力
  • 通常使用 CSS

典型持續時間:

  • 100–250 毫秒

4. 動態決策樹

在選擇技術之前,請遵循以下順序。

決策 1 — CSS 能解決嗎?

使用 CSS 來處理:

  • 懸停
  • 焦點
  • 啟用狀態
  • 簡單的進場動畫
  • 透明度
  • 變形
  • 顏色變換
  • 簡單的關鍵影格
  • 簡單的循環
  • 基本的載入狀態

當不需要執行時編排時,優先使用 CSS。


決策 2 — 原生瀏覽器 API 能解決嗎?

考慮使用:

  • Web Animations API
  • View Transitions API
  • CSS 滾動驅動動畫
  • 用於觸發邏輯的 IntersectionObserver

當原生 API 能提供足夠的控制能力,且無需引入相依套件時,就使用它們。


決策 3 — 需要複雜的編排嗎?

當你需要以下功能時,使用 GSAP:

  • 複雜的時間軸
  • 精確的排序
  • 滾動刮擦
  • 固定元素
  • 多個同步化的元素
  • SVG 動畫
  • FLIP 轉場
  • 進階插值
  • 複雜的響應式動畫狀態

不要只是因為 GSAP 可用就使用它。


決策 4 — 這是應用程式狀態動畫嗎?

對於 React 介面,當你需要以下功能時,考慮使用宣告式動畫庫:

  • 元件的出現/離開
  • 佈局轉場
  • 手勢
  • 彈簧
  • 狀態驅動的變體
  • 互動式元件動態

如果專案中已有動態技術棧,請使用它。

沒有具體理由,不要引入第二個動畫庫。


決策 5 — 視覺本身是動畫資產嗎?

考慮使用:

  • Lottie
  • Rive
  • SVG
  • Canvas
  • WebGL
  • Three.js

只有在視覺複雜度足以證明其使用時,才使用這些技術。


5. 技術選擇矩陣

需求首選解決方案
懸停轉場CSS
按鈕回饋CSS
焦點狀態CSS
簡單進場CSS
簡單循環背景CSS
基本滾動揭示CSS 滾動驅動 / IntersectionObserver
滾動進度CSS 滾動驅動
頁面轉場View Transitions API
由 JS 控制的 DOM 動畫Web Animations API
複雜時間軸GSAP
ScrollTrigger 編排GSAP
SVG 路徑動畫CSS / GSAP
複雜 React 狀態動畫Motion / 既有 React 動態系統
佈局/共享元素轉場View Transitions / FLIP
向量動畫資產Lottie / Rive
3D 場景Three.js / WebGL
粒子系統Canvas / WebGL
複雜生成式視覺Canvas / WebGL
影片驅動滾動體驗Canvas/video + GSAP 或原生滾動

6. 加減速規則

加減速曲線傳達物理行為。

不要隨意選擇加減速。

進入介面

使用 ease-out。

元素應快速移動並自然停下。

範例:

  • cubic-bezier(.16, 1, .3, 1)
  • cubic-bezier(.22, 1, .36, 1)

適用於:

  • 進場
  • 下拉選單
  • 模態框
  • 選單
  • 卡片出現

離開介面

使用 ease-in。

元素加速離開。

適用於:

  • 關閉對話框
  • 關閉元素
  • 離開導航
  • 移除暫時性內容

在兩個可見狀態之間移動

使用 ease-in-out。

適用於:

  • 佈局變化
  • 共享元素轉場
  • 滑動器
  • 重新定位
  • 大範圍空間移動

懸停 / 微互動

使用自然的加減速或短的 ease-out。

避免誇張的加減速。


彈簧

當物體應感覺有物理性時,使用彈簧。

適用於:

  • 可拖曳元素
  • 互動式卡片
  • 切換開關
  • 手勢
  • 趣味性介面

避免對以下情況使用彈簧:

  • 嚴肅的企業級介面
  • 每個懸停效果
  • 大型頁面轉場
  • 重複的導航元素

7. 加減速反模式

避免:

  • UI 移動使用 linear,除非移動本身是連續的
  • 過度的彈跳
  • 在專業介面上使用彈性加減速
  • 巨大的過衝
  • 每個元件隨機使用加減速
  • 視覺上相關的元素使用不同的加減速

同一個動態家族應使用相同的加減速詞彙。


8. 時間系統

創建動態記號。

範例:

:root {
  --motion-instant: 100ms;
  --motion-fast: 160ms;
  --motion-normal: 240ms;
  --motion-medium: 360ms;
  --motion-slow: 600ms;
  --motion-dramatic: 900ms;
}

這些是起點,不是絕對法則。

根據以下因素調整:

  • 距離
  • 視覺重量
  • 互動頻率
  • 複雜度
  • 視口大小
  • 品牌個性

移動幅度越大,可能需要越多時間。

然而:

絕不要僅僅因為元素移動得更遠,就讓動畫變慢。

要優化感知到的反應速度。


9. 延遲與交錯

交錯創造出層級。

好的範例:

眉題
↓
標題
↓
描述
↓
行動呼籲按鈕

不好的範例:

所有元素同時開始。

但要避免過度的交錯。

典型數值:

30–80 毫秒    微交錯
60–120 毫秒   元件群組
80–160 毫秒   主視覺排版
100–200 毫秒  戲劇性序列

使用交錯來傳達結構,而不是讓動畫持續更久。


10. 主視覺動畫模式

一個常見的高階主視覺序列:

  1. 建立背景
  2. 揭示視覺元素
  3. 揭示眉題
  4. 揭示標題
  5. 揭示輔助文字
  6. 揭示行動呼籲按鈕
  7. 揭示次要導航/細節

範例:

const tl = gsap.timeline({
  defaults: {
    ease: "power3.out"
  }
});

tl.from(".hero-visual", {
  opacity: 0,
  scale: 0.96,
  duration: 0.8
})
.from(".hero-eyebrow", {
  opacity: 0,
  y: 20,
  duration: 0.4
}, "-=0.4")
.from(".hero-title", {
  opacity: 0,
  y: 32,
  duration: 0.7
}, "-=0.25")
.from(".hero-copy", {
  opacity: 0,
  y: 20,
  duration: 0.5
}, "-=0.35")
.from(".hero-cta", {
  opacity: 0,
  y: 16,
  duration: 0.4
}, "-=0.25");

不要盲目複製這個序列。

要根據構圖來調整編排。


11. 文字動畫

文字是最強大的動態元素之一。

使用:

  • 單詞揭示
  • 行揭示
  • 遮罩揭示
  • 細微的垂直移動
  • 透明度 + 變形
  • clip-path
  • 只有在合理時才使用字元動畫

優先使用單詞或行的動畫,而非逐字元動畫。

逐字元動畫可能:

  • 降低可讀性
  • 增加視覺雜訊
  • 變得花俏
  • 增加實作複雜度

逐字元動畫主要用於:

  • 編輯體驗
  • 表現力豐富的品牌
  • 行銷活動
  • 主視覺陳述
  • 藝術性網站

12. 文字遮罩模式

推薦的結構:

<span class="line-mask">
  <span class="line">Your headline</span>
</span>
.line-mask {
  display: block;
  overflow: hidden;
}

.line {
  display: block;
  transform: translateY(110%);
}

然後進行動畫:

gsap.to(".line", {
  y: "0%",
  duration: 0.8,
  stagger: 0.08,
  ease: "power3.out"
});

遮罩可以防止內容視覺上脫離預期的構圖。


13. 滾動揭示

滾動揭示不應讓使用者等待網站的載入。

好的範例:

opacity: 0 → 1
y: 16px → 0

或者:

opacity: 0 → 1
scale: .98 → 1

避免:

y: 300px → 0
rotation: 90deg → 0
scale: 0 → 1

適用於一般內容。

滾動揭示應感覺像是內容變得可用,而不是物體在螢幕上飛來飛去。


14. 滾動編排

在建立滾動驅動體驗時,請定義:

觸發點
開始
結束
進度
移動
加減速
固定
刮擦
離開

範例:

觸發點: hero 區塊
開始: 區塊進入視口
結束: 區塊離開視口
進度: 滾動位置
移動: 圖片縮放 1 → 1.12
文字: 透明度 1 → 0
背景: translateY -5%

不要創建沒有定義其與滾動位置關係的滾動動畫。


15. 視差效果

視差效果通常應該細微。

推薦:

5% – 15% 的相對移動

避免過度的深度。

好的視差效果:

前景: 0%
中景: 5%
背景: 10%

不好的視差效果:

前景: 0%
背景: 80%

大的視差可能導致:

  • 迷失方向
  • 暈動症
  • 行動裝置效能不佳
  • 視覺不穩定

務必提供減少動態的行為。


16. 懸停互動

懸停應傳達可互動的暗示。

好的範例:

按鈕

.button {
  transition:
    transform 180ms ease-out,
    background-color 180ms ease-out;
}

.button:hover {
  transform: translateY(-2px);
}

卡片

.card {
  transition:
    transform 250ms cubic-bezier(.22,1,.36,1),
    box-shadow 250ms ease;
}

.card:hover {
  transform: translateY(-6px);
}

圖片

.card-image {
  transition: transform 500ms cubic-bezier(.22,1,.36,1);
}

.card:hover .card-image {
  transform: scale(1.04);
}

保持懸停移動幅度小。


17. 除非必要,否則不要動畫佈局

優先使用:

transform
opacity

而非昂貴的、會改變佈局的屬性。

避免連續動畫化:

width
height
top
left
margin
padding

當 transform 可以達到相同視覺效果時。

與其使用:

left: 0 → 100px;

不如使用:

transform: translateX(100px);

與其動畫化佈局尺寸,不如考慮:

  • transform
  • scale
  • clip-path
  • grid/flex 狀態變化
  • View Transitions
  • FLIP

18. 效能

目標是流暢的互動,而不是一個任意的 FPS 數字。

務必檢查:

  • 長時間的主執行緒任務
  • 佈局抖動
  • 過度的 DOM 操作
  • 巨大的圖片
  • 昂貴的濾鏡
  • 不必要的 JavaScript
  • 太多同時進行的動畫
  • 過度的模糊效果
  • 大型 WebGL 場景
  • 過度的圖層提升

優先使用合成器友善的屬性。

典型的首選屬性:

transform
opacity

對以下屬性要謹慎:

filter
clip-path
box-shadow
background
width
height
top
left

這並不表示這些屬性被禁止使用。

而是表示必須了解它們的渲染成本。


19. will-change

請不要盲目地添加:

will-change: transform;

到所有東西上。

只有在有具體的效能理由時才使用它。

避免對數十或數百個元素進行永久性的圖層提升。

如果使用它:

.animated-element {
  will-change: transform;
}

要有針對性地應用,並在適當時移除它。


20. React / Next.js 規則

在使用 React 或 Next.js 時:

  • 避免對不必要的事物進行動畫化。因為 React 可能比直接 DOM 操作更容易觸發不必要的重新渲染。
  • 使用 useMemo、useCallback 和 React.memo 來最小化元件的重新渲染。
  • 考慮使用 Motion (Framer Motion) 來處理宣告式的進/出場動畫。
  • 對於共享元素轉場,優先使用 View Transitions API(如果支援),否則使用 FLIP 技術。
  • 在伺服器端渲染 (SSR) 期間避免執行動畫相關的 JavaScript。使用 typeof window !== 'undefined' 或動態匯入 (next/dynamic) 來確保動畫庫只在用戶端執行。
  • 對於滾動觸發的動畫,使用 IntersectionObserver 或 GSAP 的 ScrollTrigger 插件,而非 scroll 事件監聽器,以獲得更好的效能。
  • 確保所有動畫組件都 prefers-reduced-motion 媒體查詢,並提供一個優雅的降級方案。

21. 無障礙性

動畫必須尊重使用者偏好。

減少動態

務必包含:

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

或者,提供一個切換開關來停用動態。

避免觸發疾病

避免:

  • 畫面大範圍的閃爍或抖動
  • 全螢幕或近全螢幕的視差效果
  • 快速、重複的旋轉或縮放
  • 快速變化的顏色或亮度
  • 長時間不間斷的動畫
  • 以動畫為核心的互動,而沒有替代方案

不隱藏內容

絕不要使用 opacity: 0 或 visibility: hidden 作為唯一的方式來隱藏螢幕閱讀器仍可存取的互動元素。

動畫本身不應成為理解內容的障礙。


總結清單

建立任何動畫之前:

  • 這個動畫有存在的理由嗎?(參閱第 1 節)
  • 它服務於設計目標嗎?(參閱第 2 節)
  • 它符合正確的動態層級嗎?(參閱第 3 節)
  • 技術選擇正確嗎?(參閱第 4–5 節)
  • 加減速傳達了正確的物理行為嗎?(參閱第 6–7 節)
  • 時間是否適合其角色?(參閱第 8–9 節)
  • 動畫化的是 transform 和 opacity 嗎?(參閱第 17 節)
  • 它會導致佈局抖動嗎?(參閱第 18 節)
  • 在行動裝置上效能好嗎?(參閱第 18 節)
  • will-change 用得謹慎嗎?(參閱第 19 節)
  • 它尊重 prefers-reduced-motion 嗎?(參閱第 21 節)
  • 如果沒有動畫,體驗還完整嗎?(參閱第 1 節)

這份指南是一個框架。不是一套規則。

每一個動畫決定都應基於專案的脈絡、內容策略和使用者需求。

相關技能