隨着html5發展,canvas標籤做爲h5革命性的發展標誌也愈來愈流行。canvas標籤的強大之處,不只在於它能夠做爲一個獨立的畫布,也能夠利用canvas作一些動畫而不用導入flash文件。同時,canvas還能夠一些遊戲、商城商品圖片放大器功能等等。javascript
這篇博客先寫一些簡單動畫,同時描述一下原理。php
首先,canvas標籤不是一個獨立的部分,它是要以js代碼輔助而成的一個模塊,因此js代碼對其尤其重要。html
body中寫入canvas標籤:html5
<canvas id="canvas" width="750" height="500"></canvas>
<input type="button" id="animatebutton" value="animate" /> //控制小球的運動與暫停
直接上js代碼:java
canvas的js開頭都是固定的:canvas
var canvas = document.getElementById('canvas'), cx= canvas.getContext('2d'),
paused = true ,//設置小球加載完成是否暫停,如今加載完成小球不動。
加載三個小球的數據:函數
discs = [ { x:150, y:250, velocityx:-3.2, //小球橫向運動速度 velocityy:3.5, //小球縱向運動速度 radius:25, //小球半徑 strokestyle:'gray', //小球填充顏色 }, { x:50, y:150, velocityx:2.2, velocityy:2.5, radius:25, strokestyle:'blue', }, { x:150, y:75, velocityx:1.2, velocityy:1.5, radius:25, strokestyle:'orange', }, ],
定義小球的數量以及找到控制小球暫停的button動畫
numdiscs = discs.length, //小球數量 animatebutton = document.getElementById('animatebutton'); // 小球暫停開始按鈕
用canvas畫出小球:spa
function draw(){ var disc = discs[i]; //小球的索引 for(var i=0;i<numdiscs;i++) { disc = discs[i]; cx.save(); cx.beginPath(); cx.arc(disc.x,disc.y,disc.radius,0, Math.PI*2,false); cx.fillStyle=disc.strokestyle; //小球填充色 cx.fill(); cx.restore(); } }
設置碰撞及小球運動函數:3d
function update(){ var disc = null; for(var i=0;i<numdiscs;i++) { disc = discs[i]; if(disc.x +disc.velocityx+disc.radius > cx.canvas.width || disc.x + disc.velocityx -disc.radius<0) //小球橫向撞牆後朝相反方向運動 disc.velocityx = -disc.velocityx; if(disc.y +disc.velocityy+disc.radius > cx.canvas.height || disc.y + disc.velocityy -disc.radius<0) //小球縱向向撞牆後朝相反方向運動 disc.velocityy = -disc.velocityy; disc.x+=disc.velocityx; //每次循環小球橫向運動距離 disc.y+=disc.velocityy; //每次循環小球縱向運動距離
} }
設置小球的運動,這是一個循環函數,當按鈕點擊運動的時候,小球每隔一點時間循環運動,其中
window.requestAnimationFrame()函數是canvas標籤中特有的,這個函數能夠根據最佳流暢性自動選擇循環一次的時間。
function animate(){ if(!paused){ cx.clearRect(0,0,canvas.width,canvas.height); update(); draw(); window.requestAnimationFrame(animate); } }
運行以上函數:
animatebutton.onclick = function (){ paused = paused? false:true; if(paused){ //點擊按鈕後,按鈕文字改變 animatebutton.value = "animate"; } else{ window.requestAnimationFrame(animate); animatebutton.value = "pause"; //點擊按鈕後,按鈕文字改變 } }
代碼整合:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="button" id="animatebutton" value="animate" /> <canvas id="canvas" width="750" height="500"></canvas> </body> <script type="text/javascript"> var canvas = document.getElementById('canvas'), cx= canvas.getContext('2d'), paused = true , discs = [ { x:150, y:250, velocityx:-3.2, velocityy:3.5, radius:25, strokestyle:'gray', }, { x:50, y:150, velocityx:2.2, velocityy:2.5, radius:25, strokestyle:'blue', }, { x:150, y:75, velocityx:1.2, velocityy:1.5, radius:25, strokestyle:'orange', }, ], numdiscs = discs.length, animatebutton = document.getElementById('animatebutton'); function update(){ var disc = null; for(var i=0;i<numdiscs;i++) { disc = discs[i]; if(disc.x +disc.velocityx+disc.radius > cx.canvas.width || disc.x + disc.velocityx -disc.radius<0) disc.velocityx = -disc.velocityx; if(disc.y +disc.velocityy+disc.radius > cx.canvas.height || disc.y + disc.velocityy -disc.radius<0) disc.velocityy = -disc.velocityy; disc.x+=disc.velocityx; disc.y+=disc.velocityy; } } function draw(){ var disc = discs[i]; for(var i=0;i<numdiscs;i++) { disc = discs[i]; cx.save(); cx.beginPath(); cx.arc(disc.x,disc.y,disc.radius,0, Math.PI*2,false); cx.fillStyle=disc.strokestyle; cx.fill(); //cx.stroke(); cx.restore(); } } function animate(){ if(!paused){ cx.clearRect(0,0,canvas.width,canvas.height); update(); draw(); window.requestAnimationFrame(animate); } } animatebutton.onclick = function (){ paused = paused? false:true; if(paused){ animatebutton.value = "animate"; } else{ window.requestAnimationFrame(animate); animatebutton.value = "pause"; } } </script> </html>
效果:
沒有點擊運動前:
點擊運動後:
小球是一直運動的,點擊pause以後,小球運動暫停。