斜め方向に画像を流す JavaScript
戻 る

動きの特徴
 * 斜め直線移動で,水平垂直線から25度以上の角度で,サインカーブの揺れを伴い流れます。
 * 表示範囲を越えると新たな画像が、ランダムに速さや方向を変えて現れます。
    その時、画像の切り替えが出来ます。
    また、全部描写と、一つの画像を残し画像の表示と非表示の交互描写の、選択が出来ます。
 * 数値の設定だけで、画像の種類毎に、画像の指定や、動きの調整が出来ます。
 * スクロールに対応・非対応を選択出来ます。
 * Internet Explorer 6 および Netscape 7 で動作確認しています。

設定方法
「入力事項」の部分で、色に合わせて、次の設定をします。 太字は入力可能場所。

 ■ その画像の進行方向を、指示に従い、0〜3 の数字 で指定します。
 ■ その画像の表示範囲の、画面上端から、左端からの距離(px) を指定します。
 ■ その画像の表示範囲の、幅、高さ(px) を指定します。
      「0」を指定すると、幅は画面右端まで、高さは画面下端まで表示されます。
 ■ 画像が進む 平均的な速さ を入力します。(大きいほど速い)
 ■ 画像の進む方向と直角に揺れる幅を入力します。(大きいほど揺れも大きい)
       「0」を入れると、まっすぐ進みます。
 ■ 画像の進む方向と直角に揺れる速さを入力します。(大きいほど速く揺れる)
 ■ 「0」から順に表示したい数の画像を、アドレスを含むファイル名で指定します。
      画像を2つ以上指定すると、流れ出す度に画像がに変わり、指定順に繰り返します。
 ■ 画面に同時に出したい画像数を入力します。
 ■ 途中で流れる画像を1個だけにするなら 1 を指定。
        (この時、1つ表示される画像は ugoku[0] で指定した画像になります。)
      ずっと指定数の画像を表示するなら -1 を指定。
 ■ 画面をスクロールさせた時、画像も同時にスクロールさせたいので 0 を指定。
 ■ 動きの全体の速さを入力します。(大きいほど速いが、負担大)

// *****************************  入力事項  ******************************
// ======= 入力1:画像の種類と流れる方向,流れ方,および範囲
// 1番目の数字により 0:右上  1:左上  2:左下  3:右下 方向へ流れる
// 2〜3番目の数字で表示範囲の画面「上」・「左」からの各距離( px )を入力
// 4〜5番目の数字で「表示幅」と「表示高さ」( px )を入力
//     「 0 」の場合はそれぞれ、画面右端まで、下端まで表示する。
// 6番目の数字で、移動の方向の最大速さを入力(大きい程速い 目安値 30)
// 7番目の数字で、揺れの方向の最大幅をピクセル値で入力(目安値 30)
// 8番目の数字で、揺れの方向の最大速さを入力(大きい程,早く荒い 目安値 10)
// 9番目で、出したい画像の種類を必要数だけ入力(0から順に)
//     画像が2つ以上あるときは、流れ出す度に、画像が変わる。
ugoku[0]=new Array(0, 0,0, 0,0, 50, 10, 5, "../parts/samp1.gif",
         "../parts/samp5.gif", "../parts/samp9.gif");
ugoku[1]=new Array(1, 0,0, 0,0, 40, 20,10, "../parts/samp2.gif",
         "../parts/samp6.gif", "../parts/sampa.gif");
ugoku[2]=new Array(2, 0,0, 0,0, 30, 30,15, "../parts/samp3.gif",
         "../parts/samp7.gif", "../parts/sampb.gif");
ugoku[3]=new Array(3, 0,0, 0,0, 20, 40,20, "../parts/samp4.gif",
         "../parts/samp8.gif", "../parts/sampc.gif");
// ======= 入力2:補助入力事項
var no  =  8 ;  // 画面に同時に出す画像数を入力
var hsw =  1 ;   // 途中で流れる画像を1個だけするか?( yes=1 , no=-1 )
                 //   1個表示されるのは、ugoku[0]で指定した画像です。
var srl =  1 ;  // 画像を同時にスクロールさせるか?  ( yes=1 , no=-1 )
  // 以上の調整で、速さが足りない(荒い)場合は、次の数値を大きくする
var chg = 10 ;  // 一秒当たりの描画の切替え回数(初期値 10)
// *************************** 入力事項ここまで **************************

更新履歴
・05/01/11 ver 2.00 画像の切替え可能。Internet Explorer 6 および Netscape 7 に対応。他
・04/04/04 ver 1.10 スクロールの対応を選択可にする。
・04/04/03 ver 1.00 横揺れを付けられる。 画像種類ごとに範囲指定他。
・03/04/14 ver 0.00 初 公 開

使用画像
・画像は、Engel Heart さんから借りました。
ソースファイル
・下記の部分をコピーアンドペーストして使って下さい。 (<body>〜</body>の間に置く)
・ここのプログラムをコピーして下さい。(使用例ではバージョンが古いかも?)
<script type="text/javascript">
<!--// naname ver2.00  (ぱーぷりんの溜まり場)
ugoku=new Array();   // この行は触らないで・・

// *****************************  入力事項  ******************************
// ======= 入力1:画像の種類と流れる方向,流れ方,および範囲
// 1番目の数字により 0:右上  1:左上  2:左下  3:右下 方向へ流れる
// 2〜3番目の数字で表示範囲の画面「上」・「左」からの各距離( px )を入力
// 4〜5番目の数字で「表示幅」と「表示高さ」( px )を入力
//     「 0 」の場合はそれぞれ、画面右端まで、下端まで表示する。
// 6番目の数字で、移動の方向の最大速さを入力(大きい程速い 目安値 30)
// 7番目の数字で、揺れの方向の最大幅をピクセル値で入力(目安値 30)
// 8番目の数字で、揺れの方向の最大速さを入力(大きい程,早く荒い 目安値 10)
// 9番目以降で、出したい画像の種類を必要数だけ入力(0から順に)
//     画像が2つ以上あるときは、流れ出す度に、画像が変わる。
ugoku[0]=new Array(0, 0,0, 0,0, 50, 10, 5, "../parts/samp1.gif",
         "../parts/samp5.gif", "../parts/samp9.gif");
ugoku[1]=new Array(1, 0,0, 0,0, 40, 20,10, "../parts/samp2.gif",
         "../parts/samp6.gif", "../parts/sampa.gif");
ugoku[2]=new Array(2, 0,0, 0,0, 30, 30,15, "../parts/samp3.gif",
         "../parts/samp7.gif", "../parts/sampb.gif");
ugoku[3]=new Array(3, 0,0, 0,0, 20, 40,20, "../parts/samp4.gif",
         "../parts/samp8.gif", "../parts/sampc.gif");
// ======= 入力2:補助入力事項
var no  =  8 ;  // 画面に同時に出す画像数を入力
var hsw =  1 ;   // 途中で流れる画像を1個だけするか?( yes=1 , no=-1 )
                 //   1個表示されるのは、ugoku[0]で指定した画像です。
var srl =  1 ;  // 画像を同時にスクロールさせるか?  ( yes=1 , no=-1 )
  // 以上の調整で、速さが足りない(荒い)場合は、次の数値を大きくする
var chg = 10 ;  // 一秒当たりの描画の切替え回数(初期値 10)
// *************************** 入力事項ここまで **************************

//  共通変数・配列の設定
var off_w, off_h, doc_x, doc_y, dx, dy;
dgr=new Array(); xza=new Array(); yza=new Array(); amp=new Array();
stx=new Array(); sty=new Array(); kaku=new Array();
sdg=new Array(); muki=new Array(); img_w=new Array(); img_h=new Array();
marg_t=new Array(); marg_l=new Array(); disp_w=new Array(); disp_h=new Array();
Gy=new Array(); Gx=new Array(); Gp=new Array();

//  初期値の設定 
ingN=0; dpsw=1; prima=-1;
for(i=0; i<no; i++){
 Gy[i]=ingN; Gx[i]=ugoku[ingN].length; Gp[i]=8;
 document.write("<div id='dot"+i+"' style='position:absolute; z-index:52'>"
   +"<img src='"+ugoku[ingN][8]+"' id='img"+i+"'></div>")
 dgr[i]=Math.random()*6.24; muki[i] =ugoku[ingN][0]; 
 marg_t[i]=ugoku[ingN][1]; marg_l[i]=ugoku[ingN][2];
 disp_w[i]=ugoku[ingN][3]; disp_h[i]=ugoku[ingN][4];
 prim(i);
 xza[i]=marg_l[i]+Math.random()*(disp_w[i]-img_w[i]);
 yza[i]=marg_t[i]+Math.random()*(disp_h[i]-img_h[i]);
  if (ingN==(ugoku.length-1)){ ingN=0 } else{ ingN+=1 } }
Zahyo();

// メインルーチン
function Zahyo(){ brSize();
for(i=0; i<no; ++i){
 dgr[i]+=sdg[i];
 ddx=Math.sin(kaku[i]); ddy=Math.cos(kaku[i]);
  if(muki[i]==1 || muki[i]==3){ ddx=-ddx }
 dx=amp[i]*Math.sin(dgr[i])*ddx; dy=amp[i]*Math.sin(dgr[i])*ddy;
 xza[i]+=stx[i] ; yza[i]+=sty[i];
if( xza[i]+dx>marg_l[i]+disp_w[i]-img_w[i] || xza[i]+dx<marg_l[i] ||
    yza[i]+dy>marg_t[i]+disp_h[i]-img_h[i] || yza[i]+dy<marg_t[i] ) {
 prim(i);
  if(muki[i]==0){ if( Math.random()<0.5){st_3(i)} else{st_4(i)} }
  if(muki[i]==1){ if( Math.random()<0.5){st_2(i)} else{st_3(i)} }
  if(muki[i]==2){ if( Math.random()<0.5){st_1(i)} else{st_2(i)} }
  if(muki[i]==3){ if( Math.random()<0.5){st_1(i)} else{st_4(i)} } }

 Disp("dot"+i, off_w+xza[i]+dx, off_h+yza[i]+dy) }
 setTimeout("Zahyo()",1000/chg) }

// スタート位置
function st_1(u){
  xza[u]=marg_l[u]+Math.random()*(disp_w[u]-img_w[u]);
  yza[u]=marg_t[u]; if(dy<0){ yza[u]+=dy } }  // 上辺
function st_2(u){
  xza[u]=marg_l[u]+disp_w[u]-img_w[u]; if(dx>0){ xza[u]-=dx }
  yza[u]=marg_t[u]+Math.random()*(disp_h[u]-img_h[u]); }  // 右辺
function st_3(u){
  xza[i]=marg_l[u]+Math.random()*(disp_w[u]-img_w[u]);
  yza[i]=marg_t[u]+disp_h[u]-img_h[u]; if(dy>0){ yza[u]-=dy } }  // 下辺
function st_4(u){
  xza[i]=marg_l[u]; if(dx<0){ xza[u]+=dx }
  yza[i]=marg_t[u]+Math.random()*(disp_h[u]-img_h[u]) }  // 左辺

// 初期データ発生
function prim(i){ 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("dot"+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]=8 }
 img_h[i]=document.getElementById("img"+i).height;
 img_w[i]=document.getElementById("img"+i).width;
 if(disp_w[i]==0){disp_w[i]=doc_x-marg_l[i]};
 if(disp_h[i]==0){disp_h[i]=doc_y-marg_t[i]};
 kaku[i]=0.44+Math.random()*0.69;
 amp[i] =(0.2+Math.random()*0.8)*ugoku[Gy[i]][6];
 sdg[i] =(0.3+Math.random())*ugoku[Gy[i]][7]/100;
 stz=(0.7+Math.random())*ugoku[Gy[i]][5]/10;
  if(muki[i]==0 || muki[i]==3){stx[i]=Math.cos(kaku[i])*stz}
    else{stx[i]=-Math.cos(kaku[i])*stz}
  if(muki[i]==2 || muki[i]==3){sty[i]=Math.sin(kaku[i])*stz}
    else{sty[i]=-Math.sin(kaku[i])*stz} }

// ブラウザのサイズを調べる
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 } }

// 画像を移動する
function Disp(num,xx,yy){
  document.getElementById(num).style.left=xx;
  document.getElementById(num).style.top =yy }

// -->
</script>