ライブラリを使わない入退場アニメーション
React で表示と不透明度のタイミングを手動制御し、マウント時とアンマウント時のアニメーションを実装します。
「ライブラリを使わない入退場アニメーション」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
アンマウントの問題
{show && のように条件付きでレンダリングすると、show が false になった瞬間に React は要素を DOM から削除します。ノードはすでに存在しなくなるため、終了アニメーションを実行する時間がありません。
開始アニメーションは簡単ですが、終了アニメーションが本当の課題です。
解決策 1: マウントしたままにする
最も簡単な修正方法は、アンマウントしないことです。要素をレンダリングしたままにし、非表示のときは opacity を 0 にして pointer-events: none を設定し、表示するときは 1 に戻します。
要素が DOM に残り続ける代わりに、両方向のフェードを滑らかに実現できます。
解決策 2: マウント状態機械
本当にアンマウントするには、mounting、mounted、unmounting、unmounted などのフェーズを持つ小さな状態機械をモデル化します。終了アニメーションが完了するまで、ノードは削除しません。
各フェーズでどのアニメーション用クラスを適用するかは、state によって決まります。
useMount フック
この状態機械は、一般に useMount と呼ばれるカスタムフックにカプセル化できます。目的の表示状態を受け取り、要素を DOM に含めるべきかどうかと、現在のフェーズを返します。
タイミングのロジックが再利用可能なフックに置かれるため、コンポーネントをすっきり保てます。
開始・終了クラスの組み合わせ
一般的な規約にならい、マウント時には enter、続いて enter-active を適用し、削除時には exit、続いて exit-active を適用します。ベースクラスで開始状態を設定し、active クラスでトランジションを使った終了状態を設定します。
適切なタイミングでこの 2 つを切り替えると、アニメーションが実行されます。
transitionend を監視する
終了アニメーションがいつ完了したかを知るには、要素の transitionend イベントを監視します。終了アニメーションでこのイベントが発生したら、state を unmounted に切り替えてノードを削除します。
これにより、推測したタイムアウトではなく、視覚的なアニメーションの終了に正確に合わせてアンマウントできます。
再利用可能な Transition コンポーネント
これらすべてを、in prop と children を受け取る Transition コンポーネントにまとめられます。子要素を終了アニメーションの間マウントしたままにし、フェーズごとに適切なクラスを適用します。
利用側は in を切り替えるだけで、正しい開始・終了アニメーションをそのまま利用できます。
Active クラスを正しくトリガーする
細かな点ですが、active クラスを追加する前に、ブラウザーに開始クラスを描画させる必要があります。そうしないとトランジションなしで跳ねてしまいます。2 つの処理の間に requestAnimationFrame を挟むか、強制的にリフローを発生させると、トランジションが実際に実行されます。
これにより、ブラウザーがまず開始時の値を確実に登録します。
react-transition-group との比較
ライブラリの react-transition-group には、クラスのライフサイクルやアンマウントのタイミングを含め、このパターンをそのまま実装する Transition と CSSTransition コンポーネントが用意されています。
自作版はこのライブラリの中心的な考え方を反映しているため、一度自分で作ってみるとライブラリも簡単に理解できます。
ライブラリと自作実装の使い分け
単純なフェードが 1 つだけなら、マウントしたままにする方法や小さなフックで十分で、依存関係も増やさずに済みます。複数のトランジションを連携させる場合、追加と削除を伴うリストを扱う場合、または複雑な順序制御が必要な場合は、ライブラリによって時間を節約でき、エッジケースによるバグも減らせます。
アプリに実際に必要なアニメーションの複雑さに応じて選択してください。
全体を組み立てる
終了アニメーションでは、アニメーションが完了するまで要素を保持する必要があります。これは、アンマウントしない方法、transitionend を使う状態機械、またはライブラリによって実現できます。
仕組みを理解していれば、必要な要件を満たす最も軽量な方法を選べます。
理解度チェック
終了アニメーションについての理解度を確認しましょう。
まとめ
終了アニメーションが難しい理由、2 つの解決策(マウントしたままにする方法とマウント状態機械)、transitionend によってアンマウントのタイミングを制御する方法、そして再利用可能な Transition コンポーネントの作り方を学びました。
また、自作実装ではなく react-transition-group を使うタイミングも確認しました。
よくある質問
「ライブラリを使わない入退場アニメーション」レッスンは無料ですか?
はい。「ライブラリを使わない入退場アニメーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「ライブラリを使わない入退場アニメーション」で何を学びますか?
React で表示と不透明度のタイミングを手動制御し、マウント時とアンマウント時のアニメーションを実装します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ライブラリを使わない入退場アニメーション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Reactの状態変更によるCSSトランジション
- ReactでのCSSキーフレームアニメーション
- アニメーション前の測定に useLayoutEffect を使う
- ライブラリを使わない入退場アニメーション