animation
package version >0.2.0
shadcn any version
author: cmtlyt
update time: 2026/04/02 10:17:59
animation 是一个轻量级、高性能的动画工具库,支持数值、数组、对象的平滑过渡动画。提供完整的动画控制能力,包括暂停、恢复、清除等功能,以及丰富的回调函数和缓动函数支持。
特性
- 简单易用:简洁的 API,快速上手
- 完整控制:支持 start、stop、clear 等控制方法
- 类型安全:完整的 TypeScript 类型支持
- 灵活的数据类型:支持数值、数组、对象及其嵌套组合
- 自定义缓动:内置缓动函数,支持自定义 easing
- 回调丰富:提供 onStart、onUpdate、onComplete 等生命周期回调
- 暂停恢复:支持动画的暂停和恢复,保持时间准确性
- 高性能:基于 requestAnimationFrame 实现,流畅高效
install
npm
shadcn
usage
基础用法
数值动画
数组动画
对象动画
动画控制
暂停和恢复
清除动画
手动启动
回调函数
生命周期回调
缓动函数
使用内置缓动
自定义缓动
数据处理
Parser 和 Formatter
说明:
formatterValue:对插值计算后的数值进行格式化,如果和formatter同用建议返回数值类型formatter:对 formatterValue 处理后的值进行最终格式化,可以返回任意类型- 如果只需要一次格式化,可以只使用
formatter,省略formatterValue
嵌套数据结构
stepAnimation
生成指定步数的动画值序列。
部分迭代
支持数组和对象
API
animation(from, to, duration, options?)
创建一个动画实例。
参数
- from:
T- 起始值,支持数值、数组、对象
- to:
T- 结束值,必须与 from 类型相同
- duration:
number- 动画持续时间(毫秒),必须为正整数
- options?:
AnimationOptions- autoStart?:
boolean- 是否自动启动动画,默认为
true
- 是否自动启动动画,默认为
- easing?:
(time: number) => number- 缓动函数,默认为线性缓动
(t) => t
- 缓动函数,默认为线性缓动
- onStart?:
() => void- 动画开始时的回调
- onStop?:
() => void- 动画停止时的回调
- onClear?:
() => void- 动画清除时的回调
- onUpdate?:
(value: any) => void- 动画更新时的回调,接收当前值
- onComplete?:
() => void- 动画完成时的回调
- parser?:
(value: any) => number- 解析函数,将输入值转换为数值
- formatterValue?:
(value: number) => any- 数值格式化函数,对插值计算后的数值进行格式化
- formatter?:
(value: T) => any- 最终格式化函数,对 formatterValue 处理后的值进行二次格式化
- autoStart?:
返回值
- 返回值:
AnimationResult- promise:
Promise<boolean>- 动画 Promise,完成时 resolve 为
false,清除时 resolve 为true
- 动画 Promise,完成时 resolve 为
- start:
() => void- 启动动画
- stop:
() => void- 暂停动画
- clear:
() => void- 清除动画
- promise:
类型定义
stepAnimation(from, to, step, options?)
生成指定步数的动画值序列。
参数
- from:
T- 起始值,支持数值、数组、对象
- to:
T- 结束值,必须与 from 类型相同
- step:
number- 步数,必须为正整数
- options?:
AnimationBaseOptions- parser?:
(value: any) => number- 解析函数
- formatterValue?:
(value: number) => any- 数值格式化函数,对插值计算后的数值进行格式化
- formatter?:
(value: T) => any- 最终格式化函数,对 formatterValue 处理后的值进行二次格式化
- parser?:
返回值
- 返回值:
Generator<T, void, unknown>- 生成器,可以迭代获取每个步骤的值
使用场景
数字计数动画
进度条动画
元素位置动画
颜色动画
响应用户交互
最佳实践
1. 清理动画
在组件卸载或不再需要动画时,及时清理:
2. 避免内存泄漏
确保在适当的时候调用 clear() 方法:
3. 合理使用缓动函数
根据动画类型选择合适的缓动函数:
4. 使用 formatterValue 和 formatter 格式化输出
确保输出值符合预期格式:
提示: 如果只需要一次格式化,可以只使用 formatter,省略 formatterValue。
注意事项
- duration 必须为正整数:duration 参数必须是正整数,否则会抛出错误
- from 和 to 类型必须一致:from 和 to 的类型必须相同,否则会抛出错误
- 数组长度必须匹配:如果 from 和 to 是数组,它们的长度必须相同
- 对象 key 必须匹配:如果 from 和 to 是对象,to 的所有 key 必须在 from 中存在
- stop() 后会有一次额外的 update:调用 stop() 后,当前帧会继续执行完成,会有一次额外的 update 调用
- clear() 会立即停止动画:clear() 方法会立即停止动画并 resolve promise,不会触发 onComplete 回调
- requestAnimationFrame 降级:在不支持 requestAnimationFrame 的环境中,会降级使用 setTimeout(16ms 间隔)
- 暂停恢复的时间准确性:暂停和恢复功能会保持时间的准确性,不会因为暂停时间而影响动画进度
- formatter: formatterValue 是对每个值进行格式化, formatter 是对这一帧的完整计算结果进行格式化