jQuery の「fadeIn メソッド」等のアニメーションのメソッドを使って複数の画像を順番に表示する方法。
この例では、1つの画像から複数の画像要素を生成して、それらを順番にCSS プロパティで位置を指定し、「fadeIn メソッド」を使って表示する。
fadeIn(speed,callback) 等のアニメーションのメソッドの callback パラメータはアニメーション完了時に呼び出される関数を指定できるので、このパラメータを利用。
serial_fadeIn() という関数を作成して、その中で「fadeIn メソッド」を使って serial_fadeIn() を再帰的(?)に呼び出し、ある数(maxCount)に達したら「return」で抜け出るというもの。
imgx$ は画像要素のラップ集合で、この関数を実行する前に生成しておく。
以下は作成するserial_fadeIn() という関数の概要で、このままでは位置の指定が「count * 10 」なので斜め一列に表示される。
- count = 0;
- function serial_fadeIn(maxCount) {
- if(count==maxCount) return;
- $(imgx$[count]).css({top: count * 10 + 'px', left: count * 10 + 'px'}).fadeIn( 100, function(){
- count ++;
- serial_fadeIn(maxCount);
- });
- }
画像を作成して images フォルダに配置する。
この例では画像名は「leaf.png」で高さは「20」、幅は「22」
表示する領域は div 要素として id 属性を「div#leafimage」と指定。
パラメータに生成する画像の数、画像名、高さ、幅、表示する div 要素をパラメータに取り、その画像のラップ集合を返す関数を以下のように作成。
各画像要素は「display: ‘none’, position: ‘absolute’」を指定。
親要素の表示領域は「’position’, ‘relative’」を指定。
- function create_images(count, name, h, w, target) {
- for(i = 0; i < count ; i++){
- $('<img />', { 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) {
- var generated = new Array();
- var generatedCount = generated.length;
- for(i = 0 ; i < count; i++){
- var 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;
- }
- [/code]
- <h3>作成した関数を利用して画像を表示</h3>
- 再帰を抜け出すための変数「count 」を外側で初期化。
- 画像30個のラップ集合を生成。
- 0 から 30 までの乱数の配列を生成。
- serial_fadeIn()で30個の画像をランダムに表示。
- serial_fadeIn()のパラメータには画像のラップ集合と乱数の配列を取るように修正。
- 全て表示したら、「imgx$.fadeOut(1000);」で画像を非表示に。他のアニメーションを連続して実行するには、fadeOut()の callback パラメータに更にアニメーションなどの関数を指定する。
- count = 0;
- imgx$ = create_images(30, 'leaf.png',20, 22,'div#leafimage' );
- randomx = generate_randomx(30);
- serial_fadeIn(imgx$, randomx);
- function serial_fadeIn(img$, rand) {
- //count が 画像要素の総数に達したら、画像をフェードアウトして終了
- if(count==img$.length) {img$.fadeOut(1000); return;}
- //垂直位置は「count * 10」に、水平位置をランダムに「randomx[count] * 20」に指定
- $(img$[count]).css({top: count * 10 + 'px', left: rand[count] * 20 + 'px'}).fadeIn( 100, function(){
- count ++; //1ずつ増やす
- serial_fadeIn(img$, rand); //再帰的(?)に呼び出す
- });
- }
以下は上記をまとめたもの。
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]