jQueryの fadeIn()・fadeOut()・fadeToggle() を使うと、要素を滑らかに表示・非表示にできます。この記事では基本的な使い方・速度・コールバック・複数要素・CSSトランジションとの比較・パフォーマンスまで解説します。
この記事でわかること
- fadeIn() / fadeOut() / fadeToggle() の基本的な使い方
- 速度(duration)・イージングのカスタマイズ
- フェード後にコールバックで処理を実行する
- 複数要素を順番にフェードさせる
- CSSトランジション・Web Animations APIとの比較
フェードメソッドの比較
| メソッド | 動作 | 表示状態の変化 |
|---|---|---|
fadeIn() |
非表示→表示(opacity 0→1) | display:none → display:block |
fadeOut() |
表示→非表示(opacity 1→0) | display:block → display:none |
fadeToggle() |
表示・非表示を切り替え | 現在の状態を反転 |
fadeTo() |
指定したopacity値まで変化 | display:none にはならない |
基本的な使い方
$(function () {
// フェードイン(非表示→表示)
$('#box').fadeIn(); // デフォルト400ms
$('#box').fadeIn(600); // 600msでフェードイン
$('#box').fadeIn('slow'); // 'slow'=600ms / 'fast'=200ms
// フェードアウト(表示→非表示)
$('#box').fadeOut(); // 400ms
$('#box').fadeOut(800); // 800msでフェードアウト
// フェードトグル(表示↔非表示を切り替え)
$('#toggle-btn').on('click', function () {
$('#box').fadeToggle(400);
});
// fadeTo(): 指定したopacityまで変化(display:noneにならない)
$('#box').fadeTo(400, 0.3); // 30%の透明度まで
$('#box').fadeTo(400, 1); // 不透明に戻す
});
fadeOut()の要素はdisplay:noneになる
fadeOut() が完了すると要素に display: none が付きます。レイアウトに影響する場合は fadeTo() で透明にするか、CSSの visibility: hidden や opacity: 0 を使ってください。コールバック:フェード後に処理を実行する
$(function () {
// フェードアウト後にDOMから削除
$('#notification').fadeOut(400, function () {
$(this).remove();
});
// フェードアウト後に別の要素をフェードイン
$('#old-content').fadeOut(300, function () {
$('#new-content').fadeIn(300);
});
// フェードイン後にクラスを追加
$('#box').fadeIn(500, function () {
$(this).addClass('is-visible');
});
});
コールバック内の this は対象要素
コールバック関数内の
コールバック関数内の
this はアニメーション対象のDOM要素です。$(this) でjQueryオブジェクトとして扱えます。複数要素にfadeOut()した場合、コールバックは要素ごとに実行されます。複数要素を順番にフェードさせる
$(function () {
// 複数要素を遅延付きで順番にフェードイン
$('.fade-item').each(function (i) {
$(this).delay(i * 150).fadeIn(400);
});
// Promise で順番に処理(チェーン)
var $items = $('.fade-item');
var promise = $.when();
$items.each(function () {
var $el = $(this);
promise = promise.then(function () {
return $el.fadeIn(300).promise();
});
});
promise.then(function () {
console.log('全要素のフェードイン完了');
});
});
.delay()でアニメーションを遅延開始できる
.delay(ms) はjQueryのアニメーションキューに遅延を挟みます。setTimeout と違い、アニメーションキューの一部として扱われるため、.stop() で中断できます。ただし非アニメーション処理には効かないため注意してください。CSSトランジションとの比較
| 方法 | メリット | デメリット | 推奨場面 |
|---|---|---|---|
| jQuery fadeIn/Out | 手軽・コールバック簡単 | GPU非活用・jQuery依存 | 簡単な表示切り替え |
| CSSトランジション | GPU活用・滑らか・jQuery不要 | display:noneと相性が悪い | パフォーマンス重視 |
| Web Animations API | 標準API・Promise対応 | jQuery不要・記述量が多い | モダン開発・細かい制御 |
/* CSSトランジションでフェード(display:noneの代替) */
.box {
opacity: 1;
transition: opacity 0.4s ease;
pointer-events: auto;
}
.box.is-hidden {
opacity: 0;
pointer-events: none; /* クリックも無効化 */
}
// CSSトランジションをjQueryで制御
$('#toggle-btn').on('click', function () {
$('#box').toggleClass('is-hidden');
});
CSSトランジションはdisplay:noneに直接使えない
display: none と opacity のトランジションは同時に使えません。visibility: hidden + opacity: 0 の組み合わせか、pointer-events: none で代替する方法があります。完全に要素を除去したい場合は、transitionend後にdisplay:noneを設定してください。実用パターン:通知バナー・モーダル・スケルトン
$(function () {
// 通知バナー: 3秒後に自動フェードアウト
function showNotice(message, type) {
var $notice = $('<div class="notice notice-' + type + '">')
.text(message) // XSS対策: text()でエスケープ
.appendTo('#notice-area');
$notice.hide().fadeIn(300).delay(3000).fadeOut(400, function () {
$(this).remove();
});
}
showNotice('保存しました', 'success');
// モーダル: フェードイン表示・フェードアウト非表示
$('#open-modal').on('click', function () {
$('#modal-overlay').fadeIn(200);
$('#modal').fadeIn(300);
});
$('#close-modal, #modal-overlay').on('click', function () {
$('#modal').fadeOut(200);
$('#modal-overlay').fadeOut(300);
});
// スケルトンからコンテンツへの切り替え
function loadContent() {
$('#skeleton').fadeOut(200, function () {
$('#content').fadeIn(300);
});
}
});
まとめ
jQueryのフェードメソッドのポイントをまとめます。
fadeIn(duration): display:none から表示(opacity 0→1)fadeOut(duration, callback): 非表示にして display:nonefadeToggle(): 現在の状態を反転fadeTo(duration, opacity): 指定した透明度まで変化(display:noneにならない)- パフォーマンス重視ならCSSトランジション + クラス切り替えが推奨
関連記事: animate()・fadeIn/Out・slideToggle完全ガイド / CSSアニメーション終了時に処理を行う完全ガイド
よくある質問(FAQ)
QfadeIn()したのに要素が表示されません。
A主な原因は3つです。①要素が
display: none になっていない(fadeIn()はdisplay:noneの要素を表示するメソッド)。②CSSで visibility: hidden や opacity: 0 が設定されており、display:noneではない。③親要素が非表示になっている。ブラウザの開発者ツールで対象要素のdisplayプロパティを確認してください。QfadeOut()後に要素を再度fadeIn()できません。
A
fadeOut() 完了後は display: none になっているため、再度 fadeIn() すれば表示できます。ただし、fadeOut()のコールバック内で $(this).remove() をしてしまった場合はDOMから削除されているため再表示できません。再表示が必要な要素には remove() を使わないでください。Qフェードが途中でカクつきます。
AjQueryのfadeは
opacity をJavaScriptで変化させるためGPUを活用しません。カクつく場合はCSSトランジション(transition: opacity 0.4s)に切り替えてください。また、対象要素に will-change: opacity を設定するとブラウザが最適化します。多数の要素を同時にアニメーションさせる場合は特にCSSトランジションが有効です。QfadeToggle()のアニメーション中にボタンを連打すると壊れます。
Aアニメーション中に再クリックされるとキューに積まれて不規則な動作になります。
.stop(true, true) で現在のアニメーションを即完了させてから新しいアニメーションを開始してください:$("#box").stop(true, true).fadeToggle(400)または :animated セレクターで実行中かチェックして弾く方法もあります。Qスクロールで画面内に入ったときにフェードインさせたいです。
AIntersection Observer APIを使うのが最もシンプルです。
new IntersectionObserver で要素が画面内に入ったときに fadeIn() を呼ぶか、CSSで .is-visible { opacity: 1; transition: opacity 0.5s } のクラスを付与してください。jQueryのスクロールイベント($(window).on("scroll"))でも実現できますが、Intersection Observerの方がパフォーマンスが良く推奨されます。

