React · React Native · 16 のコンポーネント
難しいインタラクションを、完成品で。
Animated Chorus は、手で正しくつくるのが難しいインタラクションのためのモーションコンポーネント集です。回転する数字、ストリーミングテキスト、サイズが追従する切り替え、シート、ページャー、スワイプアクション、変わった項目だけが動くリスト。タグひとつとデータだけ。Provider もセットアップも要りません。
npm install @kkwaenggwari/animated-chorusこのビルドでの計測値
Chrome、2026-09-28。すべての条件とサンプルはパフォーマンスガイドにあります。 計測方法
- 28.0KB16 のエクスポートすべての KB(gzip 後)
Web のエントリー全体を minify したもの。peer は React だけです。
- 0アニメーション中の JS フレームコールバック
数字、高さ、ハイライトが同時に変わっても、12 個のアニメーションはすべてブラウザーが再生します。
- 1値の変更 1 回あたりの React コミット
MotionNumberは値が変わったときにレンダリングされ、回転している間はレンダリングされません。 - 113000 文字のストリーミングでの React コミット
MotionStreamは文字を直接追加し、1 秒に数回だけ React に反映します。
01いちばんかんたん
タグひとつとデータだけ
どのコンポーネントも単体で動きます。Provider もラッパーも初期化の呼び出しも要りません。コレクションは items と renderItem を受け取り、レイアウト、テキスト、スタイルはあなたのものです。
- コンポーネントをひとつ import して値を渡す。組み込みはそれだけです。
- リスト、タブ、ページャーはあなたの配列を読みます。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} />;
動いている 6 つのコンポーネントと、それぞれを支える 1 行のコード。
サンプルを準備中…
02いちばん速い
再生はブラウザーに。React は静かなまま。
Web では読み込むアニメーションライブラリーがありません。コンポーネントはモーションを Web Animations API に任せるので、回転する数字やサイズが変わるパネルも、動いている間はフレームごとの JavaScript も React レンダリングもかかりません。
- 12 個のアニメーションが同時に動いている間の JS フレームコールバックは 0 回。
- React のコミットは値の変更ごとに 1 回で、フレームごとではありません。
- ストリーミングテキスト: 3000 文字に対して React のコミットは 11 回。下のサンプルは自分のレンダリング回数を数えています。
サンプルを準備中…
03いちばん安定
何を中断しても、飛ばない。
新しい値はすべて画面に見えている状態から始まり、スプリングは速度を保つので、連打もデータの一斉到着も反転も、意図したとおりに見えます。モーションが終われば、動き続けるものは何も残りません。
- 数字が割れることはありません。残る桁は回転しながらスライドします。
- 5 ms 間隔で 200 回の新しい値: 後に残るアニメーションは 0 個で、最後のテキストも正確です。
- React StrictMode でも安全です。バックグラウンドの React Native アプリでは、モーションは終了状態に落ち着きます。
サンプルを準備中…
役割別に並べた 16 のコンポーネント
数字とテキスト、サイズが変わる内容、選択、リスト、ジェスチャー、オーバーレイ、進捗。それぞれに、横で props を調整できる動くワークベンチがあります。
すべてのコンポーネント数字とテキスト
内容とサイズ
選択とページ送り
リスト
ジェスチャー
オーバーレイ
進捗
- チャットの回答折りたたまれる提案、一定のペースで流れる回答、切り替わるステータス行。
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 のレンダリングは 1 秒に数回 | 本物の Text。フェードなしで表示 |
| シートとズーム | トップレイヤーのネイティブ dialog | 透明な Modal。戻るボタンで閉じる |
2 分ではじめる
インストールして、コンポーネントをひとつ import し、値を渡すだけ。
npm install @kkwaenggwari/animated-chorus