设计知识库DESIGN KB DS 2.0 · 2026-10
DESIGN SYSTEM 2.0 · 2026-10-18

组件、状态、动效、3D
把规范变成能执行的东西

你现在缺的不是更多原则,是三样东西:组件的状态怎么定、中间态怎么画、动效和 3D 到底从哪来。

这一页把 5 个问题一次答完:设计系统该怎么组织、组件和中间态怎么写、动效库和灵感从哪找、3D landing 用什么做、我们自己还缺什么。每个判断都能落到一个文件、一个 token 或一个组件上。

30+ 参考系统与产品12 个动效库10 个 3D 技术栈15 个缺口30 天计划

00先给结论

不绕弯子:我们的设计系统现在是一份很好的“视觉 token 表”,但还不是一套“能交接的系统”。

① token 有了,组件规范没有

tokens.md 的两层结构(结构/主题)做得比多数团队好;但 501 条元素没有收敛成组件清单,组件没有 anatomy、variants、states、API、a11y 字段。

② 静态样式有了,中间态没有

我们画了默认态、hover 态,但拍卖/交易/验证真正难的是 pending、confirmed、failed、stale、refunded——这些状态没有统一的词、颜色和下一步动作。

③ 动效是手写 CSS,没有体系

现有动效全部是本地 keyframes + transition,没有引 GSAP/Lottie/Three。不是坏事,但缺“动效 token → 语义 → 编排 → 降级”的规范。

④ 酷炫 3D 大多不是真 3D

大量 landing page 用的是预渲染视频、滚动帧序列、CSS 3D 或 WebGL 背景;真 3D hero 的成本在素材、性能和移动端降级,不在代码。

一句话设计系统不是“颜色 + 字号 + 间距”,而是组件 + 状态 + 内容 + 动效 + 治理五件套。我们前两件有雏形,后三件基本空白——这就是“感觉不规范”的来源。

01别人怎么组织设计系统:别抄“九段”,抄“三张表”

这次把 Material / Carbon / Polaris / Primer / Spectrum 的导航、组件页、状态表逐页核过;OpenDesign 的“九段”有两个互相矛盾的说法,必须分清。

先纠正三个流传很广的错误① “OpenDesign 九段 = Color/Typography/Spacing/Layout/Components/Motion/Voice/Brand/Anti-patterns”来自非官方粉丝站 opendesigner.io,不是仓库实际 schema;② 仓库实际 DESIGN.md 的九段是另一套(见下表);③ “71 套系统”是 4 月个人 fork 的旧徽章,上游现在约 151 个 packages / 153 个目录,博客写 150。引用前先看仓库,不看二手文章。

OpenDesign 实际在做什么

它不是组件库,而是“给 AI 读的品牌生成规格”:一个系统一个目录,manifest.json + DESIGN.md + tokens.css,可选 USAGE.md、components.html、design-tokens.json。DESIGN.md 是从品牌官网逆向提取的视觉语言(Linear 22KB、Stripe 20KB),解决“生成一个看起来像 Linear 的落地页”,不解决“按钮 disabled 用哪个 token”。

#仓库实际九段(A,可作准)它规定什么我们 tokens.md 有没有
1Visual Theme & Atmosphere品牌气质、关键特征清单没有
2Color Palette & Roles按角色分组的色值与用途有(结构/主题两层)
3Typography Rules字体、字重、字距、OpenType 特性有字号阶梯
4Component Stylings按钮/卡片/输入/导航的样式配方有 13 组静态规格
5Layout Principles栅格、容器、间距节奏没有(只在 CSS 里)
6Depth & Elevation阴影栈、边框、层级有零散阴影,无层级规范
7Do's and Don'ts正反例没有
8Responsive Behavior断点降级规则没有
9Agent Prompt Guide喂给模型的色值/Prompt/迭代守则没有

对照结果:9 段里我们有 4 段(Color / Typography / Components 的部分 / Depth 的零散值),缺 5 段。粉丝站那套 B(Color/Type/Spacing/Layout/Components/Motion/Voice/Brand/Anti-patterns)不是仓库 schema,但其中 Voice 与 Anti-patterns 值得单独补——只是别写成“OpenDesign 官方九段”。

OpenDesign 真正值得抄的,不是散文,是工程契约它的 _schema/AGENTS.md 把 token 分四层:A1-identity(品牌决定,缺失 guard 失败:--bg/--fg/--accent)、A1-structure(字号阶梯/容器宽/节奏)、A2、B-slot;每个 token 回答“谁决定值、缺省怎么办”。再加 manifest 契约 + CI guard,才让“一系统一目录”可校验。这套比九段散文更适合我们。

五个一线系统:实际导航与组件页

系统实际一级导航组件页字段状态 / 动效最值得抄的一件事
Material 3Components(146)/ Foundations(68)/ Styles(38)/ Develop / BlogOverview · Guidelines · Specs · Accessibility(每组件固定 4 页)状态在 Foundations → Interaction → States;动效在 Styles → Motion;state layer 0.08 / 0.10 / 0.10 / 0.16状态做成全站一套 token,而不是每组件各画一套
IBM CarbonGetting started / Building blocks(Foundations 11 / Components 42 / Patterns 18 / Data viz)/ Building experiences(按用户旅程)Guidelines · Specifications · Code · Accessibility;Specs 用「State × Element × Property × Token」四列表Motion 分 productive / expressive 两种语气;组件 checklist 是 DoD状态表四列 + 组件完成清单(token 强制、单测 80%、Percy VRT、WCAG AA)
Shopify Polaris已迁到 shopify.dev:设计规范在 /docs/apps/design,组件 API 在 /docs/api/*/web-components(7 个功能组);旧四栏已 301 下线Use cases · Preview · Properties(每个枚举值有解释)状态散在 Properties;无独立动效栏目;页面顶部有 v2.0 RC / v1.1 latest / v1.0 版本通道版本通道:预发布/最新稳定/旧版做进 URL 与 UI
GitHub PrimerGetting Started / Foundations / React / Primitives / UI Patterns / Scenario Patterns / Components / Internal / Hooks / CSS Utilities / Contribute + Accessibility / Brand / OcticonsOverview · Guidelines · Accessibility;头部有 React ready / Rails ready / Figma 就绪徽章;Props 表Guidelines 内 + inactive state 专页;只在 CSS Utilities → Animations组件成熟度三档 Experimental / Ready / Deprecated(废弃时控制台警告)
Adobe SpectrumFoundations(9 组,含 Behavior)/ Components(按平台)/ Pattern library / Content / Getting started固定 8 段:Anatomy · Options · States · Behaviors · Usage · Content · i18n · AccessibilityStates 是“支持/不支持”表;Behaviors 给可测规则(最小宽=高 2.25×、pending 延迟 1s);Motion 在 Behavior8 段模板 + 明确写“不支持” + 可测行为
OpenDesign无传统导航:design-systems/<slug> 目录 + manifest/DESIGN.md/tokens.cssComponent Stylings 配方,不是 props/states/a11y 规范无状态矩阵、无 a11y;靠 Do's & Don'tstoken 四层契约 + manifest + CI guard
我们单页 #/design:Foundations 13 节 + Components 13 节规格 + 静态样例 + “为什么”徽章状态矩阵最完整;其他组件 2–5 态;动效实现至少有 5 条缓动 / 7 个时长(含 pools-spec)已经“活的”,缺 IA/状态/治理

能直接抄的 6 件事

① Carbon 的状态四列表

状态不是形容词,是「哪个元素的哪个 CSS 属性换成哪个 token」:Hover / Container / background-color / $button-primary-hover。直接解决我们“状态只有截图”的问题。

② Spectrum 的 8 段组件页

Anatomy / Options / States / Behaviors / Usage / Content / i18n / A11y 强制齐全;States 明确写 Supported / Not supported;pending 延迟 1s 这种规则可测试。

③ Carbon 的 Component checklist

Requirement / Details / Why 三列,含 token 强制、单测 80%、Percy VRT、IBM Equal Access、WCAG AA、破坏性变更 codemod。把它当我们的 DoD。

④ Primer 的三档成熟度

Experimental / Ready / Deprecated;Deprecated 使用时控制台警告,把文档约束变成运行时约束。

⑤ Polaris 的版本通道

v2.0 RC / v1.1 latest / v1.0 做进 URL 与页面顶部,旧版可查、可迁移。

⑥ OpenDesign 的 token 四层

A1-identity / A1-structure / A2 / B-slot,每个 token 回答“谁决定、缺省怎么办”;配 manifest + CI guard,防组件裸 hex。

一个反直觉结论成熟系统卖的不是“好看的规范页”,而是一张能被检查的表:状态 × 元素 × 属性 × token,加一张“做完才算完成”的清单。我们现在的规范“允许太多、禁止太少”,所以每个人都能做出“差不多但不一样”的界面。

02组件与状态:组件不是画出来的,是定义出来的

一个组件能不能交接,不看它好不好看,看它有没有把这 20 个字段写全。

组件页模板(20 个字段)

字段写什么我们的常见错误
名称 / 版本Button / v1.2;废弃名与别名同一个东西三个叫法
用途一句话:什么时候用它,什么时候不用只写“按钮”
Anatomy容器 / 图标 / 标签 / 辅助文字 / 状态点,各自可不可选只有一张截图
Variantsprimary / secondary / ghost / danger;不是颜色,是语义用颜色命名变体
Sizessm / md / lg 的高度、内边距、字号、图标尺寸每个页面自己调
Props / APIvariant、size、loading、disabled、icon、fullWidth、onClick只有 CSS 类,没有行为契约
States12 态全集(见下方矩阵;每组件至少 9 个必做)只做 default + hover
Tokens背景、文字、描边、圆角、阴影分别引用哪个 token组件里写死 hex
Interaction点击后发生什么;防重复提交;乐观更新还是等待点了没反馈
Motion进入/退出/状态切换的时长、缓动、位移每个组件自己拍一个时长
Content标签字数上限、大小写、数字格式、错误文案模板文案散落在页面里
A11y角色、aria、焦点顺序、对比度、是否只靠颜色没测键盘
Responsive断点、最小宽度、移动端是否换行/收起只在 1440 看过
KeyboardTab / Enter / Space / Esc 的行为只能鼠标点
Do / Don't各 2 条,配反例只有正例
Related和哪些组件容易混、怎么选Button 和 Link 混用
State attrdata-state="default|hover|focus|pressed|selected|disabled|readonly|loading|error|success|empty|skeleton";交易区 data-tx、拍卖区 data-phase状态靠 class 拼,前端各写一套
Error / Empty错误原因、空态文案、重试/下一步只换红边,不解释
Test / Screenshot每态一张截图 + Playwright 用例 + axe 结果只截默认态
Owner / Statusowner、stable / experimental / deprecated、最后更新没人认领,改坏了不知道

状态矩阵:每个组件都要回答这 12 行

状态视觉上怎么变还能交互吗键盘 / 读屏动效
default基准样式是可聚焦无
hover背景/描边亮一档;位移 ≤1px是不影响150ms
focus-visible2px 外描边 + 2px offset是必须可见无(瞬时)
active / pressed下沉 1px 或亮度降低是Enter/Space 触发80–120ms
selected底色 + 勾选/描边,不只换颜色是(可取消)aria-selected150ms
disabledopacity 38%,去掉阴影否aria-disabled;仍可被读屏发现无
read-only像文本,不像禁用不可编辑,可复制/聚焦aria-readonly无
loadingspinner 或骨架;按钮宽度不变否,防重复aria-busy800ms 循环
error描边 + 图标 + 文案,三者同时是(可改)aria-invalid + aria-describedby150ms
success描边 + 勾选,不自动消失太快是aria-live polite200ms
empty说明 + 一个下一步动作是可读标题与说明无
skeleton结构占位,不闪白否aria-hidden1.4s 循环

20 字段是“最小集”。完整模板另含 6 个扩展字段:不适用场景、状态转移、数据契约、reduced-motion、变更记录、反例。小团队先把 20 个填完,再按需加。

两个代码骨架(可直接抄)

/* 1. 状态用属性表达,视觉只认 data-state */
.btn[data-state="hover"]   { background: var(--btn-bg-hover); }
.btn[data-state="loading"] { cursor: progress; }
.btn[data-state="loading"] .label { opacity: 0; }
.btn[data-state="loading"] .spinner { display: block; }
.btn[data-state="disabled"] { opacity: .38; pointer-events: none; }
.btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* 优先级:disabled > loading > error > success > selected > focus > hover > default */
/* focus 永远额外可见,不被其他状态覆盖 */
// 2. 交易状态机:UI 只从状态派生,不各自 if
type TxState =
  | { s: 'idle' }
  | { s: 'signing' }
  | { s: 'pending'; hash: string }
  | { s: 'confirmed'; hash: string; block: number }
  | { s: 'failed'; reason: string; canRetry: boolean }
  | { s: 'reorg'; hash: string };

// 规则:拿到 receipt.status=1 之前不显示成功;
// reorg 回到“核对中”,禁止自动重发(nonce 冲突会变成重复出价)。
两条执行约定① 叠加优先级:disabled > loading > error > success > selected > focus > hover > default,只显示最高一级视觉,但 focus 永远额外可见。② 状态用属性表达,不用 class 堆叠:根节点 data-state、交易区 data-tx、拍卖区 data-phase、表单 data-validate;CSS 只认这些值,前端不再各写一套。
LIVE BUTTON / INPUT / BADGE 状态
DEFAULT
地址格式不对,应为 0x + 40 位
ERROR
已连接 · 覆盖 12 个月
SUCCESS
DISABLED
◆ 收入已验证 未验证 待验证 验证失败
Hover / Tab 聚焦看状态变化;所有状态都在同一套 token 上。

中间态:真正决定体验的是“还没完成”的时候

类别状态用户看到什么下一步 / 可撤销
加载首屏加载骨架屏(结构一致,不闪白)—
局部刷新旧数据 + 顶部细进度条 / 小 spinner可继续操作
长任务步骤进度 + 预计时间 + 可离开后台继续
乐观更新先显示成功态,失败再回滚并提示可重试
数据stale最后更新时间 + “刷新”按钮可刷新
partial哪些数据有、哪些缺,逐项标可补
empty为什么空 + 一个下一步可行动
error发生了什么 + 为什么 + 重试可重试
交易钱包未连接连接按钮 + 为什么需要可取消
待签名钱包弹窗 + 页面说明“在钱包里确认”可拒绝
已签名 / 上链中tx hash + 确认数 + 预计时间不可撤销
成功结果 + 下一步(领币/持仓)—
失败 / revert原因 + 重试 + 资金未动可重试
重组回滚“状态回滚,正在重新确认”等待
拍卖未开始开始时间 + 提醒我可订阅
进行中 / 最后一小时倒计时 + 当前清算价 + 毕业进度可出价/改价
待清算 / 未达标退款清算中;未达标则退款路径与时间退款可查
表单校验中字段旁 spinner,不阻塞其他字段可继续填
草稿已保存“已保存 · 14:02”,不弹窗可恢复
保存失败顶部状态条 + 重试 + 本地副本可重试
四种“没有”必须分开① 加载中 = 骨架(结构占位);② 真空 = 空态 + 一个下一步;③ 零值 = 显示 0(真实为零);④ 未接入 = “—(待接入)”。我们首页已经规定“没有 24h 历史不许显示 0”,这条规则要推广到全站所有数字。

三条状态机(页面里必须画出来)

状态机不是文档装饰:它是前端 if/else、颜色、文案、按钮 disabled 的唯一来源。

钱包未连接→待签名→上链中→成功|失败 / revert→重试
未开始→拍卖中→待清算→已毕业 / 可领取|未达标 → 全额退款
未验证→验证中→已通过|未通过 → 补材料 / 降级→到期复验
LIVE 中间态:骨架 → 数据
骨架尺寸必须和最终内容一致,否则会跳版。

无障碍:状态不能只靠颜色

必做

  • focus-visible 2px 外描边,offset ≥2px
  • 正文对比度 ≥4.5:1,大字 ≥3:1
  • 颜色之外加图标/文字(涨跌、验证、错误)
  • 错误用 aria-invalid + aria-describedby
  • 异步状态用 aria-live="polite"
  • 所有交互可键盘完成,Tab 顺序可预测

最容易漏

  • disabled 元素从 Tab 顺序消失,读屏也读不到
  • loading 时按钮宽度变化导致布局跳动
  • 颜色是涨跌/验证唯一语义
  • reduced-motion 只关了动画,没关自动播放视频
  • 错误提示只出现一次,读屏没读到
5 个最常见的组件错误① 用颜色命名变体(“green button”),语义一变就全废;② 只做 default/hover,loading/disabled 上线才补;③ 组件里写死 hex,换肤失效;④ 把“按钮”和“链接”混用(动作 vs 导航);⑤ 组件文档没有 do/don't,新人一定会用错。

03动效:不是加库,是定语义

动效只回答三个问题:发生了什么、东西从哪来到哪去、这件事有多重要。回答不了,就不该动。

先定 token,再谈效果

时长阶梯

  • --dur-1 100ms:按下、颜色、图标切换
  • --dur-2 150ms:hover、focus、描边
  • --dur-3 200ms:按钮、chip、tooltip
  • --dur-4 300ms:面板、tab、modal
  • --dur-5 500ms:页面转场、大区块

缓动与编排

  • --ease-out cubic-bezier(.2,.8,.2,1):进入
  • --ease-in cubic-bezier(.4,0,1,1):退出
  • --ease-spring cubic-bezier(.34,1.56,.64,1):toast、徽章
  • 错峰 40–60ms:列表、徽章组
  • 位移 4 / 8 / 12px:小/中/大

与 tokens.md 的 150/200/300 对齐:100ms 只给“按下”,500ms 只给页面转场;toast 的 350ms 弹簧是登记例外,不算 bouncy 反模式。

6 个标准动效(先做这 6 个,别再加)

动效触发时长 / 缓动只动什么降级
hover 反馈指针进入150ms / ease-out背景、描边、translateY(-1px)reduced-motion 只保留颜色
按下mousedown / Enter100ms / ease-outscale .98 或 translateY(1px)无
Toast操作结果350ms / springopacity + translateY + scale直接显示,2.6s 后消失
Modal需要确认280ms / ease-outopacity + translateY + scale无动画,直接显示
数字 ticker金额变化900ms / ease-out只改 textContent,不动布局直接显示最终值
骨架 → 内容数据到达200ms / ease-outopacity 交叉淡入直接替换
LIVE 动效时长 / TOAST / MODAL / TICKER
150ms · hover / 描边
200ms · 按钮 / chip
300ms · 面板 / tab
500ms · 页面转场
VERIFIED REVENUE
$1,240,000
右上角「动效」开关可以模拟 reduced-motion;所有动画只动 transform / opacity。

别人网站里的动效,怎么判断它用什么做的

① 先看 Network

搜 .json / .lottie / .riv / .mp4 / .glb。有 Lottie JSON 就是 Lottie;有 glb/gltf 就是 Three/R3F/Spline 一类;有 mp4 很可能是预渲染。

② 再看 Sources

搜 gsap、ScrollTrigger、three、framer-motion、lottie。压缩过的看 chunk 名和全局变量。

③ 看 Performance

Record 几秒:只动 transform/opacity 通常 60fps;大面积 layout/paint 往往是低质量实现;canvas 持续重绘可能是 Three/WebGL。

④ 看 computed style

元素上有 animation-name 就是 CSS keyframes;有 transform: matrix3d 可能是 GSAP 或 3D;有 will-change 说明做了合成层优化。

⑤ 看交互模型

滚动驱动、时间轴驱动、手势驱动是三种不同实现。滚动驱动的多半是 ScrollTrigger / IntersectionObserver / scroll-driven animations。

⑥ 用 Wappalyzer

能识别一部分库和框架,但识别不了手写 CSS。最终还是要回到 Network + Sources。

我们现在的动效从哪来?不是从库里来的。演示站的动效全部是手写 CSS:badgeBreath / badgeRing / badgePopIn / badgeFlash / hbEnter / hbRingBurst / toastPop / fadeIn / dsSkel / dsPulse,外加 transition。早期参考过 pools.trade 的参数(pools-toast-pop、pools-pulse 的 2.8s 节拍),后来徽章 v2 重做,撤掉了 conic 旋转,改成描边闭合。也就是说:我们没有引入 GSAP / Lottie / Three,所有效果都是可控的 CSS——这既是优点(轻、可控),也是缺点(做不了复杂时间轴/3D)。
性能红线只动 transform 和 opacity;不要动 width/height/top/left;常驻动画不超过 2 个;不在 24px 徽章上跑彩色 conic;prefers-reduced-motion 下全部关闭;自动播放视频必须给暂停。

04动效库地图:那些效果到底从哪来

答案分三层:设计工具(Rive/Spline/Lottie)、代码库(GSAP/Motion/Anime)、平台 API(View Transitions / scroll-driven)。先判断属于哪层,再决定学哪个。

① 设计工具导出

Lottie(AE → JSON)、Rive(状态机 → .riv)、Spline(3D 场景 → runtime)。设计师能改,开发只嵌 runtime。

② 代码库

GSAP(时间轴/滚动)、Motion(React 手势/布局)、Anime.js(轻量时间轴)、Theatre.js(3D 编排)。开发主导。

③ 平台原生

View Transitions API、CSS scroll-driven animations、prefers-reduced-motion。零依赖,优先用。

12 个库,按“你真正会用到”排序

库最强场景License成本 / 性能适合我们不适合
GSAP + ScrollTrigger复杂时间轴、滚动叙事、SVG 动画Standard License 免费;禁止做与 Webflow 竞争的搭建器core 27.4KB + ScrollTrigger 18KB ≈45KB gzip落地页滚动叙事、数据图入场简单 hover;React 内状态动画
Motion(原 Framer Motion)React 手势、布局动画、AnimatePresenceMIT按需引入,中等未来 React 版前端纯静态页
Lottie / dotLottieAE 导出的矢量动画、空态插画MIT(lottie-web)JSON 可大;需懒加载空态、成功/失败插画需要交互状态机的场景
Rive可交互状态机、角色/图标动画runtime 免费,编辑器订阅很小,GPU 友好徽章/验证状态动效、品牌角色团队没人会 Rive 编辑器
Theatre.js3D / 时间轴可视化编排Apache-2.0中等,偏重未来 3D hero 编排普通 UI 动效
Anime.js轻量时间轴、SVG、DOMMIT~17KB小体量营销页复杂滚动/React 布局
View Transitions API同文档/跨文档页面转场原生零依赖页面/路由转场首选需要兼容旧浏览器时
Lenis平滑滚动 / 惯性MIT很小落地页滚动叙事数据密集型产品页(会晕)
AutoAnimate列表增删/排序过渡MIT~3KB成交表、持仓列表复杂编排
Swiper轮播、卡片滑动MIT中等首页 banner/趋势横滑简单 3 张图(CSS scroll-snap 更轻)
Barba.js多页站点转场MIT小传统多页营销站Next.js SPA(用 View Transitions)
Popmotion弹簧/物理动画MIT小手势反馈已被 Motion 覆盖,新项目别选
选择决策树滚动叙事/复杂时间轴 → GSAP;React 手势/布局 → Motion;AE 做好的动画 → Lottie;需要状态机/可交互角色 → Rive;页面转场 → View Transitions;列表增删 → AutoAnimate;3D 场景 → Spline / R3F;只是 hover/按下 → CSS transition,不要引库。

灵感站:去哪里“看见”效果

站点擅长什么怎么用注意
Codrops前沿 CSS/WebGL/滚动实验,带源码找“效果怎么实现”的第一站偏实验,不一定适合产品
Motion ShowcaseMotion 官方示例看 React 手势/布局动画只覆盖 Motion
Godly精选高质感网站看整体气质与 hero多为品牌站,不是产品
Awwwards获奖站点、3D/实验找“天花板”和 3D 参考性能/可访问性常被牺牲
SiteInspire / Land-book / Lapa Ninja按行业/风格筛落地页找结构、排版、首屏静态截图,看不到交互
Httpster独立/工作室风格找不那么“模板”的视觉更新慢
Savee / Muzli视觉灵感流配色、版式、动效片段容易只看热闹
LottieFiles可直接用的 Lottie 动画空态/加载/成功动画注意 license 与品牌一致性
Rive Marketplace可交互动画文件徽章/角色/状态机参考需要 Rive 编辑器
Spline Community3D 场景与素材3D hero 参考与 remix注意性能与移动端

挑 6 个具体案例看(不是“去这些站逛逛”)

案例类型 / 技术看什么我们怎么用降级
Apple MacBook Pro 产品页预渲染视频 + 滚动 scrub,不是 WebGL3 个 beat 的镜头推进;滚动位置驱动播放/暂停,不是自动播放W6 的 Proof Shell 就照这个节奏:一个符号、三次拆解静态 poster;reduced-motion 不自动播
Bruno Simon 作品集Three.js 真 3D 小游戏“玩法即品牌”的隐喻;加载与低端机代价只看叙事,不抄预算;我们没有这个人月无;不建议作为基线
Spline CommunitySpline runtime 真 3D一个主体 + 一个交互点;材质和灯光怎么省B 方案:只做一个可 hover/拖拽的 hero 物件静态图/视频
Motion ExamplesReact Motionmount/unmount、layout、gesture 的写法toast / modal / tab / ticker 的中间态CSS transition
CodropsCSS / WebGL / SVG 实验,带源码从 Scroll / WebGL 分类挑 1 个,拆它的层级与时长只借“一个动效”,不搬整套CSS / 静态
Rive MarketplaceRive 状态机动画可交互状态怎么组织;徽章/验证状态参考只给徽章/成功失败,不给全站SVG + CSS

我们该用哪几个?

现在(产品页)

CSS transition + keyframes 足够;加 View Transitions 做页面转场,AutoAnimate 做列表。不要引 GSAP/Three。

落地页(下一步)

用 GSAP + ScrollTrigger 做滚动叙事,或纯 CSS scroll-driven;hero 动效控制在 1–2 个,别做满屏。

品牌资产(可选)

徽章/验证状态可以考虑 Rive;空态插画用 Lottie。先有设计再选库,不要为了库而做动画。

053D Landing:真 3D、假 3D 与成本

你看到的“酷炫 3D”,至少有一半不是真 3D。先分清四类,再决定要不要做。

类型你看到的效果实现成本适合
真 WebGL 3D可旋转/随滚动变化/可交互的立体场景Three.js / R3F / Babylon / PlayCanvas / Spline runtime高:建模、材质、灯光、性能、移动降级品牌 hero、产品可视化、互动演示
预渲染视频 / 帧序列非常顺滑的“3D 大片”,但不能自由旋转Blender/C4D 渲染 → MP4 / WebP 帧序列 → scroll scrub中:美术成本高,前端很低产品发布、landing hero
CSS 3D / 视差层叠、卡片翻转、伪 3D 场景transform: perspective/rotate3d + 视差低卡片、图标、轻量 hero
2.5D / 伪 3D 图等距插画、深度模糊、光效静态图 + 位移/模糊最低空态、功能说明、营销图

10 个技术栈

栈上手性能 / 包体移动端License典型用法
Spline低(设计工具)runtime ~273KB gzip + 场景;免费版导出带水印有降级,需测试免费/付费档设计直接导出 Web 场景;hero、产品展示
React Three Fiber + Drei中高(React)Three 体积大,按需拆需自己处理MITReact 站点里的 3D 组件
Three.js中高~185KB gzip(整包,可 tree-shake)需自己处理MIT完全自定义 WebGL
Babylon.js中较大,功能全较好Apache-2.0复杂 3D/游戏化场景
PlayCanvas中(编辑器)优化好好MIT/商业档3D 产品配置器、游戏
model-viewer低很轻好Apache-2.0只展示 glb 模型(360° 查看)
OGL / Curtains.js中轻中OGL: Unlicense / Curtains: MITWebGL 图片/文字转场
Zdog低很小好MIT扁平伪 3D 插画/图标
Theatre.js中中等,偏重需自己处理Apache-2.03D/时间轴可视化编排,与 Three/R3F 配合
预渲染视频 / 帧序列低(前端)2–3MB 视频;零 3D runtime换 poster 即可素材授权另计滚动 scrub 的“伪 3D 大片”,性价比最高

表中 OGL / Curtains 合并为一行,预渲染视频是管线不是库;完整 10 项对照与包体数据见 `notes/04-3d-landing.md`。

素材从哪来

来源有什么License注意
Spline Community场景、材质、可 remix 的 3D逐个看(3D Library 素材可商用)免费版导出带水印,去水印需 Hobby $12/席/月;改到像自己的
Sketchfab海量模型CC / 付费混合逐条看许可;注意面数
Poly HavenHDRI、材质、模型CC0适合真实感场景
Quaternius / Kenney低多边形模型/游戏资产Quaternius: QAL v1.0 / Kenney: CC0风格化,不适合写实金融
pmndrs GitHub 仓库R3F 生态模型/材质/示例逐个看(多为 CC0)官网 market.pmnd.rs 实测 404,从 GitHub 取
Mixamo角色动画免费(账号)中国大陆账号不可用;角色类,不是金融产品 3D

性能预算(参考)

  • 首屏 JS ≤ 200KB gzip(3D 库另算)
  • glb ≤ 3–5MB,纹理 ≤ 2048px
  • draw call ≤ 50;移动端 ≤ 25
  • 目标 60fps;低端机 30fps 可接受
  • 必须有静态图/视频兜底
  • prefers-reduced-motion 时停止自动旋转

可访问性 / SEO

  • 3D 不能是唯一信息载体
  • 提供文字说明与 poster
  • 键盘可暂停/旋转
  • 不要用 canvas 承载核心 CTA
  • 移动端可换成静态图
  • 3D 资源懒加载,不阻塞首屏

3 个具体的 3D Landing 案例

案例它到底是什么值得学不要学
Apple MacBook Pro预渲染视频,滚动驱动播放;不是实时 3D节奏、镜头、信息随滚动出现;兼容性与成本最稳不要为了“3D”上 WebGL;视频也能做出同样的体感
Bruno SimonThree.js 真 3D + 游戏逻辑把品牌做成可玩的隐喻;交互的记忆点加载、移动端、低端机成本;我们没有人月
Spline CommunitySpline runtime 真 3D一个主体 + 一个交互点;设计师可独立维护物理、复杂材质、全站 3D

给我们 Launchpad 的决策

页面要不要 3D理由建议形态
产品页(首页/项目页/持仓/验证)不要用户来读数据、做交易决策;3D 增加加载与干扰CSS 动效 + 图表动画即可
落地页 W6 hero可以,但要克制需要记忆点与“真实项目”感A:预渲染视频/帧序列(最低风险)
B:Spline 轻场景(中)
C:R3F 自建(暂不做)
空态/错误页可以用 Lottie/2.5D 插画降低挫败感Lottie 或静态 2.5D
最低成本方案(推荐先做 A)用 Blender/Spline 渲一段 4–6 秒、2–3MB 的循环视频(或 60 帧 WebP 序列),首屏静音自动播放 + 滚动 scrub;上面叠 HTML 标题与 CTA。成本约 4–7 人日、¥0.6–1.4 万、运行时 0KB,移动端直接换 poster。B 方案(Spline 轻场景)约 8–13 人日,C 方案(R3F 自建)约 19–29 人日——先做 A,用转化数据决定要不要升级。
具体做什么:Proof Shell(证明外壳)一个深色玻璃质感的 App 图标,外面套一圈细的验证环;滚动时裂成三层:App 数据 → 证明 → Token。它正好对应落地页三步说明,不是纯装饰;而且用预渲染视频就能做,不需要 WebGL。

CSS 3D 的例子见 §03 动效里的方块:六个面 = 六个 div + transform: rotate3d。产品页里的“3D 感”大多到这个程度就够;真 WebGL 留给 landing。

06我们的设计系统到底缺什么

对着 tokens.md、501 条元素台账、演示站 #/design 和三个知识库页面逐条核过:15 个缺口,6 个强项。

3 套真相

tokens.md / styles.css / 规范页截图至少 10 处值不一致(底色、surface、positive、导航高度、圆角、字号、字体)。

3 个状态机缺失

交易、拍卖、验证三条路径只有静态 toast / 两态,没有 pending、reverted、退款、过期。

AA 不达标

text-3 38% 对比度 3.31:1;violet 3.96:1;无 focus-visible;卡片是 div+onclick。

501 → 组件断层

501 条元素没有 component 列,无法回答“多少已被组件覆盖”;六边形徽章 P22 仍是孤儿。

15 个缺口(按严重度)

#领域现状(证据)成熟标准 / 差距严重度修法量
1token 分层只有结构/主题两层;缺 primitive/semantic/component;同概念两套命名(--fg vs --text-1、--radius vs --r);四套主题未落地W3C 三层 + 单一 JSON 源;组件直接引用 primitive 时换肤失效高tokens.json 三层;生成 CSS/TS;弃用映射;CI 禁裸 hexM
2组件清单规范页 13 组组件;501 条无组件 ID;向导 6 步 vs 台账 7 步;首页筛选与 1012 不一致Atomic Design + inventory;组件 ID ↔ 元素 ID 双向追溯;40–60 个组件高C-xx 命名;501 加 component 列;20 个核心覆盖 80%L
3状态矩阵按钮 3 态、输入 5 态、卡片/行只有 default+hover;is-disabled 不是真 disabled每组件 12 态全集(其中 9 个必做),同时定义视觉/行为/ARIA高组件 × 状态矩阵;Storybook 每态一 storyM
4中间态交易只有静态 toast;拍卖 3 状态;验证 pass/fail;无 pending/confirmed/reverted/退款/过期三条异步状态机 + 超时/重试/回滚高TxStatus / AuctionStatus / VerificationStatus 三组件L
5动效 token文档说“一套时长一条缓动”,实现至少有 5 条缓动 + 7 个时长(含 pools-spec);reduced-motion 只关徽章duration/easing/loop tokens + 全局降级中补齐 --dur/--ease/--loop;全局 reduced-motion;lint 查裸 cubic-bezierS
6无障碍text-3 3.31:1、紫 3.96:1;无 focus-visible;卡片/筛选 div+onclick;toast 无 aria-live;modal 无 focus trapWCAG 2.2 AA:4.5:1、焦点可见、键盘、44px高提对比度;focus ring token;语义控件;axe 进 CIM
7响应式只有 900/1100 两档;卡片 1100 以下 2 列无 1 列;无移动导航;验收全是 14401280/1024/768/480 四档;移动抽屉;表格转卡片;粘性 CTA高四档断点;移动导航;375/390/768 进验收M
8数据可视化只有 sparkline 和面积图;无轴/刻度/单位/图例/tooltip/零线/负值/空值;null 不许显示 0 只写在文档轴/单位/时间粒度/零线/null 断点/空态/色盲安全高图表规范 + Chart API;P402–P405 当验收样例M
9内容规范有命名规则,但无术语表/数字格式/日期格式/语气/中英词表;金额有 $1.2M 与 $1,200,000;0 显示 +0.0%术语 + 数字/日期/百分比 + microcopy + 双语词表中内容规范 v1;format.ts 单测;0 的符号规则M
10组件 API只有 class/CSS,没有 props/variants/slots/events;6 变体 × 3 尺寸靠任意拼 class每组件 API 表 + TS 类型 + 合法组合矩阵高20 个核心组件 API 表;Storybook controlsM
11文档站结构单页 #/design 只有 Foundations / Components 26 节;无 Patterns / Content / Governance;无搜索/owner/更新时间五段式 IA + 搜索 + 状态徽章 + owner中8 栏 IA;front-matter;Patterns 从 501 生成M
12版本与变更tokens.md 只有日期;规范页 v0.3、徽章 v2 在其后、截图 v0.1;无 CHANGELOGSemVer + CHANGELOG + 组件状态(实验/稳定/废弃)高v1.0 基线;CHANGELOG;meta 自动读 manifestS
13贡献/评审有代码规范与 DoD,但无设计系统贡献流程、owner、废弃策略RFC + owner + 评审清单 + 变更分级中CONTRIBUTING;1 owner + 2 reviewer;PR 模板S
14设计-代码一致tokens.md vs styles.css 至少 10 处值冲突;无 tokens.json/Figma/Storybook;规范页自称 SSOT 但值在 app.js 字符串里token 单一源 → 生成 CSS/TS/文档;视觉回归高tokens.json 为源;CI 生成;Playwright 截图对比L
15资产规范图标较强(Lucide 22 个);无插图/空态插画/3D/OG/favicon 规范;资产来源与许可不可追溯图标网格/笔画/命名;插图风格;3D 边界;OG/favicon;动效导出中资产清单 + 图标规范 + 3 个插图示例 + OGS/M

6 个强项(不要改坏)

① 徽章 = 可执行的可信度语义

四条动效只服务“已验证”,未验证零动效;v2 用 SVG 描边闭合替代 conic 旋转;有 locked/obtained/rare/legendary/just-earned 状态。这已经是品牌资产,把 P22 从台账孤儿接回产品即可。

② token 分层换肤的意识

先拆结构/主题、再谈四套主题,还规划了 CSS/JSON/主题三文件。方向对,问题在执行——补第三层和生成管线,不要推翻。

③ 规范页是“活的”

#/design 支持深链、有竞品对比、每个组件写“为什么”、按钮/输入/弹层可点。比 Figma 截图更适合一人推动、多人使用的阶段。

④ 金融数据细节自觉

强制 tabular-nums、数字用等宽、null 不许显示 0、把“收入已验证”与“X 已认证”从命名上分开。这些是交易产品的命门。

⑤ 知识库三页是成熟编辑语言

纸色/宋体/880px/17px-1.9/侧栏/搜索/四类 callout/响应式/打印。产品 UI 用暗色数据语言,规范站用纸色编辑语言,共享 token 逻辑但不共享皮肤。

⑥ 已有 501 条原料

501 条元素按页分布(项目页 155 / 向导 99 / 首页 73 / 全局 72 / 持仓 44 / 落地 31 / 验证 27),只差组件 ID 这一列。

设计规范 2.0 的 8 栏目录

0 概览与原则

为谁服务、五条原则、非目标、路线图、如何提需求。

1 Foundations

颜色三层、字体、间距、圆角、阴影、栅格断点、动效 token、图标网格。

2 Accessibility

对比度、焦点、键盘、减弱动效、44px、颜色非唯一、验收清单。

3 Components

解剖、变体、状态矩阵、API、A11y、do/don't、代码链接。

4 Patterns

交易、拍卖、验证、空/错/载、图表、发币向导。

5 Content

术语、数字单位、日期、百分比负值、错误/空态文案、中英词表、免责声明。

6 Assets

Lucide、品牌 marks、头像、插图/空态、OG/favicon、3D 边界、动效导出。

7 Governance

版本/CHANGELOG、贡献、评审、废弃、owner、tokens.json 下载、迁移。

先做哪一步?Day 1–2 的 token 对账。`tokens.md` 与 `styles.css` 至少 10 处冲突,不先裁决,后面每修一个页面都会制造第四套值。第二步不是画新组件,是无障碍止血:对比度、focus、键盘、reduced-motion。

0730 天修复顺序(4 周 + 2 天缓冲)

不要同时开三条线。先让规范“能用”,再让它“好看”。

WEEK 1

Token 对账 + 无障碍止血

逐条裁决 tokens.md 与 styles.css 的 10 处冲突,冻结唯一源;修对比度、focus ring、键盘、全局 reduced-motion。

产出:tokens.json v0 + tokens-diff + a11y 修复
WEEK 2

组件清单 + 状态矩阵

501 条合并成 40–60 个组件,20 个核心;12 态全集(9 个必做);组件页模板 20 字段。

产出:组件清单 v2 + 状态矩阵
WEEK 3

中间态 + 动效

交易/拍卖/验证三张状态机;动效 token 与 6 个标准 recipe;内容、数字格式、图表规范。

产出:状态词典 + motion tokens + 内容/图表规范
WEEK 4

文档站 + 治理 + 回归

8 栏 IA、CHANGELOG、CONTRIBUTING、评审清单;Playwright 截图回归,冻结 v1.0。

产出:DS 2.0 站点 + 治理文件 + v1.0

08链接与调研说明

这一页是“规范的索引 + 缺口诊断”,不是规范本身;真正要落地的规范应回到演示站 #/design 并按 8 栏 IA 重写。

设计系统 / 标准

审核与修改记录(待复审)

两轮独立审核已执行本页不在页面内自证 PASS;审核结论与逐条证据见 `notes/00-review.md`。已修:OpenDesign schema 更正为仓库实际九段、状态数统一、20 字段统一、reduced-motion 与 toast/modal a11y、30 天计划重排、3D license、附录链接。已补 6 个动效案例、3 个 landing 案例与 3D license 更正;终审结论仍以 notes/00-review.md 为准。

调研方法

2026-10-18。5 路并行调研(设计系统标准与 OpenDesign / 组件状态与中间态 / 动效库与灵感 / 3D landing / 我们自己的缺口),再由 1 路审核 agent 逐份复核链接、事实和覆盖度。链接已逐条检查:无 404;Codrops / LottieFiles / Land-book / Lapa 等对爬虫返回 403 或 429,浏览器通常可打开。license 与商用条款以官网为准,标「待核实」的条目需在采购/上线前再确认。我们的现状证据来自 产品/tokens.md、501 条元素台账、演示站 #/design、AboutFace4整理 三页实现与验收截图。

怎么用这一页① 先按 Day 1–2 做 token 对账,停止三套真相;② 按仓库实际 9 段补齐 tokens.md 缺的 Layout / Responsive / Do's & Don'ts / Visual Theme,另加 Voice 与 Anti-patterns;③ 用 20 字段模板补 20 个核心组件;④ 用 6 个动效 recipe 与状态矩阵替换零散动效;⑤ 3D 只在落地页做,先做预渲染视频。
✓ 已提交,等待链上确认