Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

framer-motion

ReactアプリケーションでFramer Motion/Motionライブラリを使用した、パフォーマンスに優れたアニメーションを構築するための専門的なガイドラインを提供します。アニメーションの実装方法やベストプラクティスについて的確なアドバイスが必要な場面で活躍します。

description の原文を見る

Expert guidelines for building performant animations with Framer Motion/Motion library in React applications

SKILL.md 本文

Framer Motion / Motion アニメーションガイドライン

Framer Motion(現在は Motion)、React、TypeScript のエキスパートです。アニメーションを作成する際は、以下のガイドラインに従ってください。

コア原則

正しいパッケージからインポートする

  • React プロジェクトでは import { motion } from "motion/react" を使用する("framer-motion" は廃止済み)
  • ライブラリは Framer Motion から Motion に改名されました
  • 常に最新の Motion API を使用してください

パフォーマンス優先のアプローチ

  • 最高のパフォーマンスのため、transform プロパティ(xyscalerotate)と opacity をアニメーション化する
  • これらのプロパティはハードウェア加速が可能で、レイアウト再計算をトリガーしません
  • widthheighttopleftmarginpadding のようなレイアウトシフトを引き起こすプロパティのアニメーション化は避けてください

ハードウェア加速

will-change を適切に使用する

// Transform をアニメーション化する場合
<motion.div
  style={{ willChange: "transform" }}
  animate={{ x: 100, y: 50, scale: 1.2 }}
/>

// その他の GPU 加速プロパティをアニメーション化する場合
<motion.div
  style={{ willChange: "opacity, transform" }}
  animate={{ opacity: 0.5, x: 100 }}
/>

willChange に追加するプロパティ

  • transform - x, y, scale, rotate, skew 用
  • opacity - opacity アニメーション用
  • filter - blur、brightness など用
  • clipPath - clip-path アニメーション用
  • backgroundColor - 背景色トランジション用

アニメーションのベストプラクティス

複雑なアニメーションに Variants を使用する

const containerVariants = {
  hidden: { opacity: 0 },
  visible: {
    opacity: 1,
    transition: {
      staggerChildren: 0.1
    }
  }
};

const itemVariants = {
  hidden: { y: 20, opacity: 0 },
  visible: { y: 0, opacity: 1 }
};

共有要素トランジションに layoutId を使用する

<motion.div layoutId="shared-element" />

Spring アニメーションを優先する

// Spring はドuration ベースのアニメーションよりも自然に見える
<motion.div
  animate={{ x: 100 }}
  transition={{ type: "spring", stiffness: 300, damping: 30 }}
/>

React 統合

パフォーマンスのためのメモ化

// アニメーション variant をメモ化する
const variants = useMemo(() => ({
  hidden: { opacity: 0 },
  visible: { opacity: 1 }
}), []);

// コールバックをメモ化する
const handleAnimationComplete = useCallback(() => {
  // ハンドラロジック
}, []);

インラインスタイルオブジェクトを避ける

// 悪い例 - 毎回レンダーするたびに新しいオブジェクトを生成する
<motion.div style={{ willChange: "transform" }} />

// 良い例 - 外部で定義するか、メモ化する
const style = { willChange: "transform" };
<motion.div style={style} />

アクセシビリティ

減少モーション設定を尊重する

import { useReducedMotion } from "motion/react";

function Component() {
  const shouldReduceMotion = useReducedMotion();

  return (
    <motion.div
      animate={{ x: shouldReduceMotion ? 0 : 100 }}
      transition={{ duration: shouldReduceMotion ? 0 : 0.3 }}
    />
  );
}

ジェスチャーアニメーション

ジェスチャープロップを正しく使用する

<motion.button
  whileHover={{ scale: 1.05 }}
  whileTap={{ scale: 0.95 }}
  transition={{ type: "spring", stiffness: 400, damping: 17 }}
/>

スクロールアニメーション

スクロール連動アニメーションに useScroll を使用する

import { useScroll, useTransform, motion } from "motion/react";

function ParallaxComponent() {
  const { scrollYProgress } = useScroll();
  const y = useTransform(scrollYProgress, [0, 1], [0, -100]);

  return <motion.div style={{ y }} />;
}

終了アニメーション

終了アニメーションに AnimatePresence を使用する

import { AnimatePresence, motion } from "motion/react";

<AnimatePresence mode="wait">
  {isVisible && (
    <motion.div
      key="modal"
      initial={{ opacity: 0 }}
      animate={{ opacity: 1 }}
      exit={{ opacity: 0 }}
    />
  )}
</AnimatePresence>

一般的なパターン

スタッガード リストアニメーション

<motion.ul
  initial="hidden"
  animate="visible"
  variants={{
    visible: { transition: { staggerChildren: 0.07 } }
  }}
>
  {items.map((item) => (
    <motion.li
      key={item.id}
      variants={{
        hidden: { opacity: 0, y: 20 },
        visible: { opacity: 1, y: 0 }
      }}
    />
  ))}
</motion.ul>

ページトランジション

const pageTransition = {
  initial: { opacity: 0, x: -20 },
  animate: { opacity: 1, x: 0 },
  exit: { opacity: 0, x: 20 },
  transition: { duration: 0.3 }
};

パフォーマンスデバッグ

  • React DevTools を使用してリレンダーを検査する
  • Chrome DevTools のパフォーマンスタブを使用してアニメーションのジャンクを特定する
  • 最小 60fps、高リフレッシュレートディスプレイでは 120fps を目指す
  • 実際のデバイス、特に中程度のスペックの Android スマートフォンでテストする

ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
mindrally
リポジトリ
mindrally/skills
ライセンス
Apache-2.0
最終更新
不明

Source: https://github.com/mindrally/skills / ライセンス: Apache-2.0

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: mindrally · mindrally/skills · ライセンス: Apache-2.0