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 プロパティ(
x、y、scale、rotate)とopacityをアニメーション化する - これらのプロパティはハードウェア加速が可能で、レイアウト再計算をトリガーしません
width、height、top、left、margin、paddingのようなレイアウトシフトを引き起こすプロパティのアニメーション化は避けてください
ハードウェア加速
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
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。