目を引く(Attention)

バウンス・シェイク・パルス・点滅アニメーションをFramer Motion / React Spring / GSAP / CSS Animationで実装・比較

Framer Motion

読み込み中...

tsx
'use client';
import { useAnimation, motion } from 'framer-motion';

export default function AttentionDemo() {
  const controls = useAnimation();

  const triggerBounce = async () => {
    await controls.start({
      y: [0, -24, 0, -12, 0, -6, 0],
      transition: { duration: 0.7, ease: 'easeOut' },
    });
  };

  const triggerShake = async () => {
    await controls.start({
      x: [0, -12, 12, -12, 12, -6, 6, 0],
      transition: { duration: 0.5, ease: 'easeInOut' },
    });
  };

  const triggerPulse = async () => {
    await controls.start({
      scale: [1, 1.25, 1, 1.25, 1, 1.1, 1],
      transition: { duration: 0.7, ease: 'easeInOut' },
    });
  };

  const triggerFlash = async () => {
    await controls.start({
      opacity: [1, 0, 1, 0, 1, 0, 1],
      transition: { duration: 0.6 },
    });
  };

  return (
    <div>
      <motion.div animate={controls}>
        アニメーション対象
      </motion.div>

      <button onClick={triggerBounce}>バウンス</button>
      <button onClick={triggerShake}>シェイク</button>
      <button onClick={triggerPulse}>パルス</button>
      <button onClick={triggerFlash}>点滅</button>
    </div>
  );
}

jQueryで書くとこうなる

jQueryではjQuery UIの .effect() メソッドや、.addClass() でCSSアニメーションをトリガーする方法が使われていました。Reactでは Framer Motion の useAnimation・React Spring の命令型 API・GSAP の contextSafe + timeline() を使うことで、より宣言的に同等の表現が可能です。
js
// jQueryプラグイン(jQuery UI)を使ったバウンス
$('#box').effect('bounce', { times: 3 }, 400);

// シェイク
$('#box').effect('shake', { times: 3, distance: 10 }, 400);

// パルス(強調)
$('#box').effect('pulsate', { times: 3 }, 400);

// 点滅
$('#box').fadeOut(150).fadeIn(150).fadeOut(150).fadeIn(150);

// addClass でCSSアニメーションをトリガーする方法(プラグイン不要)
$('#box').addClass('animate-bounce');
setTimeout(() => $('#box').removeClass('animate-bounce'), 1000);
💡 上記のデモは、React / Next.jsです。Next.jsの基本セットアップは 公式ドキュメントを参照してください。

実装方法の比較

項目Framer MotionReact SpringGSAPCSS Animation
トリガー制御useAnimationで任意のタイミングで発火可能useSpringのAPIで命令的にアニメーションを発火contextSafeで包んだ関数で任意のタイミングで発火クラス着脱で制御(やや煩雑)
アニメーション定義JSオブジェクトで直感的に記述toに配列を渡してキーフレーム的に記述keyframesオブジェクト配列またはtimeline().to()で定義@keyframesで定義が必要
連続・チェーンawaitで順番に実行可能to配列またはasync nextで連続アニメーションtimeline()で複数tweenをシーケンシャルに実行animation-delayで代替
設定コスト高:framer-motionのインストールが必要高:@react-spring/webのインストールが必要中:gsap + @gsap/reactのインストールが必要低:追加ライブラリ不要
再利用性フック・バリアントで再利用しやすいカスタムフックでspringロジックを再利用可能contextSafeをカスタムフックで再利用可能CSSクラスとして再利用可能

useAnimation のポイント

  • useAnimation() で取得したコントロールを motion 要素の animate プロップに渡すと、controls.start() で命令的にアニメーションを発火できる
  • controls.start() は Promise を返すため、await で完了を待ってから次の処理に進める
  • • キーフレームは配列で指定する(例:y: [0, -24, 0]
  • • CSS Animationでは同じアニメーションを再トリガーするためにクラスを一度外してから付け直す必要があり、requestAnimationFrame で1フレーム待つ処理が必要

🤖 AIプロンプトテンプレート

Next.js + Framer Motion で「目を引く」アニメーションを実装してください。
- ボタンクリックでバウンス・シェイク・パルス・点滅アニメーションをトリガー
- useAnimation フックを使って命令的にアニメーションを制御
- 各アニメーションはボタンクリック後に1回だけ実行される
- TypeScript / Tailwind CSS v4 を使用

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

React Spring のポイント

  • useSpring(() => { y: 0 }) の関数形式で呼ぶと [springs, api] のタプルが返り、api.start() で命令的に発火できる
  • to に配列を渡すとキーフレーム的に複数ステップのアニメーションを定義できる
  • • 各ステップに個別の config(tension・friction)を指定することで、段階的に減衰する自然な動きを表現できる
  • durationconfig に指定すると、物理ベースではなく時間ベースのアニメーションになる

🤖 AIプロンプトテンプレート

Next.js + React Spring で「目を引く」アニメーションを実装してください。
- useSpring を使ってバウンス・シェイク・パルス・点滅アニメーションをトリガー
- useSpring() の命令型API([springs, api] = useSpring(() => ...))でアニメーションを制御
- to配列でキーフレーム的にアニメーションを定義する
- 物理ベースのspring configでリアルな動きを表現する
- 使用ライブラリ: @react-spring/web
- TypeScript / Tailwind CSS v4 を使用

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

GSAP のポイント

  • gsap.to(el, { keyframes: [...] }) で配列形式のキーフレームを指定すると、各ステップが順番に実行される
  • bounce.outelastic.out(1, 0.4) などのイージング文字列で、物理的なバウンス・弾む動きを手軽に表現できる
  • gsap.timeline().to().to() のメソッドチェーンで複数tweenを順番に実行する(Framer の await controls.start() に相当)
  • contextSafe で包まない関数でアニメーションを作成すると、コンポーネントのアンマウント時にクリーンアップされないので注意

🤖 AIプロンプトテンプレート

Next.js + GSAP で「目を引く」アニメーションを実装してください。
- useGSAP フックと contextSafe を使ってボタンクリックでアニメーションをトリガー
- gsap.timeline() でバウンス(bounce.out)・パルス(elastic.out)を実装
- gsap.to() の keyframes 配列でシェイク・フラッシュを実装
- 各アニメーションはボタンクリック後に1回だけ実行される
- 使用ライブラリ: gsap, @gsap/react
- TypeScript / Tailwind CSS v4 を使用

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

アテンションアニメーション(Attention Seekers)は、要素を一時的に揺らす・点滅させる・バウンスさせるなどして、ユーザーの注意を引くためのアニメーション効果。

エラーメッセージの強調・新着通知バッジの点滅・CTA(Call to Action)ボタンのハイライト・フォームの入力漏れ指摘など、重要な情報に気づいてほしい場面で使われる。

主なバリエーション
  • シェイク型(左右に揺れる)
  • バウンス型(上下に弾む)
  • パルス型(拡縮を繰り返す)
  • フラッシュ型(点滅)
  • ジェロ型(ゼリーのように揺れる)