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 と同じ呼び出し

Spinner.jsx
// 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

検索

入力するとドキュメントを検索します。