本次构建的实测数据
Chrome,2026-09-28。所有条件和样本都在性能指南中。 测量方法
- 28.0KBKB gzip,全部 16 个导出
整个 Web 入口,已压缩。唯一的 peer 依赖是 React。
- 0动画进行时的 JS 帧回调
数字、高度和高亮同时变化:全部 12 个动画都由浏览器播放。
- 1每次值变化的 React 提交次数
MotionNumber在值变化时渲染,滚动过程中从不渲染。 - 11流式输出 3000 个字符时的 React 提交次数
MotionStream直接追加字符,每秒只合并进 React 几次。
01最简单
一个标签加上你的数据
每个组件都能独立工作:无需 Provider、包裹组件或初始化调用。集合类组件接收 items 和 renderItem,布局、文字和样式都归你所有。
- 导入一个组件,传一个值,集成就完成了。
- 列表、标签页和翻页器读取你的数组;key 默认为
item.id。 - 文本始终是真正的文本:会换行、随字体缩放,也可以被选中。
<MotionNumber value={total} />;<MotionSwap value={status}>{label}</MotionSwap>;<MotionHeight open={open}>{details}</MotionHeight>;<MotionHighlight items={tabs} value={tab} onValueChange={setTab} />;<MotionList items={tasks} renderItem={(task) => task.title} />;<ProgressRing value={progress} />;
六个实时运行的组件,以及各自背后的那一行代码。
正在准备示例…
02最快
交给浏览器播放,React 保持静止。
在 Web 上无需加载动画库:组件把动效交给 Web Animations API,所以滚动的数字或改变尺寸的面板在运动时不消耗每帧的 JavaScript,也不触发 React 渲染。
- 12 个动画同时运行时,JS 帧回调为 0 次。
- 每次值变化只有一次 React 提交,而不是每帧一次。
- 流式文本:3000 个字符只有 11 次 React 提交。下面的示例会统计自己的渲染次数。
正在准备示例…
03最稳定
随时打断,从不跳变。
每个新值都从屏幕上的当前状态开始,弹簧会保留速度,所以快速连点、数据成批到达和反向操作看起来都是有意为之。动效结束后,不会留下任何仍在运行的东西。
- 数字从不断开:保留的位数一边滚动一边滑动。
- 间隔 5 ms 连续输入 200 个新值:之后只剩 0 个动画,最终文本完全准确。
- 在 React StrictMode 下也安全。React Native 应用处于后台时,动效会直接落到结束状态。
正在准备示例…
数字与文本
内容与尺寸
选择与翻页
列表
手势
浮层
进度
- 聊天回答会收起的建议、以稳定节奏流式输出的回答,以及会切换的状态行。
MotionStreamMotionListMotionSwapMotionHeight - 结账摘要购物车变化时,数量、小计和总额都会滚动;优惠券提示会进出场;付款需要刻意长按。
MotionListMotionNumberMotionPresenceMotionHold - 收件箱带实时计数的筛选标签、可以滑走的行,以及会自动填补空隙的列表。
MotionHighlightMotionListMotionSwipeMotionNumber - 照片流滑动浏览照片,点缩略图跳转,全屏打开任意照片,并上拉查看详情。
MotionPagerMotionHighlightMotionZoomMotionSheet
Web 和 React Native 使用同一个 import
Metro 选择原生实现,Web 打包工具选择 DOM 实现。每个平台都以自己最擅长的方式播放动效。
// Web and React Native: the same import.
import { MotionNumber, MotionList } from '@kkwaenggwari/animated-chorus';
export function Score({ points, players }) {
return (
<>
<MotionNumber value={points} />
<MotionList items={players} renderItem={(player) => player.name} />
</>
);
}| 部分 | Web | React Native |
|---|---|---|
| transform 和 opacity | Web Animations API,弹簧经解析采样 | 使用原生驱动的 Animated |
| 宽度和高度 | Web Animations API | 使用 JS 驱动的 Animated,因为这属于布局 |
| 流式文本 | 追加字符并淡入;每秒只有几次 React 渲染 | 真正的 Text,不带淡入直接显示 |
| 底部面板与缩放 | 顶层的原生 dialog | 透明的 Modal;返回键可关闭 |
两分钟上手
安装,导入一个组件,传一个值。
npm install @kkwaenggwari/animated-chorus