Javascript: 動態效果


阿瑟 發表



其實要自己寫一隻網頁動態特效, 把Javascript教學區的教學文章看完一定足夠, 您只要記得, 動態的效果百分之八九十都是用setTimeout()達成的!

小弟這次用一個物理模擬範例來講解Javascript動態效果的寫作基本概念

下面這隻程式是模擬一個在地球上水平拋射的球:
<HTML>
<BODY onLoad="drop(0);">
<DIV id="physics" style="POSITION:absolute;">
O
</DIV>

<DIV id="boo" style="float:right">
</DIV>

<script language="javascript">
maxheight = document.body.clientHeight - 50;
speed = 20;
function drop(x)
{

  physics.style.left = x*speed;
  physics.style.top = (9.8*(x*x))/2;
  boo.innerHTML = "總共" + x + "秒" + "<br>" + "最遠垂直距離: " 
                 + parseInt(physics.style.top) + " 公尺<br>最遠水平距離: " 
                 + parseInt(physics.style.left) + " 公尺<br>" + "水平初速度: " 
                 + speed + "公尺/秒";
  x++;
  if(parseInt(physics.style.top) < maxheight)
  action = setTimeout("drop(" + x + ")",100);  
}

</script> 


</BODY>
</HTML>

小弟將上面的語法逐一講解:

<DIV id="physics" style="POSITION:absolute;">
O
</DIV>

先執行一下您的範例, 你會看到一個圓球從上拋下, 這個DIV標籤產生的就是那個圓球, 其id為physics, 由於該圓球會隨著時間移動, 因此必須將該物件樣式的POSITION屬性設定為Absolute.

<DIV id="boo" style="float:right">
</DIV>

這隻程式有一個數據區塊, 紀錄高度與長度等數據, 這個DIV區塊就是用來顯示數據的.

再來就要看看Javascript的部分了...

maxheight = document.body.clientHeight - 50;
speed = 20;

這是兩個變數, maxheight為高度極限值, speed為水平的拋射速度, document.body.clientHeight則是畫面的最大高度, 減掉50是避免球超乎畫面. 這樣運算出來的maxheight是離畫面最底端50像素的高度.

接下來看function drop()...

physics.style.left = x*speed;
由於是水平拋射, 水平速度不會改變, x為秒, 因此時間*速度 = 距離.

physics.style.top = (9.8*(x*x))/2;
垂直的部分由於受到地心引力影響, 公式為垂直距離 = (9.8*(x*x))/2, x為秒.

下面那一個boo.innerHTML是顯示每過一秒的垂直與水平數據

if(parseInt(physics.style.top) < maxheight)
action = setTimeout("drop(" + x + ")",100);

由於physics.style.top回傳一個字串, 因此必須用parseInt來取得其數值. 這個if/else的作用就是, 當球還在螢幕最大高度以內 (也就是還沒到螢幕最底端), 就執行下一個動作..

整體的程式邏輯其實不難, drop(x)這個函式有參數x, 代表一秒, 而每當x增加的時候, 球的位置就會繼續移動, 如果球尚未超出最大高度, 就用setTimeout()再執行下一秒的drop(x). 如此將每一秒的動作串起來, 就可以看到一個拋射的動畫了.

由於這只是一個模擬, 因此小弟將一公尺化成一像素, 並且將一秒化成1/10秒, 這也是為什麼setTimeout()中的時間小弟設定為100微秒而不是1000微秒, 這部分要注意一下.

最後更新日期: 7/7/2003 11:02:26 AM