timing-calibration
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseTiming Calibration
时间校准
Get animation speed right using Disney's timing principles.
运用迪士尼的时间原则,让动画速度恰到好处。
Problem Indicators
问题表现
- "Too slow" or "too fast" feedback
- Animations feel inconsistent
- Similar actions have different speeds
- Users wait for animations
- Motion feels robotic or unnatural
- 反馈“太慢”或“太快”
- 动画效果不一致
- 相似操作的动画速度不同
- 用户需要等待动画完成
- 动效显得机械或不自然
Diagnosis by Principle
基于动画原则的问题诊断
Timing
Timing
Issue: Duration doesn't match action type
Fix: Micro-interactions: 100-150ms. Transitions: 200-400ms. Complex reveals: 400-600ms. Never exceed 1s for UI.
问题:时长与操作类型不匹配
修复方案:微交互:100-150ms。过渡动画:200-400ms。复杂展开动画:400-600ms。UI动画时长绝不要超过1秒。
Slow In and Slow Out
Slow In and Slow Out
Issue: Linear timing feels mechanical
Fix: Use easing. Ease-out for entrances (fast start, soft landing). Ease-in for exits (soft start, quick finish).
问题:线性时间动效显得机械
修复方案:使用easing。入场动画使用Ease-out(快速启动,柔和收尾)。退场动画使用Ease-in(柔和启动,快速收尾)。
Arcs
Arcs
Issue: Straight-line motion at wrong speed
Fix: Curved paths need more time than straight paths. Increase duration for arc motion.
问题:直线运动的速度不合适
修复方案:曲线路径的动画时长需要比直线路径更长。增加弧线运动的时长。
Staging
Staging
Issue: Multiple speeds compete
Fix: Similar elements should animate at similar speeds. Create timing harmony.
问题:多种动画速度互相冲突
修复方案:相似元素的动画速度应保持一致,营造时间协调性。
Secondary Action
Secondary Action
Issue: Secondary animations at wrong relative speed
Fix: Secondary actions should be slightly slower than primary. Creates natural hierarchy.
问题:次要动画的相对速度不合适
修复方案:次要动画的速度应略慢于主要动画,构建自然的层级关系。
Timing Scale
时间尺度表
| Category | Duration | Use For |
|---|---|---|
| Instant | 0-100ms | Hover states, micro-feedback |
| Fast | 100-200ms | Buttons, toggles, small elements |
| Normal | 200-300ms | Cards, modals, most transitions |
| Slow | 300-400ms | Page transitions, large elements |
| Deliberate | 400-600ms | Complex reveals, onboarding |
| 类别 | 时长 | 适用场景 |
|---|---|---|
| 即时 | 0-100ms | 悬停状态、微反馈 |
| 快速 | 100-200ms | 按钮、开关、小型元素 |
| 常规 | 200-300ms | 卡片、模态框、大多数过渡动画 |
| 缓慢 | 300-400ms | 页面过渡、大型元素 |
| 刻意 | 400-600ms | 复杂展开动画、引导流程 |
Quick Fixes
快速修复方案
- Start with 200ms - Adjust from there
- Larger elements = longer duration - Size affects perceived speed
- Distance affects timing - Longer travel = longer duration
- Create a timing scale - Use 3-4 consistent values
- Test at 2x speed - If too slow works, use it
- 从200ms开始 - 在此基础上调整
- 元素越大,时长越长 - 尺寸会影响感知速度
- 距离影响时长 - 移动距离越长,时长越久
- 建立时间尺度 - 使用3-4个统一的时长值
- 以2倍速度测试 - 如果加速后仍合适,就使用这个速度
Troubleshooting Checklist
故障排查清单
- Is duration under 400ms for most UI?
- Do similar elements have similar timing?
- Is easing applied (not linear)?
- Does larger movement have longer duration?
- Test: Speed up by 30%—still readable?
- Test: Slow down by 30%—feels sluggish?
- Are users waiting for animations?
- Compare to platform conventions (iOS/Android/Web)
- 大多数UI动画的时长是否在400ms以内?
- 相似元素的动画时长是否一致?
- 是否应用了easing(而非线性)?
- 移动距离更长的动画是否有更长的时长?
- 测试:加速30%——仍然清晰可读吗?
- 测试:减速30%——是否显得拖沓?
- 用户是否需要等待动画完成?
- 是否与平台惯例(iOS/Android/Web)一致?
Code Pattern
代码模式
css
:root {
/* Timing scale */
--duration-instant: 50ms;
--duration-fast: 150ms;
--duration-normal: 250ms;
--duration-slow: 350ms;
--duration-deliberate: 500ms;
/* Easing */
--ease-out: cubic-bezier(0, 0, 0.2, 1);
--ease-in: cubic-bezier(0.4, 0, 1, 1);
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
}
/* Size-aware timing */
.small-element { transition-duration: var(--duration-fast); }
.medium-element { transition-duration: var(--duration-normal); }
.large-element { transition-duration: var(--duration-slow); }css
:root {
/* Timing scale */
--duration-instant: 50ms;
--duration-fast: 150ms;
--duration-normal: 250ms;
--duration-slow: 350ms;
--duration-deliberate: 500ms;
/* Easing */
--ease-out: cubic-bezier(0, 0, 0.2, 1);
--ease-in: cubic-bezier(0.4, 0, 1, 1);
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
}
/* Size-aware timing */
.small-element { transition-duration: var(--duration-fast); }
.medium-element { transition-duration: var(--duration-normal); }
.large-element { transition-duration: var(--duration-slow); }