どうも、レーウィンです。
今回は簡単なものになるけど、順番にアニメーションさせる方法を紹介。jQuery使用。
htmlはこんなん
<ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul>
cssはこんなん
ul li { opacity: 0; transition: opacity 1s; -webkit-transition: opacity 1s; -moz-transition: opacity 1s; } ul li.active { opacity: 1; }
これを1から順番に表示させるコードはどうすればいいか。setTimeoutで1個1個やるのはさすがに手間。
なので、eachとeqを使いましょう。
$(function() { $("ul li").each(function(i) { setTimeout(function() { $("ul li").eq(i).addClass("active"); }, 100 * i); }); });
eachというのは、要素の個数を数えて1回1回実行してくれる。
ul>liは合計5個なので、5回、中に書いてあるコード(つまりsetTimeout)を実行してくれる。
しかもeach(function(i) {…})の中にあるiは、実行するたびに1ずつ増えていく数字(スタートは0)
今回は5回実行するので、
1回目実行時はi=0で中を処理
2回目実行時はi=1で中を処理
ってしてくれる。
なので、中に書いてある100*iは・・・
1回目実行時は0、2回目は100、3回目は200という風になる。
$(“ul li”).eq(i).addClass(“active”);は
1回目実行時は$(“ul li”).eq(0).addClass(“active”)
2回目実行時は$(“ul li”).eq(1).addClass(“active”);
ってしてくれる。
eqっていうのは要素の番目(0スタート)。
なので$(“ul li”).eq(0)はliの1のことを指し、
なので$(“ul li”).eq(1)はliの2のことを指してくれる。
なので、上記で書いたコードは例でいうと、これと同じ処理をしてくれている。
$(function() { $setTimeout(function() { $("ul li").eq(0).addClass("active"); }, 100 * 0); $setTimeout(function() { $("ul li").eq(1).addClass("active"); }, 100 * 1); $setTimeout(function() { $("ul li").eq(2).addClass("active"); }, 100 * 2); $setTimeout(function() { $("ul li").eq(3).addClass("active"); }, 100 * 3); $setTimeout(function() { $("ul li").eq(4).addClass("active"); }, 100 * 4); });
しかも、eachでやっているので、途中でliの6とか追加しても大丈夫。
わーい便利。
補足で、応用
一番最後の要素がアニメーションした時に実行したいコードがある場合はlengthを使う
$(function() { var li_leng = $("ul li").length - 1; $("ul li").each(function(i) { setTimeout(function() { $("ul li").eq(i).addClass("active"); if (i == li_leng) { alert("アニメーション終了") } }, 100 * i); }); });
lengthは要素の数を数えてくれる。
ただし、lengthは1スタートなので、0スタートのiとは1ずれが発生してしまう。
なので、-1をlengthで出た数字にしてあげる。
で、iの数字とlength-1で出た数字が同じ時、終了した時のコードを書く。
オープニングアニメーションとかにどうぞ。
では。
すっごい分かりやすかったです!
あとswiper.jsのときもお世話になったので、感謝を込めてコメントを残しておきます。