framer-motion について
Framer Motionの宣言的なReact APIで、ディズニーのアニメーション12原則を実装するスキルです。原則ごとの手法と関連機能を紹介します。
主な機能
- 01アニメーション12原則のガイド
- 02animateとvariantsによる状態設定
- 03ホバーとタップのジェスチャーアニメーション
- 04時間とイージングの設定
- 05退出アニメーションとレイアウト変更
活用シーン
- 01表現豊かなReact UIアニメーションの設計
- 02ホバーやタップへのフィードバック追加
- 03子要素を順番に表示
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dylantarre/ animation-principles --skill framer-motionインストール後、Claude Code で/framer-motionを入力して読み込まれたか確認します。
詳細
Framer Motion のアニメーション原則
Framer Motion の宣言的な React API を使って、ディズニーのアニメーション原則を 12 個すべて実装します。
1. つぶしと伸ばし
<motion.div
animate={{ scaleX: [1, 1.2, 1], scaleY: [1, 0.8, 1] }}
transition={{ duration: 0.3, times: [0, 0.5, 1] }}
/>
2. 予備動作
<motion.div
variants={{
idle: { y: 0, scaleY: 1 },
anticipate: { y: 10, scaleY: 0.9 },
jump: { y: -200 }
}}
initial="idle"
animate={["anticipate", "jump"]}
transition={{ duration: 0.5, times: [0, 0.2, 1] }}
/>
3. 演出
<motion.div animate={{ filter: "blur(3px)", opacity: 0.6 }} /> {/* bg */}
<motion.div animate={{ scale: 1.1, zIndex: 10 }} /> {/* hero */}
4. ストレートアヘッドとポーズ・トゥ・ポーズ
<motion.div
animate={{
x: [0, 100, 200, 300],
y: [0, -50, 0, -30]
}}
transition={{ duration: 1, ease: "easeInOut" }}
/>
5. フォロースルーとオーバーラッピングアクション
<motion.div animate={{ x: 200 }} transition={{ duration: 0.5 }}>
<motion.span
animate={{ x: 200 }}
transition={{ duration: 0.5, delay: 0.05 }} // hair
/>
<motion.span
animate={{ x: 200 }}
transition={{ duration: 0.6, delay: 0.1 }} // cape
/>
</motion.div>
6. スローインとスローアウト
<motion.div
animate={{ x: 300 }}
transition={{
duration: 0.6,
ease: [0.42, 0, 0.58, 1] // easeInOut cubic-bezier
}}
/>
// Or use: "easeIn", "easeOut", "easeInOut"
7. アーク
<motion.div
animate={{
x: [0, 100, 200],
y: [0, -100, 0]
}}
transition={{ duration: 1, ease: "easeInOut" }}
/>
8. 二次的動作
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
>
<motion.span
animate={{ rotate: [0, 10, -10, 0] }}
transition={{ duration: 0.3 }}
>
Icon
</motion.span>
</motion.button>
9. タイミング
const timings = {
fast: { duration: 0.15 },
normal: { duration: 0.3 },
slow: { duration: 0.6 },
spring: { type: "spring", stiffness: 300, damping: 20 }
};
10. 誇張
<motion.div
animate={{ scale: 1.5, rotate: 720 }}
transition={{
type: "spring",
stiffness: 200,
damping: 10 // low damping = overshoot
}}
/>
11. 立体感のある描写
<motion.div
style={{ perspective: 1000 }}
animate={{ rotateX: 45, rotateY: 30 }}
transition={{ duration: 0.5 }}
/>
12. 魅力
<motion.div
whileHover={{
scale: 1.02,
boxShadow: "0 20px 40px rgba(0,0,0,0.2)"
}}
transition={{ duration: 0.3 }}
/>
子要素をスタッガー表示
const container = {
hidden: { opacity: 0 },
show: {
opacity: 1,
transition: { staggerChildren: 0.1 }
}
};
<motion.ul variants={container} initial="hidden" animate="show">
{items.map(item => <motion.li variants={itemVariant} />)}
</motion.ul>
Framer Motion の主な機能
animate- 目標状態variants- 名前付きアニメーション状態whileHover/whileTap- ジェスチャーアニメーションtransition- タイミングとイージングAnimatePresence- 終了時のアニメーションuseAnimation- プログラムによる制御layout- レイアウトの変更を自動でアニメーション
コメント
Markdown 対応