實現效果
javascript
1.首先建立html代碼css
<canvas id="canvas" width="500" height="500" style="background:#000;"></canvas>
2.建立canvas環境html
var canvas = document.getElementById('canvas'), //獲取canvas元素 context = canvas.getContext('2d'), //獲取畫圖環境,指明爲2d centerX = canvas.width/2, //Canvas中心點x軸座標 centerY = canvas.height/2, //Canvas中心點y軸座標 rad = Math.PI*2/100, //將360度分紅100份,那麼每一份就是rad度 speed = 0.1; //加載的快慢就靠它了
3.繪製5像素寬的運動外圈html5
//繪製5像素寬的運動外圈 function blueCircle(n){ context.save(); context.strokeStyle = "#fff"; //設置描邊樣式 context.lineWidth = 5; //設置線寬 context.beginPath(); //路徑開始 context.arc(centerX, centerY, 100 , -Math.PI/2, -Math.PI/2 +n*rad, false); //用於繪製圓弧context.arc(x座標,y座標,半徑,起始角度,終止角度,順時針/逆時針) context.stroke(); //繪製 context.closePath(); //路徑結束 context.restore(); }
4.繪製紅色運動圈java
function whiteCircle(){ context.save(); context.beginPath(); context.lineWidth = 2; //設置線寬 context.strokeStyle = "red"; context.arc(centerX, centerY, 100 , 0, Math.PI*2, false); context.stroke(); context.closePath(); context.restore(); }
5.百分比文字繪製css3
function text(n){ context.save(); //save和restore能夠保證樣式屬性只運用於該段canvas元素 context.strokeStyle = "#fff"; //設置描邊樣式 context.font = "40px Arial"; //設置字體大小和字體 //繪製字體,而且指定位置 context.strokeText(n.toFixed(0)+"%", centerX-25, centerY+10); context.stroke(); //執行繪製 context.restore(); }
6.讓它運動起來web
(function drawFrame(){ window.requestAnimationFrame(drawFrame); context.clearRect(0, 0, canvas.width, canvas.height); whiteCircle(); text(speed); blueCircle(speed); if(speed > 100) speed = 0; speed += 0.1; }());
完整代碼canvas
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>HTML5 Canvas 圓形進度條並顯示數字百分比</title> <style> *{margin:0;padding:0;} body{text-align:center;background-color:#000;} </style> </head> <body> <canvas id="canvas" width="500" height="500" style="background:#000;"></canvas> <script> window.onload = function(){ var canvas = document.getElementById('canvas'), //獲取canvas元素 context = canvas.getContext('2d'), //獲取畫圖環境,指明爲2d centerX = canvas.width/2, //Canvas中心點x軸座標 centerY = canvas.height/2, //Canvas中心點y軸座標 rad = Math.PI*2/100, //將360度分紅100份,那麼每一份就是rad度 speed = 0.1; //加載的快慢就靠它了 //繪製5像素寬的運動外圈 function blueCircle(n){ context.save(); context.strokeStyle = "#fff"; //設置描邊樣式 context.lineWidth = 5; //設置線寬 context.beginPath(); //路徑開始 context.arc(centerX, centerY, 100 , -Math.PI/2, -Math.PI/2 +n*rad, false); //用於繪製圓弧context.arc(x座標,y座標,半徑,起始角度,終止角度,順時針/逆時針) context.stroke(); //繪製 context.closePath(); //路徑結束 context.restore(); } //繪製紅色運動圈 function whiteCircle(){ context.save(); context.beginPath(); context.lineWidth = 2; //設置線寬 context.strokeStyle = "red"; context.arc(centerX, centerY, 100 , 0, Math.PI*2, false); context.stroke(); context.closePath(); context.restore(); } //百分比文字繪製 function text(n){ context.save(); //save和restore能夠保證樣式屬性只運用於該段canvas元素 context.strokeStyle = "#fff"; //設置描邊樣式 context.font = "40px Arial"; //設置字體大小和字體 //繪製字體,而且指定位置 context.strokeText(n.toFixed(0)+"%", centerX-25, centerY+10); context.stroke(); //執行繪製 context.restore(); } //動畫循環 (function drawFrame(){ window.requestAnimationFrame(drawFrame); context.clearRect(0, 0, canvas.width, canvas.height); whiteCircle(); text(speed); blueCircle(speed); if(speed > 100) speed = 0; speed += 0.1; }()); } </script> </body> </html>
實現如圖所示的東西效果(落葉下落):
瀏覽器
html代碼:app
<!DOCTYPE html> <html> <head> <title>HTML5樹葉飄落動畫</title> <meta charset="utf-8"> <meta name="viewport" content="width=500px, initial-scale=0.64"> <link rel="stylesheet" href="leaves.css" type="text/css"> <script src="leaves.js" type="text/javascript"></script> </head> <body> <div id="container"> <div id="leafContainer"></div> <div id="message"> <em>這是基於webkit的落葉動畫</em> </div> </div> </body> </html>
css代碼:
body{ background-color: #4E4226; } #container { position: relative; height: 700px; width: 500px; margin: 10px auto; overflow: hidden; border: 4px solid #5C090A; background: #4E4226 url('images/backgroundLeaves.jpg') no-repeat top left; } #leafContainer { position: absolute; width: 100%; height: 100%; } #message{ position: absolute; top: 160px; width: 100%; height: 300px; background:transparent url('images/textBackground.png') repeat-x center; color: #5C090A; font-size: 220%; font-family: 'Georgia'; text-align: center; padding: 20px 10px; -webkit-box-sizing: border-box; -webkit-background-size: 100% 100%; z-index: 1; } em { font-weight: bold; font-style: normal; } #leafContainer > div { position: absolute; width: 100px; height: 100px; -webkit-animation-iteration-count: infinite; -webkit-animation-direction: normal; -webkit-animation-timing-function: linear; } #leafContainer > div > img { position: absolute; width: 100px; height: 100px; -webkit-animation-iteration-count: infinite; -webkit-animation-direction: alternate; -webkit-animation-timing-function: ease-in-out; -webkit-transform-origin: 50% -100%; } @-webkit-keyframes fade{ 0% { opacity: 1; } 95% { opacity: 1; } 100% { opacity: 0; } } @-webkit-keyframes drop{ 0% { -webkit-transform: translate(0px, -50px); } 100% { -webkit-transform: translate(0px, 650px); } } @-webkit-keyframes clockwiseSpin{ 0% { -webkit-transform: rotate(-50deg); } 100% { -webkit-transform: rotate(50deg); } } @-webkit-keyframes counterclockwiseSpinAndFlip { 0% { -webkit-transform: scale(-1, 1) rotate(50deg); } 100% { -webkit-transform: scale(-1, 1) rotate(-50deg); } }
js代碼:
const NUMBER_OF_LEAVES = 30; function init(){ var container = document.getElementById('leafContainer'); for (var i = 0; i < NUMBER_OF_LEAVES; i++) { container.appendChild(createALeaf()); } } function randomInteger(low, high){ return low + Math.floor(Math.random() * (high - low)); } function randomFloat(low, high){ return low + Math.random() * (high - low); } function pixelValue(value){ return value + 'px'; } function durationValue(value){ return value + 's'; } function createALeaf(){ var leafDiv = document.createElement('div'); leafDiv.style.top = "-100px"; leafDiv.style.left = pixelValue(randomInteger(0, 500)); leafDiv.style.webkitAnimationName = 'fade, drop'; var fadeAndDropDuration = durationValue(randomFloat(5, 11)); leafDiv.style.webkitAnimationDuration = fadeAndDropDuration + ', ' + fadeAndDropDuration; var leafDelay = durationValue(randomFloat(0, 5)); leafDiv.style.webkitAnimationDelay = leafDelay + ', ' + leafDelay; var image = document.createElement('img'); image.src = 'images/realLeaf' + randomInteger(1, 5) + '.png'; var spinAnimationName = (Math.random() < 0.5) ? 'clockwiseSpin' : 'counterclockwiseSpinAndFlip'; image.style.webkitAnimationName = spinAnimationName; var spinDuration = durationValue(randomFloat(4, 8)); image.style.webkitAnimationDuration = spinDuration; leafDiv.appendChild(image); return leafDiv; } window.addEventListener('load', init, false);
轉載地址:http://www.html5tricks.com/css3-fall-leaves.html
html5 canvas處理連續幀圖片,下面的代碼基於IE8以上
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/> <title>Canvas Demo</title> <script> var canvas = null;//初始化參數 var img = null; var ctx = null; var imageReady = false; window.onload = function() { var canvas = document.getElementById("animation_canvas"); canvas.width = canvas.parentNode.clientWidth; canvas.height = canvas.parentNode.clientHeight; if (!canvas.getContext) { console.log("Canvas not supported. Please install a HTML5 compatible browser."); return; } // get 2D context of canvas and draw rectangel ctx = canvas.getContext("2d"); ctx.fillStyle="black"; ctx.fillRect(0, 0, canvas.width, canvas.height); console.log(canvas.height); img = document.createElement('img'); img.src = "images/ab0.png"; img.onload = loaded(); } //保證只有圖像加載後纔開始循環動畫 function loaded() { imageReady = true; setTimeout( update, 1000/3);//添加3幀每秒間隔計時器 } function redraw() { ctx.fillStyle="black"; ctx.fillRect(0, 0, 460, 460); ctx.drawImage(img, 0, 0, 232, 180); } //爲了讓圖片以規定的速度動畫,咱們必須追蹤已經通過的時間,而後根據分配給每幀的時間播放幀。基本步驟是: //一、按每秒幾幀設置動畫速度(msPerFrame)。 //二、當你循環遊戲時,計算一下自最後一幀之後已經通過了多少時間(delta)。 //三、若是已經通過的時間足夠把動畫幀播完,那麼播放這一幀並設置累積delta爲0。 //四、若是已經通過的時間不夠,那麼記住(累積)delta時間(acDelta)。 var frame = 0; var lastUpdateTime = 0; var acDelta = 0; var msPerFrame = 200; function update() { requestAnimFrame(update); var delta = Date.now() - lastUpdateTime; //console.log(Date.now(),lastUpdateTime); if (acDelta > msPerFrame){ acDelta = 0; redraw(); img.src='images/ab'+frame+'.png'; frame++; if(frame >= 3) frame = 0; //當繪製後且幀推動完,計時器就會重置。 }else{ acDelta += delta; } lastUpdateTime = Date.now(); } //requestAnimFrame的做用基本上就是setTimeout,但瀏覽器知道你正在渲染幀,因此它能夠優化繪製循環,以及如何與剩下的頁面迴流。 //在某些狀況下,setTimeout比requestAnimFrame更好用,特別是對於手機。 //如下是在不一樣的瀏覽器上調用requestAnimFrame的狀況也不一樣,標準的檢測方法以下: window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function( callback ){ window.setTimeout(callback, 1000 / 3); //若是requestAnimFrame支持不可用,仍是能夠用回內置的setTimeout。 }; })(); </script> </head> <body style="position:absolute;margin:0;padding:0;width:100%;height:100%;"> <canvas id="animation_canvas"></canvas> </body> </html>
後續逐漸添加