試してみる
サンプルを準備中…
いちばん短い使い方
<MotionNumber value={count} />
<MotionNumber value={total} mode="roll" intl locale="en-US"
format={{ style: 'currency', currency: 'USD' }} />
<MotionText>{status}</MotionText>代わりに処理してくれること
- 繰り上がり:
999 → 1,000では、変わった桁がすべて走行距離計のように同じ向きに回ります。 - 増えたり減ったりする桁は、パッと切り替わらず、自分の列で回って出入りします。
- 区切り記号、符号、通貨記号は、属する桁と一緒にフェードイン・フェードアウトします。
- 残る桁は回転しながら新しい位置へスライドするので、数字が割れることはありません。
- モーションの途中で新しい値が来ても、画面に見えている状態からそのまま続きます。
- フォーマットに
Intlは必須ではありません。テキストかformat関数を渡すか、intlでオプトインします。
こんなときに
- 商品を追加するたびに変わるカートの合計。
- リアルタイムのカウンターやスコア。
- 数秒ごとに更新されるダッシュボードの数値。
props
MotionNumber
| Prop | 型 | デフォルト | 説明 |
|---|---|---|---|
value | number | bigint | string | —必須 | 数値、または呼び出し側でフォーマットした数字のテキスト。 |
mode | 'replace' | 'roll' | 'replace' | replace は変わった桁を 1 段だけ動かし、roll は途中の数字を通って回ります。 |
direction | 'auto' | 'digit' | 'up' | 'down' | 'auto' | auto は大きさの変化に従うので繰り上がりが同じ向きに回り、digit は桁ごとに個別に比較します。 |
stagger | number | 45 | 変わった桁どうしの間隔(ミリ秒)。1 の位から外側へ。波全体の長さには上限があります。 |
format | (value) => string | Intl.NumberFormatOptions | 表示するテキストを返す関数、または Intl.NumberFormat のオプション(intl と一緒に)。 | |
intl | boolean | false | 組み込みの Intl.NumberFormat を使います。どのランタイムでも Intl を必須にしないよう、デフォルトはオフです。 |
locale | string | string[] | intl で使うロケール。 | |
prefix | string | 数字の前のテキスト。 | |
suffix | string | 数字の後のテキスト。 | |
transition | Transition | spring | タイミングカーブ { duration, easing } かスプリング { tempo: 'spring', spring }。スプリングは中断されても勢いを保ちます。 |
onMotionComplete | (value) => void | 桁が落ち着いた後に、その値を受け取って実行されます。 |
MotionText
| Prop | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | 表示するテキスト。 | |
as | element | 'span' | 描画する要素。 |
transition | Transition | spring | タイミングカーブ { duration, easing } かスプリング { tempo: 'spring', spring }。スプリングは中断されても勢いを保ちます。 |
onMotionComplete | (text) => void | モーションが落ち着いたときに実行されます。 |
ほかの props は描画される要素に渡るので、className、style、イベントハンドラーはいつもどおり使えます。
Web と React Native
Web では、各桁が Web Animations API で再生される小さなグリフの束になり、テキストは選択できるままです。MotionText はどんなテキストもアニメーションします。数字のテキストは桁ごとに回転し、それ以外のテキストは切り替わります。
React Native では、数字は本物の Text のままなので、レイアウト、選択、アクセシビリティ、折り返しや numberOfLines もそのまま使えます。グリフはネイティブドライバーで動きます。