渦巻き状に画像を移動させる JavaScript |
戻 る |
* ランダムに設定される収束点に向かい、渦巻きながら寄って行きます。 収束点に到達すると指定した時間だけ制止します。 その後、次に設定される収束点に向かい、渦巻き移動を繰り返します。 * 一時静止した時に、次のサイクルの中心、収束速さ、回転速さがランダムに変わります。 その時、画像の切り替えが出来ます。 また、全部描写と、一つの画像を残し画像の表示と非表示の交互描写の、選択が出来ます。 * 数値の設定だけで、画像の種類毎に、画像の指定や、動きの調整が出来ます。 * スクロールに対応しています。 * Internet Explorer 6 および Netscape 7 で動作確認しています。 (注意) 範囲指定は、渦巻きの収束点の範囲指定であって、画像の移動範囲ではありません。 (円弧系の動きのため、途中画面から飛び出す事があります) うまく移動させるのには、この範囲指定をうまく工夫してください。
「入力事項」の部分で、色に合わせて、次の設定をします。 太字は入力可能場所。 ■ 渦巻きの収束点の発生範囲で、画面の 左端 右端 上端 下端 からの距離(px) を指定。 ■ 画像が、渦巻きの収束点に向かい、近寄っていく最大の速さ。実際はランダムに減速する。 ■ 渦巻きが回転する、最大の回転速さを入力します。(大きいほど速く、荒く回転する) ■ 一時的に、画像が 静止する時間 を入力します。(秒) ■ 「0」から順に表示したい数の画像を、アドレスを含むファイル名で指定します。 画像を2つ以上指定すると、静止して動き始める度に画像がに変わり、 指定順に繰り返します。 ■ 画面に同時に出したい画像数を入力します。 ■ 途中で流れる画像を1個だけにするなら 1 を指定。 (この時、1つ表示される画像は ugoku[0] で指定した画像になります。) ずっと指定数の画像を表示するなら -1 を指定。 ■ 画面をスクロールさせた時、画像も同時にスクロールさせたいので 1 を指定。 ■ 動きの全体の速さを入力します。(大きいほど速いが、負担大) // ***************************** 入力事項 ****************************** // ======= 入力1:画像の種類と動く方向,動き方,および範囲 // 1〜4番目で、渦巻きの収束点の発生範囲を、画面端からの%値で入力 // (ここで入力するのは、移動範囲では無いので注意してください!!) // (範囲の高さと幅を共に工夫しないと、想定範囲を大きく飛び出す事もあります) // 1番目の数字で、渦巻きの収束点の発生範囲の左端の位置(画面幅に対する割合%) // 2番目の数字で、渦巻きの収束点の発生範囲の右端の位置(画面幅に対する割合%) // 3番目の数字で、渦巻きの収束点の発生範囲の上端の位置(画面幅に対する割合%) // 4番目の数字で、渦巻きの収束点の発生範囲の下端の位置(画面幅に対する割合%) // 5番目の数字で、画像が、渦巻きの収束点近づく最大の速さ。(目安値 10) // 6番目の数字で、渦巻きが回転する最大の速さ。(目安値 10) // 7番目の数字で、画像を一時制止させる時間(秒)(目安値 1.0) // 8番目以降で、出したい画像の種類を必要数だけ入力(0から順に) // 画像が2つ以上あるときは、一時停止する度に、画像が変わる。画像数はいくらでも可。 ugoku[0]=new Array( 10,30,30,10, 10,10, 1.0, "../parts/samp1.gif", "../parts/samp5.gif", "../parts/samp9.gif"); ugoku[1]=new Array( 30,10,10,30, 30,30, 2.5, "../parts/samp2.gif", "../parts/samp6.gif", "../parts/sampa.gif"); // ======= 入力2:補助入力事項 var no = 4 ; // 画面に同時に出す画像数を入力 var hsw = 1 ; // 途中で動く画像を1個だけするか?( yes=1 , no=-1 ) // 1個表示されるのは、ugoku[0]で指定した画像です。 var srl = 1 ; // 画像も同時にスクロールさせるか? ( yes=1 , no=-1 ) // 以上の調整で、速さが足りない(荒い)場合は、次の数値を大きくする var chg= 10 ; // 一秒当たりの描画の切替え回数(初期値 10) // *************************** 入力事項ここまで **************************
<script type="text/javascript"> <!--// mov_rd ver2.00 (ぱーぷりんの溜まり場) ugoku=new Array(); // この行は触らないで・・ // ***************************** 入力事項 ****************************** // ======= 入力1:画像の種類と動く方向,動き方,および範囲 // 1〜4番目で、渦巻きの収束点の発生範囲を、画面端からの%値で入力 // (ここで入力するのは、移動範囲では無いので注意してください!!) // (範囲の高さと幅を共に工夫しないと、想定範囲を大きく飛び出す事もあります) // 1番目の数字で、渦巻きの収束点の発生範囲の左端の位置(画面幅に対する割合%) // 2番目の数字で、渦巻きの収束点の発生範囲の右端の位置(画面幅に対する割合%) // 3番目の数字で、渦巻きの収束点の発生範囲の上端の位置(画面幅に対する割合%) // 4番目の数字で、渦巻きの収束点の発生範囲の下端の位置(画面幅に対する割合%) // 5番目の数字で、画像が、渦巻きの収束点近づく最大の速さ。(目安値 10) // 6番目の数字で、渦巻きが回転する最大の速さ。(目安値 10) // 7番目の数字で、画像を一時制止させる時間(秒)(目安値 1.0) // 8番目以降で、出したい画像の種類を必要数だけ入力(0から順に) // 画像が2つ以上あるときは、一時停止する度に、画像が変わる。画像数はいくらでも可。 ugoku[0]=new Array( 10,30,30,10, 10,10, 1.0, "../parts/samp1.gif", "../parts/samp5.gif", "../parts/samp9.gif"); ugoku[1]=new Array( 30,10,10,30, 30,30, 2.5, "../parts/samp2.gif", "../parts/samp6.gif", "../parts/sampa.gif"); // ======= 入力2:補助入力事項 var no = 4 ; // 画面に同時に出す画像数を入力 var hsw = 1 ; // 途中で動く画像を1個だけするか?( yes=1 , no=-1 ) // 1個表示されるのは、ugoku[0]で指定した画像です。 var srl = 1 ; // 画像も同時にスクロールさせるか? ( yes=1 , no=-1 ) // 以上の調整で、速さが足りない(荒い)場合は、次の数値を大きくする var chg= 10 ; // 一秒当たりの描画の切替え回数(初期値 10) // *************************** 入力事項ここまで ************************** // ----- 共通変数・配列の設定 ----- var doc_w, doc_h, off_w, off_h, timerID; xFo=new Array(); yFo=new Array(); xTo=new Array(); yTo=new Array(); h=new Array(); dh=new Array(); r=new Array(); dr=new Array(); drr=new Array(); ti=new Array(); img_h=new Array(); img_w=new Array();ddh=new Array(); ddr=new Array(); staX=new Array(); endX=new Array(); staY=new Array(); endY=new Array(); stp=new Array(); marL=new Array(); marR=new Array(); marT=new Array(); marB=new Array(); Gy=new Array(); Gx=new Array(); Gp=new Array(); xo=new Array(); yo=new Array(); // ----- 開始値の設定 ----- ingN=0; dpsw=1; prima=-1; for(i=0; i<no; i++){ Gy[i]=ingN; Gx[i]=ugoku[ingN].length-1; Gp[i]=7; document.write("<span id='lay"+i+"' style='position:absolute; z-index:56'>" +"<img src='"+ugoku[Gy[i]][Gp[i]]+"' id='img"+i+"'></span>"); marL[i]=ugoku[ingN][0]; marR[i]=ugoku[ingN][1]; marT[i]=ugoku[ingN][2]; marB[i]=ugoku[ingN][3]; ddh[i]=ugoku[ingN][4]; ddr[i]=ugoku[ingN][5]; stp[i]=chg*ugoku[ingN][6]; brSize(); xo[i]=staX[i]+Math.random()*(endX[i]-staX[i]); // 開始座標発生 yo[i]=staY[i]+Math.random()*(endY[i]-staY[i]); Disp("lay"+i, xo[i]+off_w, yo[i]+off_h); img_h[i]=document.getElementById("img"+i).height; img_w[i]=document.getElementById("img"+i).width; if(ingN==ugoku.length-1){ingN=0} else{ingN++} } Prim(); // ----- 渦巻き初期値の設定 ----- function Prim(){ for(i=0; i<no; i++){ if(ti[i]!=0){ // ti[i]==0 以外なら、動きの初期値を決定、ti[i]==0 なら素通り brSize(); if (hsw>0){ // 画像の表示・非表示および切り替え if(prima>0 && i==0){ if(dpsw>0){ visi="hidden"; dpsw=-1 } else{ visi="visible"; dpsw=1 } for(k=1; k<no; k++){ document.getElementById("lay"+k).style.visibility=visi } } }; prima=1; document.getElementById("img"+i).src=ugoku[Gy[i]][Gp[i]]; Gp[i]++; if(Gp[i]>Gx[i]){ Gp[i]=7 } img_h[i]=document.getElementById("img"+i).height; img_w[i]=document.getElementById("img"+i).width; xFo[i]=xo[i]; yFo[i]=yo[i]; //始点座標を取得 xTo[i]=staX[i]+Math.random()*(endX[i]-staX[i]-img_w[i]); xo[i]=xTo[i]; //収束点座標等を発生 yTo[i]=staY[i]+Math.random()*(endY[i]-staY[i]-img_h[i]); yo[i]=yTo[i]; dh[i]=(1+Math.random()*ddh[i])/2; //収束半径 dr[i]=(2+Math.random()*ddr[i])/300; //回転角度 if(Math.random()<0.5){ dr[i]=-dr[i] } h[i]=Math.sqrt(Math.pow(xTo[i]-xFo[i],2)+Math.pow(yTo[i]-yFo[i],2)); //回転半径 r[i]=0; ti[i]=0; // ポインターのリセット drr[i]=Math.acos((xFo[i]-xTo[i])/h[i]); //角度の計算 if((yFo[i]-yTo[i])<0){ drr[i]=-drr[i] } } } // for ループの抜けだし move() } // ----- 渦巻き描画・静止の設定 ----- function move() { for(i=0; i<no; i++){ if(ti[i]==0){ // ti[i]==0 の場合・・渦巻きの描画 x=h[i]*Math.cos(r[i]+drr[i]); y=h[i]*Math.sin(r[i]+drr[i]); r[i]-=dr[i]; h[i]-=dh[i]; if(h[i]>0){ xFo[i]=x+xTo[i]; yFo[i]=y+yTo[i] } else{ xFo[i]=xTo[i]; yFo[i]=yTo[i]; ti[i]=1 } brSize(); Disp("lay"+i, xFo[i]+off_w, yFo[i]+off_h) } // ti[i]==0 以外の場合・・渦巻きの静止 else{ ti[i]++; if(ti[i]>=stp[i]){ Prim() } // 停止時間制御 } } // for ループの抜けだし // 描画の繰り返し clearTimeout(timerID); timerID=setTimeout("move()",1000/chg) } // ----- ブラウザのサイズ・中心発生範囲 ----- function brSize(){ if(document.all){ doc_x=document.body.clientWidth; doc_y=document.body.clientHeight; off_w=document.body.scrollLeft; off_h=document.body.scrollTop } else if(document.getElementById){ doc_x=window.innerWidth; doc_y=window.innerHeight; off_w=window.scrollX; off_h=window.scrollY } if(srl < 0){ off_w=0; off_h=0 } staX[i]=doc_x*marL[i]/100; endX[i]=doc_x*(100-marR[i])/100; staY[i]=doc_y*marT[i]/100; endY[i]=doc_y*(100-marB[i])/100 } // ----- 画像を移動させる ----- function Disp(num,xx,yy){ document.getElementById(num).style.left=xx; document.getElementById(num).style.top =yy } // End --> </script>