📄
概念 📚 software-design-concepts

アニメーションとインタラクション

CSSアニメーション・Web Animations API・Framer Motionを活用したパフォーマンスを損なわない動き設計

UIのアニメーションは、ユーザーに状態変化を伝え、操作の結果を視覚的にフィードバックするという重要な役割を持つ。「アニメーションはデコレーション」という誤解があるが、適切に設計されたアニメーションは認知負荷を下げ、ユーザーがシステムの状態を直感的に把握する助けになる。一方で過剰・不必要なアニメーションは集中の妨げになり、前庭障害を持つユーザーには身体的な不快感を引き起こすこともあるため、prefers-reduced-motion メディアクエリへの対応が不可欠である。

パフォーマンスの観点から、CSSアニメーションとWeb Animations API(WAAPI)はGPUで合成される transformopacity プロパティを使うことでメインスレッドをブロックしないアニメーションを実現できる。widthheightmargintop 等のレイアウトを引き起こすプロパティをアニメーションさせると、毎フレームでレイアウト計算が走り(リフロー)、60fpsを維持できなくなる。requestAnimationFrame はJavaScriptからフレームごとに処理を実行する低レベルAPIであり、複雑な物理ベースのアニメーションに使われるが、transformの変更であってもJavaScriptからの操作はメインスレッドで動作する点に留意が必要である。

Framer MotionはReact向けのアニメーションライブラリで、宣言的なAPIで複雑なアニメーションを実現できる。特にレイアウトアニメーション(layoutプロパティ)は、要素のサイズや位置が変化するときに自動でスムーズなアニメーションを適用する機能であり、Accordionやリストの並べ替えのような複雑なアニメーションを少ないコードで実装できる。ページ遷移アニメーションはApp RouterやTanStack Routerと組み合わせた実装が各フレームワークで整備されつつある。

コードレビューで着目するポイント

  • アニメーションが transformopacity のみを変化させており、widthheightmargin 等レイアウトを引き起こすプロパティを使っていないか
  • prefers-reduced-motion: reduce を適用する際に、アニメーションが完全に無効化されているか(単に速くするだけでは不十分)
  • Framer Motion の AnimatePresence を使ったマウント/アンマウントアニメーションで、keyが正しく設定されているか
  • requestAnimationFrame のコールバック内でDOMを読み書きする際に、強制的なレイアウト(Forced Synchronous Layout)が発生していないか
  • アニメーションの継続時間がUXの観点で適切か(マイクロインタラクションは100〜300ms、ページ遷移は200〜500ms程度が一般的)
  • ループアニメーションやパーティクルのような高負荷なアニメーションに処理負荷の上限(フレームスキップ対応等)が設けられているか

典型的なアンチパターン

レイアウトアニメーション: height: 0 から height: auto へのCSS transitionや、margin-top を変化させるアニメーションは毎フレームでレイアウト計算を強制する。transform: scaleY() や Framer Motion の layout プロパティを代替として使うことでGPU合成に乗せられる。

reduced-motion の未対応: prefers-reduced-motion を設定しているユーザーに対してアニメーションをそのまま表示し続けることは、前庭障害を持つユーザーに具体的な身体的苦痛を引き起こす可能性がある。グローバルなCSSに @media (prefers-reduced-motion: reduce) { * { animation: none; transition: none; } } を必ず含める。

useEffect内でのDOMアニメーション直接操作: ReactのuseEffect内でDOMのstyleを直接書き換えてアニメーションを実装すると、Reactの仮想DOMとの整合性が崩れ、予期しない状態リセットが発生する。Framer MotionやWeb Animations API、またはCSSのclass切り替えでアニメーションを制御するのが正しいアプローチである。

参考リソース

  • ツール: Framer Motion - ReactのためのアニメーションライブラリのAPIリファレンスとサンプル集
  • 標準: Web Animations API - ブラウザネイティブのアニメーションAPIの仕様
  • 書籍: 「The Illusion of Life」(Frank Thomas, Ollie Johnston) - アニメーションの12原則の原典(ディズニーアニメーターによる)
  • 記事: Animations and Performance - GoogleによるGPU合成アニメーションのガイド
  • ツール: Motion One - Web Animations APIをベースにした軽量アニメーションライブラリ
  1. 1. 📄アーキテクチャスタイル
  2. 2. 📄ドメインモデリング
  3. 3. 📄モジュール分割と依存管理
  4. 4. 📄データモデリング
  5. 5. 📄API設計
  6. 6. 📄整合性とトランザクション
  7. 7. 📄非同期処理(Queue/Event)
  8. 8. 📄キャッシング
  9. 9. 📄ユーザーリサーチ
  10. 10. 📄情報アーキテクチャ
  11. 11. 📄インタラクションデザイン
  12. 12. 📄UX原則とヒューリスティクス
  13. 13. 📄アクセシビリティ(UX観点)
  14. 14. 📄UXメトリクス
  15. 15. 📄スケーラビリティ
  16. 16. 📄可用性とレジリエンス
  17. 17. 📄オブザーバビリティ
  18. 18. 📄環境・インフラ設計
  19. 19. 📄データマイグレーション
  20. 20. 📄セキュリティ設計原則
  21. 21. 📄データ保護とマルチテナント
  22. 22. 📄LLMセキュリティ
  23. 23. 📄ビジュアルデザイン原則
  24. 24. 📄デザインシステム
  25. 25. 📄コンポーネント設計
  26. 26. 📄スタイリング
  27. 27. 📄状態管理
  28. 28. 📄フロントエンドパフォーマンス
  29. 29. 📄アクセシビリティ(実装観点)
  30. 30. 📄アニメーションとインタラクション
  31. 31. 📄設計原則
  32. 32. 📄デザインパターン(GoF)
  33. 33. 📄エンタープライズパターン
  34. 34. 📄クリーンコード
  35. 35. 📄リファクタリング
  36. 36. 📄型設計とコントラクト
  37. 37. 📄関数型プログラミング概念
  38. 38. 📄エラーハンドリング
  39. 39. 📄テスト戦略と哲学
  40. 40. 📄テスト種別(機能テスト)
  41. 41. 📄テスト種別(UI・ビジュアル)
  42. 42. 📄テスト種別(契約・境界)
  43. 43. 📄テスト種別(非機能テスト)
  44. 44. 📄テストダブル
  45. 45. 📄テスト設計技法
  46. 46. 📄並行処理・マルチスレッド
  47. 47. 📄パフォーマンス最適化
  48. 48. 📄ドキュメント管理
  49. 49. 📄バージョン管理と開発プロセス
  50. 50. 📄脅威モデリング
  51. 51. 📄通信保護(TLS)
  52. 52. 📄暗号化・機密情報管理
  53. 53. 📄認証・セッション管理
  54. 54. 📄認可・アクセス制御
  55. 55. 📄入力バリデーション
  56. 56. 📄インジェクション攻撃
  57. 57. 📄出力エンコーディング
  58. 58. 📄エラーハンドリング(セキュリティ観点)
  59. 59. 📄SSRF(サーバーサイドリクエストフォージェリ)
  60. 60. 📄依存関係管理
  61. 61. 📄設計・実装 参考書籍
  62. 62. 📄セキュリティ参考資料
  63. 63. 📄正規化(データベース正規化)