渦巻き状に画像を移動させる 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)
// *************************** 入力事項ここまで **************************

更新履歴
・ 05/01/15 ver 2.00 画像の切替え可能。Internet Explorer 6 および Netscape 7 に対応。他
・ 03/02/05 ver 1.10 表示の更新
・ 02/11/22 ver 1.00 IE専用化・渦巻き芯の範囲指定を設定可能に更新
・ 02/11/15 ver 0.00 初 公 開

使用画像
・ 画像は、Engel Heart さんから借りました。

ソースファイル
・下記の部分をコピーアンドペーストして使って下さい。 (<body>〜</body>の間に置く)
・ここのプログラムをコピーして下さい。(使用例ではバージョンが古いかも?)
<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>