見せる・隠す(Show / Hide)
フェード・スライド・トグルアニメーションをFramer Motion / React Spring / GSAP / CSS Transitionで実装・比較
読み込み中...
'use client';
import { useState } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
export default function ShowHideFramerDemo() {
const [visible, setVisible] = useState(true);
return (
<>
<button onClick={() => setVisible(v => !v)}>トグル</button>
{/* フェード */}
<AnimatePresence>
{visible && (
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ duration: 0.4 }}
>
フェードするコンテンツ
</motion.div>
)}
</AnimatePresence>
{/* スライドダウン */}
<AnimatePresence>
{visible && (
<motion.div
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }}
transition={{ duration: 0.4, ease: 'easeInOut' }}
style={{ overflow: 'hidden' }}
>
スライドするコンテンツ
</motion.div>
)}
</AnimatePresence>
{/* mode="wait" で切り替えアニメーション */}
<AnimatePresence mode="wait">
{visible ? (
<motion.div
key="shown"
initial={{ opacity: 0, scale: 0.8 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.8 }}
transition={{ duration: 0.3 }}
>
表示中
</motion.div>
) : (
<motion.div
key="hidden"
initial={{ opacity: 0, scale: 0.8 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.8 }}
transition={{ duration: 0.3 }}
>
非表示
</motion.div>
)}
</AnimatePresence>
</>
);
}jQueryで書くとこうなる
.fadeIn() や .slideDown() などのメソッドで手軽にアニメーションを実装できました。Reactでは Framer Motion の AnimatePresence・React Spring の useTransition・GSAPの autoAlpha や timeline() を使うことで、同等以上の表現が可能です。// show / hide
$('#box').hide();
$('#box').show();
// toggle
$('#box').toggle();
// fadeIn / fadeOut
$('#box').fadeIn(400);
$('#box').fadeOut(400);
// fadeToggle
$('#box').fadeToggle(400);
// slideDown / slideUp
$('#box').slideDown(400);
$('#box').slideUp(400);
// slideToggle
$('#box').slideToggle(400);実装方法の比較
| 項目 | Framer Motion | React Spring | GSAP | CSS Transition |
|---|---|---|---|---|
| DOMから削除 | AnimatePresenceでアンマウント時もアニメーション可能 | useTransitionでマウント・アンマウント時のアニメーションを制御 | autoAlphaでopacity+visibilityを同時制御(DOMに残る) | DOMに残りopacityで隠す(アクセシビリティ注意) |
| 高さアニメーション | height: 'auto' をアニメーション可能 | useSpringで数値指定(autoは不可。max-heightで代替) | height: 'auto' をアニメーション可能(Framerと同等) | max-heightで代替(厳密な高さ指定が必要) |
| 切り替えアニメーション | mode='wait'で前のアニメーション完了後に次を開始 | exitBeforeEnterで退場完了後に入場アニメーションを開始 | timeline()でtween をシーケンシャルに並べて実装 | 同時遷移のみ(前後のアニメーション制御が困難) |
| 設定コスト | 高:framer-motionのインストールが必要 | 高:@react-spring/webのインストールが必要 | 中:gsap + @gsap/reactのインストールが必要 | 低:追加ライブラリ不要 |
| パフォーマンス | GPUアクセラレーション・60fps最適化済み | 物理ベース計算・GPUアクセラレーション対応 | 高度に最適化・60fps保証・業界標準のパフォーマンス | transform/opacityはGPUアクセラレーション対象 |
AnimatePresence のポイント
- •
AnimatePresenceで囲むことで、コンポーネントのアンマウント時にもexitアニメーションが実行される - •
mode="wait"を指定すると、前のコンポーネントのexitアニメーション完了後に次のenterが始まる - •
height: 0 → 'auto'のアニメーションはFramer Motionでのみ可能(CSSではmax-heightで代替) - • CSS Transitionでは要素がDOMに残るため、スクリーンリーダーに読み上げられる可能性がある
🤖 AIプロンプトテンプレート
Next.js + Framer Motion で「見せる・隠す」アニメーションを実装してください。 - ボタンクリックで要素をフェードイン・フェードアウト - ボタンクリックで要素をスライドダウン・スライドアップ - AnimatePresence を使ってアンマウント時もアニメーションさせる - TypeScript / Tailwind CSS v4 を使用
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。
React Spring のポイント
- •
useTransitionでマウント・アンマウント時のアニメーションを制御できる(Framer の AnimatePresence に相当) - •
exitBeforeEnter: trueで退場アニメーション完了後に入場が始まる(Framer のmode="wait"に相当) - •
useSpringの反応型(オブジェクト渡し)を使えば、stateの変化に応じてスムーズにアニメーションする - •
height: 'auto'のアニメーションは非対応。固定値かuseResizeObserverを使う必要がある
🤖 AIプロンプトテンプレート
Next.js + React Spring で「見せる・隠す」アニメーションを実装してください。 - useTransition を使ってフェードイン・フェードアウト(DOMから削除) - useSpring を使ってスライドダウン・スライドアップ(高さアニメーション) - exitBeforeEnter で退場完了後に入場アニメーションを開始 - 使用ライブラリ: @react-spring/web - TypeScript / Tailwind CSS v4 を使用
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。
GSAP のポイント
- •
useGSAP({ scope: container })でスコープを限定し、コンポーネントのアンマウント時に自動でクリーンアップされる - •
contextSafeで包んだ関数内でのみ、クリーンアップ対象のアニメーションを安全に作成できる - •
autoAlphaはopacityとvisibilityをまとめて制御する GSAP 専用プロパティ(opacity=0 のとき visibility=hidden になりスクリーンリーダー対応) - •
gsap.timeline()で複数のtweenをシーケンシャルに並べることで、退場→入場のような順序制御が直感的に書ける - • GSAP は
height: 'auto'のアニメーションをネイティブにサポート(React Spring では非対応)
🤖 AIプロンプトテンプレート
Next.js + GSAP で「見せる・隠す」アニメーションを実装してください。 - useGSAP フックと contextSafe を使ってボタンクリックでアニメーションをトリガー - autoAlpha でフェードイン・フェードアウト(opacity + visibility の同時制御) - height: 'auto' をアニメーションしてスライドダウン・スライドアップ - gsap.timeline() でシーケンシャルなトグル切り替えを実装 - 使用ライブラリ: gsap, @gsap/react - TypeScript / Tailwind CSS v4 を使用
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。
見せる・隠すアニメーション(Show / Hide)は、UI要素を表示・非表示するときに付与するトランジション効果。クリックなどのトリガーに連動する。
モーダルの開閉・ドロップダウンの展開・アコーディオンのパネル開閉・トースト通知の出現・消去など、UI状態の変化を滑らかに伝えたい場面で使われる。
- •フェードイン/アウト型
- •スライドイン/アウト型(上下・左右)
- •スケールアップ/ダウン型
- •ブラー型
- •組み合わせ型(フェード+スライド)
同じカテゴリの他のページ
文字を演出する(Text Animation)| UI Memo
GSAPのSplitText・ScrambleTextで実装する文字アニメーションのサンプル。1文字ずつフェード・スライド・波・スクランブル・バラけて再集合など、テキスト演出のUIパターン実例集。
動きの質感を選ぶ(Easing)
イージングの違いを体験で比較。power・back・bounce・elasticなどGSAP・Framer Motion・CSS Transitionのeaseを一覧・比較できるUIパターン実例集。
スクロールで物語る(Scroll Storytelling)
GSAPのScrollTriggerで実装するスクロール演出のサンプル。scrub・pin・横スクロール・パララックスなど、スクロールに連動した高度なアニメーションのUIパターン実例集。デモ・コード付き。