すべてのコンポーネント
MotionSwap
中身がクロスフェードし、サイズもそれに追従します。
WebReact Native内容とサイズ
試してみる
いちばん短い使い方
SaveButton.jsx<button onClick={save}>
<MotionSwap value={status} effect="up">
{status === 'saving' ? 'Saving…' : status === 'saved' ? 'Saved' : 'Save'}
</MotionSwap>
</button>;
代わりに処理してくれること
- 要素は画面上のサイズから新しい中身の本来のサイズへと変わるので、ボタンが跳ねることはありません。
- 古い中身は元の場所でフェードアウトし、新しい中身がフェードインします。切り替え中にどちらもレイアウトし直されません。
- 切り替えの途中で元に戻しても、コピーが重なることなく、画面に見えている状態から続きます。
- プレーンテキストの子要素はそれ自体が
value です。それ以外のものには value を渡します。
こんなときに
- 「保存」から「保存中…」、そして「保存しました」へ。
- スケルトンがプロフィールカードに変わる。
- 再生ボタンが一時停止ボタンに変わる。
props
| Prop | 型 | デフォルト | 説明 |
|---|
value | unknown | | 中身の識別子。新しい値で切り替わります。プレーンテキストの子要素はそれ自体が識別子です。 |
|---|
children | ReactNode | | 中身。 |
|---|
as | element | 'span' | 描画する要素。 |
|---|
inline | boolean | as === 'span' | true は中身(ラベル、アイコン)に合わせたサイズに、false は親の幅いっぱいに広がって高さをアニメーションします。 |
|---|
align | 'start' | 'center' | 'end' | 'center' | サイズが変わる間の中身の位置。 |
|---|
effect | 'fade' | 'up' | 'down' | 'scale' | 'fade' | 中身の出入りのしかた: up は上がり、down は下がり、scale は大きくなります。 |
|---|
transition | Transition | spring | タイミングカーブ { duration, easing } かスプリング { tempo: 'spring', spring }。スプリングは中断されても勢いを保ちます。 |
|---|
onMotionComplete | (value) => void | | モーションが落ち着いたときに実行されます。 |
|---|
ほかの props は描画される要素に渡るので、className、style、イベントハンドラーはいつもどおり使えます。