【jQuery】要素をフェードイン・フェードアウトさせる完全ガイド|fadeIn・fadeOut・fadeToggle・CSSトランジション比較まで

【jQuery】要素をフェードイン・フェードアウトさせる方法 jQuery

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: hiddenopacity: 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: noneopacity のトランジションは同時に使えません。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:none
  • fadeToggle(): 現在の状態を反転
  • fadeTo(duration, opacity): 指定した透明度まで変化(display:noneにならない)
  • パフォーマンス重視ならCSSトランジション + クラス切り替えが推奨

関連記事: animate()・fadeIn/Out・slideToggle完全ガイド / CSSアニメーション終了時に処理を行う完全ガイド

よくある質問(FAQ)

QfadeIn()したのに要素が表示されません。
A主な原因は3つです。①要素が display: none になっていない(fadeIn()はdisplay:noneの要素を表示するメソッド)。②CSSで visibility: hiddenopacity: 0 が設定されており、display:noneではない。③親要素が非表示になっている。ブラウザの開発者ツールで対象要素のdisplayプロパティを確認してください。
QfadeOut()後に要素を再度fadeIn()できません。
AfadeOut() 完了後は 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の方がパフォーマンスが良く推奨されます。