React DOM のためのモーション · React Native Animated API
モーションは一度書くだけ。なめらかに動き、決して崩れない。
Animated は React Native の Animated を Web に持ち込みます。ひとつの値でフレームごとの React レンダリングなしにいくつもの要素を動かし、対応するモーションはブラウザー自身が再生し、どんな中断も画面に見えている状態から続きます。
npm install @kkwaenggwari/animatedひとつのクロック値が 64 個すべての図形の波紋を動かしています。ステージの上でポインターを動かしてみてください。
このリリースでの計測値
1.0.0 ビルドを、デスクトップ PC のヘッドレス Chrome で計測しました。数値はデバイスによって異なります。 計測方法
- 0.00ms400 個の要素が動く間の、フレームあたりの JavaScript
Animated 要素の有限な transform と opacity のモーションはブラウザーが再生します。ページ自身のフレームコールバックは何もしません。
- 0.13msひとつの値が 10,000 個の要素を動かすときの、フレームあたりの JavaScript
値は CSS 変数を 1 つ書くだけ。すべての要素は CSS の中でそこからスタイルを導きます。
- 0モーション中の React レンダリング
値は React の state を通りません。コンポーネントがレンダリングされるのは props が変わったときで、フレームが進んだときではありません。
01 · かんたん
おなじみの API を、普通の React の style で
timing、spring、interpolate、loop、Animated.event は React Native と同じ名前と設定のまま。値は普通の style prop にそのまま入るので、最初のモーションの前に覚える特別なコンポーネントはありません。
Animated.ViewをAnimated.divに書き換えるだけで、React Native のコードを移植できます。- ひとつの値でバー、ダイヤル、カードの列を同時に動かせます。それぞれ独自の範囲で。
useAnimatedがレシピを管理します。マウント時に開始し、依存値が変わると再開し、アンマウント時に片付けます。
サンプルを準備中…
React Native と同じ呼び出し
// React Native
<Animated.View style={{ transform: [{ rotate }] }} />
// React DOM with @kkwaenggwari/animated — the rest is identical
<Animated.div style={{ transform: [{ rotate }] }} />
const spin = useAnimatedValue(0);
const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '360deg'] });
Animated.loop(
Animated.timing(spin, { toValue: 1, duration: 900, easing: Easing.linear, useNativeDriver: true }),
).start();02 · 速い
フレームごとの React レンダリングなし
フックの値は CSS 変数です。線形の補間や四則演算はその変数の正確な calc() 式になるので、1 フレームの書き込みは 1 回だけで、残りはブラウザーが導きます。Animated.<tag> 要素の有限な transform と opacity のモーションは、フレームコールバックなしでブラウザーが再生します。
- 点の数を変えてみてください。カウンターが示すとおり、React のレンダリングは変更ごとに 1 回で、フレームごとではありません。
scopeを使うと、値を要素ごとではなくコンテナーに 1 回だけ書き込みます。inspect(element)は、各プロパティがどの経路を使っているか、その理由とともに教えてくれます。
サンプルを準備中…
03 · 安定
どこで中断しても、続きから動く。
新しい目標は要素が画面上にある位置から始まり、スプリングなら速度も引き継ぐので、途中で反転しても止まらずになめらかに向きを変えます。フックで宣言したコントローラーは置き換え時とアンマウント時に停止・解放され、サーバーレンダリングしたマークアップもハイドレーション後にアニメーションを続けます。
- すばやく 2 回クリックしてみてください。
springでは軌跡が曲がり、timingでは位置を保ったまま新しいカーブが始まります。 - 停止すると値はその場に留まり、終了状態に飛ぶことはありません。
- アンマウント後も、ページ遷移後も、非表示のタブでも、取り残されたフレームループはありません。
サンプルを準備中…
Animated でつくられています
完成したコンポーネントが必要なら、Animated Chorus。
回転する数字、移動するタブのハイライト、進捗表示、シート、アニメーション付きリスト。React と React Native にそのまま組み込めます。ここにある 3 つは、このページでいま実際に動いています。
Animated Chorus を見る3 分ではじめる
パッケージをインストールし、最初の値を動かしたら、目の前の課題に合うガイドを選びましょう。
npm install @kkwaenggwari/animated