01-动画系统架构:三大 Builder 联动机制
目录
概述
Hikari 动画系统采用了三大 Builder 联动架构,实现了类似 GSAP 的精细动画控制能力。这个架构将动画的三个维度分离:
- 1ClassesBuilder - 布局和间距的工具类
- 2StyleStringBuilder - 动态样式的内联样式
- 3AnimationBuilder - 时间轴和状态机的高级控制
这三个组件各司其职,通过精心设计的接口协同工作,实现了从简单过渡到复杂状态机的全覆盖。
设计理念
三层分离架构
mermaid
职责分离
| Builder | 主要职责 | 输出 | 使用场景 |
|---|---|---|---|
| ClassesBuilder | 静态工具类 | 类名字符串 | 布局、间距、显示控制 |
| StyleStringBuilder | 动态 CSS 样式 | 内联样式字符串 | 覆盖全局样式、动态计算的值 |
| AnimationBuilder | 时间轴和状态机 | 动画闭包/状态更新 | 淡入淡出、缩放、鼠标跟随 |
核心组件
1. ClassesBuilder - 工具类生成器
作用:生成类型安全的工具类名称(如 hi-flex, hi-p-4)
特点:
- 编译时类型检查
- 枚举驱动防止拼写错误
- SCSS 预定义类映射
API:
rust
1
2
3
4
5
6
7
8
9
use ;
let classes = new
.add // .hi-flex
.add // .hi-flex-col
.add // .hi-gap-4
.build;
// 输出: "hi-flex hi-flex-col hi-gap-4"
2. StyleStringBuilder - 动态样式构建器
作用:生成类型安全的内联样式(支持 CSS 变量)
特点:
- 类型安全的 CSS 属性(CssProperty 枚举)
- 像素值自动转换(add_px)
- CSS 变量支持
- 紧凑输出(build_clean)
API:
rust
1
2
3
4
5
6
7
8
9
use ;
let style = new
.add
.add
.add
.build_clean;
// 输出: "opacity:var(--hi-dropdown-opacity);transform:scale(var(--hi-dropdown-scale));transform-origin:top center"
3. AnimationBuilder - 高级动画构建器
作用:声明式动画构建,支持动态值、状态机、时间轴
特点:
- 多元素同时控制
- 动态值运行时计算
- 状态机模式
- requestAnimationFrame 循环
- 防抖和节流优化
API:
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use ;
use CssProperty;
// 静态样式
new
.add_style
.apply_with_transition;
// 动态值(鼠标跟随)
new
.add_style_dynamic
.start_animation_loop;
联动工作机制
机制一:CSS 变量驱动动画
原理:通过切换 class 改变 CSS 变量值,CSS transition 自动处理过渡
mermaid
实现示例:
scss
1
2
3
4
5
6
7
8
9
10
// dropdown.scss
.hi-dropdown-hidden {
--hi-dropdown-opacity: 0;
--hi-dropdown-scale: 0.95;
}
.hi-dropdown-visible {
--hi-dropdown-opacity: 1;
--hi-dropdown-scale: 1.0;
}
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// mod.rs
let dropdown_classes = use_memo;
let content_style = new
.add
.add
.build_clean;
机制二:AnimationBuilder 的三种模式
模式 A:静态动画(一次性)
mermaid
代码示例:
rust
1
2
3
4
5
6
new
.add_style
.add_style
.add_style
.add_class
.apply_with_transition;
模式 B:动态值(每帧计算)
mermaid
代码示例:
rust
1
2
3
4
5
6
7
8
9
10
11
12
new
.add_style_dynamic
.add_style_dynamic
.start_animation_loop;
模式 C:状态机(带状态变量)
mermaid
代码示例:
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let mut state = new;
state.set_f64;
state.set_i32;
new_with_state
.add_stateful_style
.start_animation_loop;
机制三:防抖和节流优化
mermaid
性能优化实现:
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const THROTTLE_MS: f64 = 16.67; // ~60fps
let animation_closure = wrap;
window.request_animation_frame?;
机制四:值缓存避免不必要的 DOM 更新
mermaid
实现示例:
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let cached_values: =
new;
// 在动画循环中
let new_value = compute_value;
let element_cache = cached_values.borrow;
let cached = element_cache.get?.get;
if cached.as_ref != Some
完整工作流程
场景:Dropdown 淡入动画
mermaid
场景:复杂状态机动画(旋转背景)
mermaid
性能优化
1. 节流(Throttling)
原理:限制更新频率,避免不必要的 DOM 操作
text
1
2
3
目标帧率:60fps
最小间隔:16.67ms
实际更新:只有当 time_since_last_update >= 16.67ms 时才更新
效果:
- 减少重绘(reflows)
- 降低 CPU 使用率
- 保持流畅视觉体验
2. 值缓存(Value Caching)
原理:比较新旧值,只在值变化时更新 DOM
text
1
2
3
每帧计算 → 检查缓存 → 值不同? → 更新 DOM → 更新缓存
↓ 值相同
跳过
效果:
- 避免冗余 DOM 操作
- 减少浏览器重排
- 提升动画性能
3. CSS 变量(CSS Variables)
原理:通过切换 class 改变 CSS 变量,利用浏览器 CSS 引擎
text
1
2
.hi-dropdown-hidden → --hi-dropdown-opacity: 0
.hi-dropdown-visible → --hi-dropdown-opacity: 1
效果:
- CSS transition 由 GPU 加速
- 无需 JavaScript 动画循环
- 极小的性能开销
使用示例
示例 1:淡入淡出(CSS 变量模式)
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let is_visible = use_signal;
use_effect;
let classes = use_memoscss
1
2
3
4
5
6
7
8
9
.hi-dropdown-hidden {
--hi-dropdown-opacity: 0;
--hi-dropdown-scale: 0.95;
}
.hi-dropdown-visible {
--hi-dropdown-opacity: 1;
--hi-dropdown-scale: 1.0;
}
示例 2:鼠标跟随(动态值模式)
rust
1
2
3
4
5
6
7
8
9
10
let mut elements = new;
elements.insert;
new
.add_style_dynamic
.start_animation_loop;
示例 3:旋转渐变(状态机模式)
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let mut state = new;
state.set_f64;
new_with_state
.add_stateful_style
.start_animation_loop;
示例 4:组合使用
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 1. ClassesBuilder 生成基础布局
let base_classes = new
.add
.add
.add
.build;
// 2. StyleStringBuilder 添加动态样式
let style = new
.add
.add
.build_clean;
// 3. use_memo 动态切换 class
let full_classes = use_memo;
// 4. 渲染
rsx!
总结
Hikari 动画系统的三大 Builder 联动机制实现了:
- 1职责分离:每个 Builder 负责特定领域
- 2类型安全:编译时检查,运行时零开销
- 3性能优化:节流、缓存、CSS 变量
- 4灵活性:从简单过渡到复杂状态机全覆盖
这套架构既保持了代码的简洁性,又提供了 GSAP 级别的精细控制能力,是现代前端动画的优雅解决方案。