Get to know MDN better
此頁面由社群從英文翻譯而來。了解更多並加入 MDN Web Docs 社群。
控制<canvas>元素來產生互動式動畫不是一件難事,當然,如果產生的動畫越複雜越需要多費一些力氣,未來如果有機會我們將說明這一塊。
由於圖形一但產生後便靜止不動,所以我們必須重新繪圖好移動圖案,產生動畫效果,所以如果繪圖越複雜,繪圖運算也需要消耗越多運算資源和時間,換句話說,電腦效能的好壞將大大影響動畫順暢度,或許這也是畫布動畫最大的限制。
產生一個畫面基本上需要以下步驟:
一般來說當程式碼執行完畢後我們才會看到繪圖結果,所以說我們無法靠執行 for 迴圈來產生動畫,我們得靠每隔一段時間繪圖來產生動畫,下面將介紹兩種作法。
第一種作法是利用 Window.setInterval、Window.setTimeout() 與 requestAnimationFrame() 函數。
setInterval()每隔 delay 毫秒,執行輸入 function。
setTimeout()過 delay 毫秒後,執行輸入 function。
requestAnimationFrame()告訴瀏覽器你希望執行動畫的時候,要求瀏覽器在重繪下一張畫面之前,呼叫 callback 函數來更新動畫
如果希望不要有任何的使用者互動影響,請使用 setInterval(),因為它會確實地每隔一段時間就執行程式碼。如果你想製作遊戲,我們能夠使用 keyboard 或是 mouse event 來控制動畫,並使用 setTimeout() 函數一起。藉由設定 EventListeners,我們能夠捕捉任何使用者的動作,並執行我們的動畫函數。
備註:在下面的範例,我們將使用 window.requestAnimationFrame() 方法來控制動畫,window.requestAnimationFrame() 方法為動畫提供更順暢更有效率的方式來執行,當系統準備好繪製畫面時,藉由呼叫動畫 andmation frame() 的 callback 函數。callback 通常每秒鐘執行 60 次,當執行 background tab 時,執行次數會更低,想知道更多關於動畫迴圈(animation loop)的資訊,尤其是遊戲的應用,請查看我們在 Game development zone 的主題 Anatomy of a video game。
本例會產生一個小型太陽系運行動畫。
本例會產生一個時鐘指向現在時間。
本例會產一個由左到右循環捲動美國優勝美地國家公園景色,你也可以自行替換其他比畫布還大的圖片。
循環景色就是在下方的 <canvas> 中捲動,請注意其中的 width 和 height 和程式碼中的 canvasXSize 與 canvasYSize 一樣。
多人繪圖遊戲
Canvascape第一人稱 3D 冒險遊戲
A basic ray-caster透過鍵盤控制動畫範例
canvas adventure另一個透過鍵盤控制動畫範例
An interactive Blob和 Blob 遊戲
Flying through a starfield飛越星河
iGrapher股票市場圖
This page was last modified on 2026年4月10日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.