歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> HTML5 實現小車動畫效果(Canvas/CSS3/JQuery)

HTML5 實現小車動畫效果(Canvas/CSS3/JQuery)

日期:2017/3/1 10:24:09   编辑:Linux編程

HTML5正在變得越來越流行。在這個移動設備日益增長的時代,對來自Adobe的Flash插件的改造需求也正在快速增長。因為就在最近,Adobe宣布Flash將不再支持移動設備。這意味著,Adobe自身也認為對移動設備來講HTML5是一項重要的技術。而桌面系統的改變也是遲早的事。

HTML的一大劣勢就是對於多媒體技術支持的缺乏。在HTML中,你無法直接顯示一個視頻或在屏幕上繪畫。在HTML5中,隨著<video>與<canvas>元素的引進。這些元素給予開發者直接使用“純粹的”HTML來實現多媒體技術的可能性——僅需要寫一些Javascript代碼來配合HTML。在多媒體技術中,有一個基本的技術應該被支持——動畫。在HTML5中,有不少方式能夠實現該功能。

在這篇文章中,我僅將最新的<canvas>元素與即將到來的CSS3動畫技術進行比較。其他的可能性包括DOM元素或SVG元素的創建和動畫。這些可能性將不在本文中進行討論。從開始就應該注意到canvas技術在當前發布的大部分主流浏覽器都給予了支持,而CSS3動畫僅在最新的FireFox與Chrome浏覽器中才有實現的可能,下一個版本的IE也將提供對CSS3動畫的支持。(所以本文中所有演示代碼的效果,在Win 7系統下當前最新版的Chrome浏覽器中都可實現,但在其他操作系統與其他浏覽器中,並不一定能看到所有演示代碼的效果)。

演示地址:http://www.muu.cc/html5/xiaoche

下載地址:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2012年資料/4月/22日/HTML5 實現小車動畫效果/

這裡我選擇了一個比較簡單的動畫:

PS:由於顯卡、錄制的幀間隔,以及可能你電腦處理器的原因,播放過程可能有些不太流暢或者失真!

分三種方式實現:

(1) canvas元素結合JS

(2) 純粹的CSS3動畫(暫不被所有主流浏覽器支持,比如IE)

(3) CSS3結合Jquery實現

知道如何使用CSS3動畫比知道如何使用<canvas>元素更重要:因為浏覽器能夠優化那些元素的性能(通常是他們的樣式,比如CSS),而我們使用canvas自定義畫出來的效果卻不能被優化。原因又在於,浏覽器使用的硬件主要取決於顯卡的能力。目前,浏覽器沒有給予我們直接訪問顯卡的權力,比如,每一個繪畫操作都不得不在浏覽器中先調用某些函數。

讓我們從Canvas開始

HTML代碼:

  1. <html>
  2. <head>
  3. <meta charset="UTF-8" />
  4. <title>Animation in HTML5 using the canvas element</title>
  5. </head>
  6. <body onload="init();">
  7. <canvas id="canvas" width="1000" height="600">Your browser does not support the <code><canvas></code>-element.Please think about updating your brower!</canvas>
  8. <div id="controls">
  9. <button type="button" onclick="speed(-0.1);">Slower</button>
  10. <button type="button" onclick="play(this);">Play</button>
  11. <button type="button" onclick="speed(+0.1)">Faster</button>
  12. </div>
  13. </body>
  14. </html>

JS代碼:

定義一些變量:

  1. var dx=5, //當前速率
  2. rate=1, //當前播放速度
  3. ani, //當前動畫循環
  4. c, //畫圖(Canvas Context)
  5. w, //汽車[隱藏的](Canvas Context)
  6. grassHeight=130, //背景高度
  7. carAlpha=0, //輪胎的旋轉角度
  8. carX=-400, //x軸方向上汽車的位置(將被改變)
  9. carY=300, //y軸方向上汽車的位置(將保持為常量)
  10. carWidth=400, //汽車的寬度
  11. carHeight=130, //汽車的高度
  12. tiresDelta=15, //從一個輪胎到最接近的汽車底盤的距離
  13. axisDelta=20, //汽車底部底盤的軸與輪胎的距離
  14. radius=60; //輪胎的半徑

為了實例化汽車canvas(初始時被隱藏),我們使用下面的自執行的匿名函數

  1. (function(){
  2. var car=document.createElement('canvas'); //創建元素
  3. car.height=carHeight+axisDelta+radius; //設置高度
  4. car.width=carWidth; //設置寬度
  5. w=car.getContext('2d');
  6. })();
點擊“Play”按鈕,通過定時重復執行“畫汽車”操作,來模擬“幀播放”功能:
  1. function play(s){ //參數s是一個button
  2. if(ani){ //如果ani不為null,則代表我們當前已經有了一個動畫
  3. clearInterval(ani); //所以我們需要清除它(停止動畫)
  4. ani=null;
  5. s.innerHTML='Play'; //重命名該按鈕為“播放”
  6. }else{
  7. ani=setInterval(drawCanvas,40); //我們將設置動畫為25fps[幀每秒],40/1000,即為二十五分之一
  8. s.innerHTML='Pause'; //重命名該按鈕為“暫停”
  9. }
  10. }
加速,減速,通過以下方法,改變移動距離的大小來實現:
  1. function speed(delta){
  2. var newRate=Math.max(rate+delta,0.1);
  3. dx=newRate/rate*dx;
  4. rate=newRate;
  5. }
頁面加載的初始化方法:
  1. //init
  2. function init(){
  3. c=document.getElementById('canvas').getContext('2d');
  4. drawCanvas();
  5. }
主調方法:
  1. function drawCanvas(){
  2. c.clearRect(0,0,c.canvas.width, c.canvas.height); //清除Canvas(已顯示的),避免產生錯誤
  3. c.save(); //保存當前坐標值以及狀態,對應的類似“push”操作
  4. drawGrass(); //畫背景
  5. c.translate(carX,0); //移動起點坐標
  6. drawCar(); //畫汽車(隱藏的canvas)
  7. c.drawImage(w.canvas,0,carY); //畫最終顯示的汽車
  8. c.restore(); //恢復Canvas的狀態,對應的是類似“pop”操作
  9. carX+=dx; //重置汽車在X軸方向的位置,以模擬向前走
  10. carAlpha+=dx/radius; //按比例增加輪胎角度
  11. if(carX>c.canvas.width){ //設置某些定期的邊界條件
  12. carX=-carWidth-10; //也可以將速度反向為dx*=-1;
  13. }
  14. }
畫背景:
  1. function drawGrass(){
  2. //創建線性漸變,前兩個參數為漸變開始點坐標,後兩個為漸變結束點坐標
  3. var grad=c.createLinearGradient(0,c.canvas.height-grassHeight,0,c.canvas.height);
  4. //為線性漸變指定漸變色,0表示漸變起始色,1表示漸變終止色
  5. grad.addColorStop(0,'#33CC00');
  6. grad.addColorStop(1,'#66FF22');
  7. c.fillStyle=grad;
  8. c.lineWidth=0;
  9. c.fillRect(0,c.canvas.height-grassHeight,c.canvas.width,grassHeight);
  10. }
畫車身:
  1. function drawCar(){
  2. w.clearRect(0,0,w.canvas.width,w.canvas.height); //清空隱藏的畫板
  3. w.strokeStyle='#FF6600'; //設置邊框色
  4. w.lineWidth=2; //設置邊框的寬度,單位為像素
  5. w.fillStyle='#FF9900'; //設置填充色
  6. w.beginPath(); //開始繪制新路徑
  7. w.rect(0,0,carWidth,carHeight); //繪制一個矩形
  8. w.stroke(); //畫邊框
  9. w.fill(); //填充背景
  10. w.closePath(); //關閉繪制的新路徑
  11. drawTire(tiresDelta+radius,carHeight+axisDelta); //我們開始畫第一個輪子
  12. drawTire(carWidth-tiresDelta-radius,carHeight+axisDelta); //同樣的,第二個
  13. }
畫輪胎:
  1. function drawTire(x,y){
  2. w.save();
  3. w.translate(x,y);
  4. w.rotate(carAlpha);
  5. w.strokeStyle='#3300FF';
  6. w.lineWidth=1;
  7. w.fillStyle='#0099FF';
  8. w.beginPath();
  9. w.arc(0,0,radius,0,2*Math.PI,false);
  10. w.fill();
  11. w.closePath();
  12. w.beginPath();
  13. w.moveTo(radius,0);
  14. w.lineTo(-radius,0);
  15. w.stroke();
  16. w.closePath();
  17. w.beginPath();
  18. w.moveTo(0,radius);
  19. w.lineTo(0,-radius);
  20. w.stroke();
  21. w.closePath();
  22. w.restore();
  23. }
由於原理簡單,並且代碼中作了詳細注釋,這裡就不一一講解!
Copyright © Linux教程網 All Rights Reserved