Jquery slideDownが完了してから動作させたい
最近はJqueryを装飾に使用することが何かと多いです。
ブラウザ側だけで動作するので、手軽なことも理由のひとつです。
ところが、最近このようなことがありました。
「動作タイミングがおかしい」
どういうことかというと、Jqueryのスライドダウン時に別の動作を組み合わせていた時の話です。
①スライドダウン処理 ②別の処理の順番で処理されることを期待していました。
でも実際には同時に処理されました。
今回、これを何とかすることにしました。
現象は次の通りです
Jqueryスライドダウン後に処理されることを期待しているのですが、実際には同時に処理されています。
サンプルは、スライドダウン時に背景色を変更しています。
スライドダウン完了後に背景色を変えたいのですが、実際には同タイミングで処理されています。
[sample]現象の発生するサンプルはこちら
現象が発生するソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<!doctype html> <html> <head> <meta charset="shift_jis"> <title>スライドダウン</title> <style type="text/css"> body { margin: 0px; padding: 0px; text-align: center; } .down_area { background-color: #FF9; text-align: center; width: 100%; padding-top: 30px; padding-bottom: 30px; display: none; } </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> $(document).ready(function() { $("input").click(function() { if ($(".down_area").css("display") == "none") { $(".down_area").slideDown("slow"); $("body").css("background-color", "#FC0"); $("input").val("スライドUPします"); } else { $(".down_area").slideUp("slow"); $("body").css("background-color", "transparent"); $("input").val("スライドDOWNします"); } }); }); </script> </head> <body> <div class="down_area"> <p>スライドダウン</p> </div> <p>問題点:スライドが終わる前に背景色が変わってしまいます</p> <input name="" type="button" value="スライドDOWNします"> </body> </html> |
原因はJqueryの動作特性
Jqueryのは前の処理を待たずに次の処理ができます。
厳密にいうと、SlideDown処理はゆっくり動作するため、終了までタイムラグがあります。
ところが、次の処理はタイムラグを待たずに実行されます。
そのため、同時処理されているように見えるのです。
何とかするためには、タイムラグが終了してから次の処理を呼ばなければいけません。
いったいどうすれば実現できるのでしょうか?
Jqueryには処理終了後に次の処理を実行する機能があります
今回もググって調べてみると、Jqueryには処理終了後に次の処理を実行する機能がありました。
Call backと呼ばれる処理です。
[sample]論より証拠:実際にできたものがこちら
こちらのサンプルは、スライドダウン完了後に背景の色が変わります。
ちゃんとスライドダウンが終わるのを待ってから処理しています。
いったいどうやって実現しているのでしょうか?
Call backのやりかた
Call backのやり方はコロンブスの卵的な発想です。
順を追って説明いたします。
現象が発生する(同時処理される)記述は次の通りです。
1 2 |
$(".down_area").slideDown("slow"); $("body").css("background-color", "#FC0"); |
スライドダウン処理と、背景の色を変える処理をそのまま記述しています。
スライドダウンは、処理完了までタイムラグがあるため、終わる前に背景色変更が実行されます。
現象が発生しない(処理終了を待ってから次の処理)記述は次の通りです。
1 2 3 4 |
$(".down_area").slideDown("slow", function() { $("body").css("background-color", "#FC0"); }); |
スライドダウン処理記述の中に、次の処理を記述しています。
これがCall backです。
関数の中に記述しているから、処理終了まで待てるのです。
※ちなみにCall backが使える処理と使えない処理があります。
関数の引数に関数を呼ぶ
これは、PHPは原則処理が終わってから次の処理が動くためです。
Jqueryは同時に複数処理が実行できてしまう点と異なります。
そこで、関数の中で関数を呼ぶという処理があります。
なんともJqueryには便利な機能がありました。
余談ですが気になったのでこんな処理にしてみました
今回のサンプルは、スライドダウン後に背景の色を変えるというものでした。
ただ、見た目パッと色が変わるのが少々気になったので、次のような「背景色が徐々に変化するパターン」も作ってみました。
また参考になれば幸いです。
[sample]スライドダウン後背景がフェードインするパターン
JqueryはCSSなども組み合わせていろいろな表現ができます。
今回のレポートは以上です。
読んでいただいてありがとうございました。
関連記事
オフィスオバタへのご相談・お問合せはこちらまで
TEL0763-33-3290 TEL 0763-33-3290
電話受付時間 平日午前9:00~17:00まで ※ボタンをクリックすると電話がかかります。