渦巻き状に画像を移動させる 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>