0Pricing
React Academy · レッスン

ライブラリを使わない入退場アニメーション

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Reactの状態変更によるCSSトランジション
  2. ReactでのCSSキーフレームアニメーション
  3. アニメーション前の測定に useLayoutEffect を使う
  4. ライブラリを使わない入退場アニメーション
← React Academyに戻る