jquery jQuery を使って複数の画像を順番に表示する

2013年4月26日

jQuery の「fadeIn メソッド」等のアニメーションのメソッドを使って複数の画像を順番に表示する方法。

この例では、1つの画像から複数の画像要素を生成して、それらを順番にCSS プロパティで位置を指定し、「fadeIn メソッド」を使って表示する。

fadeIn(speed,callback) 等のアニメーションのメソッドの callback パラメータはアニメーション完了時に呼び出される関数を指定できるので、このパラメータを利用。

serial_fadeIn() という関数を作成して、その中で「fadeIn メソッド」を使って serial_fadeIn() を再帰的(?)に呼び出し、ある数(maxCount)に達したら「return」で抜け出るというもの。

imgx$ は画像要素のラップ集合で、この関数を実行する前に生成しておく。

以下は作成するserial_fadeIn() という関数の概要で、このままでは位置の指定が「count * 10 」なので斜め一列に表示される。

  1. count = 0;
  2. function serial_fadeIn(maxCount) {
  3. if(count==maxCount) return;
  4. $(imgx$[count]).css({top: count * 10 + 'px', left: count * 10 + 'px'}).fadeIn( 100, function(){
  5. count ++;
  6. serial_fadeIn(maxCount);
  7. });
  8. }

画像と表示する領域を用意する

画像を作成して images フォルダに配置する。
この例では画像名は「leaf.png」で高さは「20」、幅は「22」

表示する領域は div 要素として id 属性を「div#leafimage」と指定。

画像を生成する関数の作成

パラメータに生成する画像の数、画像名、高さ、幅、表示する div 要素をパラメータに取り、その画像のラップ集合を返す関数を以下のように作成。

各画像要素は「display: ‘none’, position: ‘absolute’」を指定。
親要素の表示領域は「’position’, ‘relative’」を指定。

  1. function create_images(count, name, h, w, target) {
  2. for(i = 0; i < count ; i++){
  3. $('<img />', { src: 'images/' + name, alt: '',height: h,width: w}).css({display: 'none', position: 'absolute' }).appendTo(target);
  4. }
  5. $(target).css('position', 'relative');
  6. return $(target).find('img');
  7. }

画像をランダムに配置するために乱数を生成する関数を作成

以下の関数は重複のない乱数の配列を返す。(詳細はこちら

  1. function generate_randomx(count) {
  2. var generated = new Array();
  3. var generatedCount = generated.length;
  4. for(i = 0 ; i < count; i++){
  5. var candidate = Math.floor(Math.random() * count);
  6. //今まで出力された数字と同じ場合は再度乱数を発生
  7. for(j = 0; j < generatedCount; j++) {
  8. if(candidate == generated&#91;j&#93;){
  9. candidate = Math.floor(Math.random() * count);
  10. j= -1;
  11. }
  12. }
  13. generated&#91;i&#93; = candidate;
  14. generatedCount++;
  15. }
  16. return generated;
  17. }
  18. &#91;/code&#93;
  19. <h3>作成した関数を利用して画像を表示</h3>
  20. 再帰を抜け出すための変数「count 」を外側で初期化。
  21. 画像30個のラップ集合を生成。
  22. 0 から 30 までの乱数の配列を生成。
  23. serial_fadeIn()で30個の画像をランダムに表示。
  24. serial_fadeIn()のパラメータには画像のラップ集合と乱数の配列を取るように修正。
  25. 全て表示したら、「imgx$.fadeOut(1000);」で画像を非表示に。他のアニメーションを連続して実行するには、fadeOut()の callback パラメータに更にアニメーションなどの関数を指定する。
  26.  
  27. count = 0;
  28. imgx$ = create_images(30, 'leaf.png',20, 22,'div#leafimage' );
  29. randomx = generate_randomx(30);
  30. serial_fadeIn(imgx$, randomx);
  31.  
  32. function serial_fadeIn(img$, rand) {
  33. //count が 画像要素の総数に達したら、画像をフェードアウトして終了
  34. if(count==img$.length) {img$.fadeOut(1000); return;}
  35. //垂直位置は「count * 10」に、水平位置をランダムに「randomx[count] * 20」に指定
  36. $(img$[count]).css({top: count * 10 + 'px', left: rand[count] * 20 + 'px'}).fadeIn( 100, function(){
  37. count ++; //1ずつ増やす
  38. serial_fadeIn(img$, rand); //再帰的(?)に呼び出す
  39. });
  40. }

以下は上記をまとめたもの。

  1.  

jQuery(function($){
function create_images(count, name, h, w, target) {
for(i = 0; i < count ; i++){ $('', { src: 'images/' + name, alt: '',height: h,width: w}).css({display: 'none', position: 'absolute' }).appendTo(target);
}
$(target).css('position', 'relative');
return $(target).find('img');
}

function generate_randomx(count) {
generated = new Array();
generatedCount = generated.length;
for(i = 0 ; i < count; i++){ candidate = Math.floor(Math.random() * count); //今まで出力された数字と同じ場合は再度乱数を発生 for(j = 0; j < generatedCount; j++) { if(candidate == generated[j]){ candidate = Math.floor(Math.random() * count); j= -1; } } generated[i] = candidate; generatedCount++; } return generated; } count = 0; function serial_fadeIn(img$, rand) { if(count==img$.length) {img$.fadeOut(1000); return;} $(img$[count]).css({top: count * 10 + 'px', left: (rand[count] * 20 + 50 ) + 'px'}).fadeIn( 100, function(){ count ++; serial_fadeIn(img$, rand); }); } randomx = generate_randomx(30); img$ = create_images(30, 'leaf.png', 23, 18, '#leafimage' ); serial_fadeIn(img$, randomx); }); [/code]