Communitygithub.com

CGWebDev2003/cg-web-animate

专家技能,用于设计、实现、审查和优化高级网页动画和动效系统。适用于任何需要设计或改进动画效果的网站、落地页、Web应用、React/Next.js界面等场景。

cg-web-animate 是什么?

该技能为AI代理和开发者提供了一套完整的、以用户为中心的高级网页动效设计方法论。它强调动效必须有明确目的,服务于界面设计,而非单纯装饰。技能详细阐述了四级动效层级(全局/英雄、区块、组件、微交互),并附有清晰的技术选型决策树(从CSS、原生Web API到GSAP、Framer Motion等复杂库),确保开发者能为每个动效选择最合适的技术实现。此外,还提供了关于缓动函数、时间系统、文本动画、滚动触发动画、悬停交互和性能优化的具体指导,旨在构建一致、高性能且具有品牌表达力的动效系统。该技能支持所有主流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–1200ms
  • 完整编排 1000–2000ms

层级 2 — 区块动画

用于在滚动时建立节奏。

示例:

  • 区块展示
  • 图片入场
  • 文本展示
  • 卡片组
  • 固定滚动叙事
  • 水平滚动区块

特征:

  • 强度低于英雄动画
  • 通常由视口/滚动触发
  • 不应与内容竞争

典型时长:

  • 400–900ms

层级 3 — 组件动画

用于交互。

示例:

  • 按钮
  • 卡片
  • 导航
  • 下拉菜单
  • 手风琴
  • 模态框
  • 标签页
  • 工具提示

特征:

  • 快速
  • 可预测
  • 响应迅速
  • 频繁重复

典型时长:

  • 120–350ms

层级 4 — 微动效

微小的细节。

示例:

  • 图标运动
  • 下划线
  • 微小的缩放
  • 透明度过渡
  • 指示器移动
  • 加载反馈

特征:

  • 几乎不可见
  • 永不分散注意力
  • 通常使用 CSS

典型时长:

  • 100–250ms

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/视频 + 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–80ms    微交错
60–120ms   组件组
80–160ms   英雄版式
100–200ms  戏剧性序列

使用交错来传达结构,而不是为了延长动画时间。


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">你的标题</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. 滚动编排

在构建滚动驱动体验时,定义:

触发器
开始
结束
进度
运动
缓动
固定
擦洗
退出

示例:

触发器: 英雄区块
开始: 区块进入视口
结束: 区块离开视口
进度: 滚动位置
运动: 图片缩放 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 时:

  • 避免动画化会导致不必要重新渲染的 state/props
  • 使用 refs 直接动画化 DOM 元素,而不是通过 state 驱动所有动画
  • 利用 useMemo 和 useCallback 处理动画配置
  • 考虑使用 motion 组件(来自 Motion)实现声明式入场/离场
  • 使用 Next.js App Router 时,利用 View Transitions API 实现页面过渡
  • 与服务器端渲染 (SSR) 结合时,确保关键动画库正确初始化
  • 在动画密集型组件上使用 React.memo 防止不必要的渲染
  • 使用 CSS content-visibility 或在 IntersectionObserver 回调中延迟初始化某些动画
  • 优先使用 transform 和 opacity 以利用 React 的合成事件和浏览器的图层合成
  • 使用 Framer Motion 的 AnimatePresence 处理列表和路由的优雅入场/离场

21. 无障碍

动效不得使内容无法访问。

prefers-reduced-motion

始终尊重用户的减少动画偏好。

@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;
  }
}

如果使用 GSAP:

const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)");

if (prefersReducedMotion.matches) {
  gsap.set(".animated-element", { opacity: 1, y: 0, scale: 1 });
}

或使用 GSAP 的 gsap.ticker.lagSmoothing(0) 禁用平滑。

运动敏感度

避免:

  • 大面积闪烁或频闪
  • 高对比度交替
  • 突然的视差深景
  • 视口内不必要的持续运动
  • 全屏过渡旋转

22. 品牌动效系统

将动效视为品牌资产。

创建并记录:

品牌动效语言
├── 核心理念
├── 缓动曲
├── 时间比例
├── 层级与序列
├── 色彩与动效
├── 排版动效规则
├── 交互模式
├── 空间方向约定
├── 滚动行为
├── 页面过渡
├── 加载与空状态
├── 减少动效策略

同一网站的所有动画应感觉来自同一系统。


23. 技术栈

优先使用已存在的技术栈。

如果团队已在用 GSAP,不要引入 Motion。

如果团队已在用 Motion,不要引入 GSAP。

除非有经过测试的性能或功能要求。


24. 代码与交付

代码准则

  • 对于动画,优先使用 CSS 变量而非硬编码值
  • 将 GSAP 时间线定义为可复用函数
  • 提取 magic numbers 为命名常量
  • 保持动效代码靠近使用它的组件(colocation)
  • 使用一致的命名约定(例如 animate-*, motion-*, reveal-*)
  • 为 ScrollTrigger 实例编写清理函数
  • 考虑 SSR 兼容性(window 检查、动态导入)

交付清单

  • 动效是否服务于界面?
  • 是否有更简单的技术?
  • 缓动是否一致?
  • 时机是否一致?
  • 是否支持减少动效?
  • 在移动端测试过吗?
  • 在低端设备上表现如何?
  • 网络较慢时会怎样?
  • 用户能感到什么?
  • 两个连续动效会冲突吗?
  • 动画化的是 transform 还是布局属性?
  • 是否增加了不必要的库?
  • 动效是否练习?

25. 建议实现

直接查询

  • "为这个 hero 部分设计一个高级入场序列"
  • "为这个广告牌系列创建一个滚动驱动的叙事"
  • "为这个界面设计交互反馈动效语言"
  • "审核此页面的性能与动效应"
  • "为此品牌创建动效系统规范"
  • "为这个 Next.js 应用设计页面过渡"
  • "优化此 React 组件的入场动效"
  • "为此部分建议文本动画"
  • "为此产品展示实现视差和深度"
  • "在 react 或 next 中实现水平滚动部分"

相关技能