✨ 第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)に移動、透明度1 4. 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エージェントチャレンジに備えましょう!

完全なチュートリアルをロック解除

このチャプターは有料コンテンツです。プロジェクトに参加して、10以上の神レベルのPromptや実際のソースコード例を含む、5000字以上の深い分析をロック解除してください!