jQueryのキュー(queue)の仕組み

jQueryアニメーションは「同時」に動いていない

jQueryを使っていると、次のようなコードを書いた経験があるはずです。

$("#box")
  .fadeOut(200)
  .fadeIn(200)
  .slideUp(200)
  .slideDown(200);

見た目には順番にアニメーションが実行されます。
ここで重要な点は、jQueryはこれらを同時に実行しているのではなく、
キュー(queue)に積んで順番待ちさせているということです。

この仕組みを理解していないと、

  • アニメーションが遅れて動く
  • クリック後しばらくしてから動く
  • 止めたはずの動きが後から始まる

といった不可解な挙動に出会います。

キューとは何か

キューは「先入れ先出し」の待ち行列です。
最初に入った処理から順番に実行されます。

jQueryでは、各要素ごとに「fxキュー」という専用のアニメーション待ち行列が存在します。
アニメーションメソッドを呼ぶたびに、このキューに関数が追加されます。

イメージ:

順番 キュー内容
1 fadeOut
2 fadeIn
3 slideUp
4 slideDown

現在の処理が終わるまで、次は実行されません。

どのように動いているか

`fadeOut()`を呼ぶと、すぐにアニメーションが始まるのではありません。
内部では次の流れです。

1 アニメーション関数を作成
2 要素のfxキューへ追加
3 キューが空なら実行開始
4 完了時に次のキューを実行

つまり、jQueryは「アニメーションスケジューラ」を持っています。

コードで見るキュー

jQueryにはキュー操作APIが存在します。

$("#box").queue(function(next){
  console.log("処理1");
  next();
});

`next()`を呼ぶと、次のキューが実行されます。
呼ばなければキューは止まります。

このため、`next()`を忘れると以降のアニメーションが動かなくなります。

なぜキューが必要だったのか

理由は古いブラウザです。
同時に複数のスタイルを変更すると、描画が壊れることがありました。

そのためjQueryは、

  • 同時変更を避ける
  • 安定した見た目を保証する

目的で直列実行を採用しました。
これは安全性のための設計です。

よくある問題「連打」

典型的なバグです。

$("#menuButton").click(function(){
  $("#menu").slideToggle(300);
});

ボタンを連打するとどうなるでしょうか。
クリックのたびにアニメーションがキューに追加されます。

結果:

  • 1回目:すぐ動く
  • 2回目:待機
  • 3回目:さらに待機

数秒後に勝手に動き続けます。
「バグのように見える」原因です。

`stop()`の役割

この問題を防ぐのが`stop()`です。

$("#menuButton").click(function(){
  $("#menu").stop(true,true).slideToggle(300);
});

意味:

  • 現在のアニメーション停止
  • キューのクリア

これで待機アニメーションが消えます。

キューはアニメーション以外にも使われる

jQueryのキューは汎用です。

$("#box")
  .queue(function(next){
    console.log("A");
    next();
  })
  .queue(function(next){
    console.log("B");
    next();
  });

A → B の順で実行されます。
Promiseのない時代の非同期制御としても使われていました。

`delay()`の正体

`delay()`もキューです。

$("#box").fadeOut().delay(500).fadeIn();

これは「500ms待つ処理」をキューに追加しています。
タイマーを止めているわけではありません。

`queue:false`とは

並列実行したい場合があります。

$("#box").animate({width:200},{queue:false});

これによりfxキューを使わず、即時実行されます。
ただし同時スタイル変更が増え、カクつきや競合が起きる可能性があります。

注意点

キューは要素単位です。
複数要素に対してはそれぞれ別のキューが動きます。

$(".item").fadeOut();

各要素が独立して順番に動くわけではなく、
各要素が同時に自分のキューを処理します。

これが負荷増大の原因になることもあります。

最後に

jQueryのキューは単なる内部仕様ではありません。
アニメーションの挙動を決定している中核機能です。

「なぜ後から動くのか」
「なぜ止まらないのか」
その答えはすべてキューにあります。

jQueryを理解するとは、
DOM操作だけでなく「処理の順番を制御する仕組み」を理解することでもあります。