JS / jQuery

【jQuery】ランダムで画像や要素をフェードインさせる

画像の一覧をランダムでフェードインさせるサンプルです。

なかなか使いどきは難しいかもしれませんが、視覚的な効果は発揮すると思います。
しかも割と基礎的な考え方で出来てしまいますので、早速書いてみます!

jQueryでランダムに画像(要素)をフェードインさせるサンプル

HTML

これは別にulとliの関係でなくても、divとpでも良いです。

が、セマンティックな(意味のある)コーディングを意識すると、だいたいのケースは必然的に上記のようにリストタグで囲むことになると思います。

CSS

関係してくるのは、liのスタイリングぐらいでしょうか。
floatでも良いし、場合によってはposition:absoluteでランダムに配置してもいいですよね。其の際は別途CSSでの指定が必要です。

では、jQueryを使って実装します。

jQuery

HTMLと照らしあわせて見てみてください。

まず最初にフェードインさせたい画像を取得し変数に入れます。ちなみにこれは配列になっています。
それに、jQueryを使ってCSSを指定します。displayとopacityの、ダブル非表示攻撃です。

少し下から関数を定義しにいきます。
今回はrandowShow()がそれなのですが、画面を読み込み終わった瞬間に実行されるように.on(‘load’ , function(){~})としています。

関数randomShowでは何をしているのか

今回重要なのは、「ランダム」だということです。

この部分ですが、変数numはフェードインさせたい画像の枚数です。1行うえで、配列fadeInImgに対して、lengthで取得しています。
これにMath.floorを使い、(フェードインさせたい画像)要素数を最大としてランダムな整数を作りrandomNumに代入していきます。
Math.floor() – JavaScript | MDN
Math.random() – JavaScript | MDN

次の$(fadeInImg[randomNum]).css({~….animate({})で、アニメーション後の状態を書きます。
今回の場合は非表示だった要素のdisplayをblockにします。opacityの値はアニメーション可能なので、animateに書きましょう。

ちなみにfadeInImg[randomNum]部分が、ランダムで画像を取り出しています。

次がキモです。

fadeInImg.splice(randomNum , 1);
簡単に言うと、配列fadeInImgの値を、spliceを使ってランダムで1つずつ減らしています。
Array.splice – JavaScript | MDN

さらにさらに。
その次が超キモです。

if(num > 0){~}
これはどういうことかというと、numというのはフェードインさせたい画像の枚数でした。
これが0より大きい場合に、中の処理が行われます。

中では、なんとこの関数自体が呼ばれています。
関数の中で、その関数が呼ばれている状態です。

これはsetTimeoutで時間差を付けて実行されます。
一定時間で繰り返す(setTimeout)-JavaScript入門

実は変数numの値(フェードインさせたい画像の枚数)ですが、これは変わります。
というのも、少し上でfadeInImg.splice(randomNum , 1);が実行されているため、
関数randomImage()が実行される度に、配列fadeInImg自体の要素数が減っていくのです。

ここは関数の中で関数を呼ぶことで、フェードインさせたい画像の枚数分だけ処理が適用されることとなります。

そのため、やがて値(配列の数)が0になるのですね。

条件に当てはまらない場合、つまりspliceで配列が空になってしまった場合はreturnします。

ランダムで画像(要素)がフェードインしてくるサンプル

個人的な都合で、画面更新をしたときに要素の順序がバラバラになったほうが良かったので、そちらも実装してみます。

数行のコードを足すだけです。

jQueryでランダムに画像(要素)をフェードインさせ、読み込むたびに順番もランダムにするサンプル

HTMLとCSSは同じものだとします。jQueryサンプルにコードを足しましょう。

jQuery

///↓追記ここから ~ ///↑追記ここまで
が、さきほどのサンプルとの違いです。

さらっとまとめると、フェードインさせたい要素を配列に逃がして、順番を変えて同じ場所に入れなおしているのです。

まずはじめの

は、メモしてあるとおり、要素を入れる場所と個々の要素を含むリストです。

そのすぐ下に新しく空の配列を作り、その中に、変数list(個々の要素を含むリスト)の中のHTMLをeachで1つずつ、配列にpushします。

ここ。
$(this)はeachで処理中の要素です。

その下のsort()で、配列に格納したあれこれの順番をランダムにします。
Array.sort – JavaScript | MDN

そのあとはemptyを使って、もともと要素があった場所を空にします。もう配列に入っているので用済みです。
.empty() | jQuery 1.9 日本語リファレンス | js STUDIO

さいごに、配列の要素の数だけfor()でループ処理。それを利用して、変数area(表示したい場所)に入れ込んで終了です。
すでにarray.sort()のところで配列はランダムになっているので、for()中では特別な処理はしていません。

ランダムで画像がフェードインしてくるサンプル(リロードする度に順番が変わる)

 

以上。

でわ!