- jQueryアニメーションは「同時」に動いていない
- キューとは何か
- どのように動いているか
- コードで見るキュー
- なぜキューが必要だったのか
- よくある問題「連打」
- `stop()`の役割
- キューはアニメーション以外にも使われる
- `delay()`の正体
- `queue:false`とは
- 注意点
- 最後に
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操作だけでなく「処理の順番を制御する仕組み」を理解することでもあります。