✨ 第13章:Framer Motionで極上のマイクロアニメーションを実装
前章では、Tailwind CSSを使って美しいグラスモーフィズムの打刻ボタンを実装しました。Tailwindのコードをよく見ると、transition duration-300 hover:-translate-y-1のような記述があるのに気付いたかもしれません。
これは「マウスオーバーでボタンが少し浮き上がる」シンプルな効果で、従来のWeb制作では十分と言えるレベルです。
しかし、あなたのシステムが React (Vite/Next.js) 上に構築されていて、この「Webページ」をスマホにインストールされた「ネイティブアプリ (Native App)」のように感じさせたいなら、従来のCSSトランジションだけでは物足りません。
そんな時こそ、より強力で現実世界の物理法則に則った神レベルのアニメーションライブラリが必要です:Framer Motion。
スプリング物理:なぜ特定のアプリは押した時に気持ちいいのか?
「物理を感知する」アニメーションとは? 現実世界で物理的なボタンを強く押すと、ボタンは押しつぶされ、手を離せば内蔵されたスプリングがボタンを元に戻し、さらに小さく振動します。 この「慣性」と「減衰」を伴うフィードバックは、ユーザーの脳に「確実に押した」という確信を与えます。
Framer Motionを使えば、複雑な数式を書く必要なく、いくつかの属性を追加するだけでこの効果を簡単に実現できます。
まず、Framer Motionをインストール:
npm install framer-motion
次に、通常の<button>を<motion.button>に置き換えます:
// Framer Motionのmotionコンポーネントをインポート
import { motion } from "framer-motion";
export default function PunchButton() {
return (
<motion.button
// 🖱️ ホバー時:1.05倍に少し拡大(呼吸するような感覚)
whileHover={{ scale: 1.05 }}
// 👆 タップ押下時:0.95倍に縮小(これが物理ボタン感!)
whileTap={{ scale: 0.95 }}
// アニメーションの物理プロパティ設定:スプリングを使用し、剛性と減衰を設定
transition={{ type: "spring", stiffness: 400, damping: 17 }}
className="bg-gradient-to-r from-blue-500 to-indigo-600 text-white font-bold py-6 px-12 rounded-full shadow-lg shadow-blue-500/30"
>
<div className="text-3xl mb-1">👆</div>
<div className="text-xl tracking-widest">出勤打刻</div>
</motion.button>
);
}
スマホでこのボタンをタップした時の弾むようなフィードバックは、厳しい上司もきっと気に入るはずです!
🪄 Vibe Coding実践:AIにクールな登場アニメーションを書かせよう
ボタンのフィードバック感だけでなく、現代的なUIデザインでは「登場アニメーション」も極めて重要です。 従業員が打刻に成功した時、成功メッセージが「突然現れる」のではなく、カードのように優雅にスライドインしてくる方が好ましいです。
これらのパラメータを暗記する必要はありません。AIに任せましょう!
🔥【Vibe Prompt実践呪文】
ReactとFramer Motionを使用しています。打刻成功時に、成功通知カード(SuccessCard)を表示したいです。このコンポーネントを書いてください。要件は以下の通りです:1. <motion.div>でカード全体をラップする2. initial(初期状態):画面下50pxの位置(y:50)、透明度0(opacity:0)3. animate(アニメーション状態):元の位置(y:0)に移動、透明度14. exit(退場状態、カードが閉じられる時):下に落ちながら消える5. transition(アニメーショントランジション):spring効果を使用、stiffnessを300、dampingを20に設定(少し弾む感じに)6. 内部UIはTailwindで、緑色のテーマでチェックマークアイコン付きの美しい成功通知ボックスにする
AIはこの高級感あふれるアニメーションカードを生成します:
import { motion, AnimatePresence } from "framer-motion";
export default function SuccessCard({ isVisible }: { isVisible: boolean }) {
return (
// AnimatePresenceは要素が「消える」時にもアニメーションを再生する神器
<AnimatePresence>
{isVisible && (
<motion.div
initial={{ y: 50, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
exit={{ y: 20, opacity: 0 }}
transition={{ type: "spring", stiffness: 300, damping: 20 }}
className="bg-green-50 border border-green-200 p-6 rounded-2xl shadow-lg flex items-center space-x-4 max-w-sm mx-auto"
>
<div className="bg-green-100 p-3 rounded-full">
<span className="text-2xl">✅</span>
</div>
<div>
<h3 className="font-bold text-green-800 text-lg">打刻成功!</h3>
<p className="text-green-600 text-sm">お疲れ様でした、素敵な1日を。</p>
</div>
</motion.div>
)}
</AnimatePresence>
);
}
このコードを追加すれば、打刻APIが成功を返した時、この弾力性のあるカードが下からポンと跳ねるように現れます。この「儀式的」な体験こそ、クライアントに「なぜこのシステムがこの価値があるのか」を納得させる最強の武器です。
🎉 line-punch-web フロントエンド実践コース修了!
おめでとう!ここまでで、「商業的価値のあるLIFFフロントエンドアプリ」開発の全てのエッセンスをマスターしました。 LIFFの認証メカニズム、グラスモーフィズムの美的デザイン、Zustandの状態管理、そしてFramer Motionによる極めてスムーズな物理マイクロアニメーションまで。今やあなたは、クライアントが虜になる、ネイティブアプリよりも滑らかなモバイルインターフェースを作成できるようになりました!
しかし、見た目が美しいだけでは不十分です。打刻時間は改ざん可能ですか?従業員が自宅のベッドで打刻したらどうしますか? 今後の上級コースでは、ジオロケーション(Geolocation)とWi-Fi制限を活用した、完璧な不正防止打刻ロジックの構築方法も探っていきます!
ひと息ついて、最後のCrewAIエージェントチャレンジに備えましょう!