欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

使用 HTML5 canvas 繪制精美的圖形

系統 2119 0

HTML5 是一個新興標準,它正在以越來越快的速度替代久經考驗的 HTML4。HTML5 是一個 W3C “工作草案” — 意味著它仍然處于開發階段 — 它包含豐富的元素和屬性,它們都支持現行的 HTML 4.01 版本規范。它還引入了幾個新元素和屬性,它們適用許多使用 web 頁面的領域 — 音頻、視頻、圖形、數據存儲、內容呈現,等等。本文主要關注圖形方面的增強:canvas。

?

新的 HTML5 canvas 是一個原生 HTML 繪圖簿,用于 JavaScript 代碼,不使用第三方工具。跨所有 web 瀏覽器的完整 HTML5 支持還沒有完成,但在新興的支持中,canvas 已經可以在幾乎所有現代瀏覽器上良好運行了,但 Windows? Internet Explorer? 除外。幸運的是,一個解決方案已經出現,將 Internet Explorer 也包含進來。

?

本質上,canvas 元素是一個白板,直到您在它上面 “繪制” 一些可視內容。與擁有各種畫筆的藝術家不同,您使用不同的方法在 canvas 上作畫。您甚至可以在 canvas 上創建并操作動畫,這不是使用畫筆和油彩所能夠實現的。

本 文探索新的 HTML canvas 元素,從簡單地包含一個 canvas 元素到高級 JavaScript 交互(動畫的關鍵)逐步進行演示。學習如何在一個 web 頁面上顯示 canvas。本文針對 web 設計師和開發人員,盡管 JavaScript 知識不是必須的,但理解該語言的運行方式將有所幫助。但是,HTML 知識是關鍵所在,尤其是如何創建一個基本 web 頁面。

?

要查看本文展示的示例的實時實例,您需要一個瀏覽器并能訪問 Internet。所有示例都在一個真實網站上提供(參見 參考資料 )。

?

瀏覽器支持

確 定哪些瀏覽器支持 HTML5 和一個移動目標達到什么程度。在本文撰寫之時,Google Chrome、Apple Safari 和 Mozilla Firefox 都支持大多數新的 HTML5 元素,它們都支持 canvas 元素。Internet Explorer 7 和 8 都不支持 HTML5;Internet Explorer 9 處于測試階段,支持 HTML5,但還有一些問題。

?

在此期間,有一個針對不支持 HTML5 的 Internet Explorer 版本的補丁可用。這個補丁的前提是創建使用 JavaScript 代碼的元素。例如,可以使用代碼段 document.createElement('canvas') 創建一個可識別的 Canvas 標記;但是,這并不意味著有東西經過元素本身 。一個流行的解決方法是包含一個完整的基于 canvas 的 JavaScript 庫,這個庫由 Google 提供,稱為 ExplorerCanvas — 或簡稱 excanvas 。下載并將其作為一個外部文件引用,如下所示。(參見 參考資料 中的鏈接,了解更多 excanvas 信息。)

          <!--[if IE]>
  <script type="text/javascript" src="excanvas.js"></script>
<![endif]-->
        
?

?

通過包含 excanvas ,您向 Internet Explorer 提供 canvas 及其大多數方法。

?

創建您的第一個 canvas

由于 canvas 只是一個 HTML 標記,因此它的顯示方式只是包含在標記中。第一個示例(如 圖 1 所示)顯示一個最簡單的 canvas。它之所以可見,是因為它通過 style 屬性獲得了一個顏色方案,通過 width height 屬性獲得了其大小。

?
圖 1. 一個空白 canvas

這個頁面的代碼簡短明了,如 清單 1 所示。

?
清單 1. 包含一個 canvas 的 web 頁面的 HTML

?

          <!DOCTYPE html>
<html>
<head>
<title>HTML5 Canvas Demo</title>
<!--[if IE]><script type="text/javascript" src="excanvas.js"></script><![endif]-->
</head>
<body>
<div style="margin-left:30px;">
<canvas id="myCanvasTag" width="400" height="400" 
    style="background-color:blue;border: 10px yellow solid"></canvas>
<br /><br />
<a href="index.html">back</a>
</div>
</body>
</html>
        

?

?

這個 canvas 的寬度和高度均為 400 像素,邊框為黃色,背景為藍色。canvas 上沒有任何實際繪圖;繪圖通過屬于 canvas 的 JavaScript 方法完成。

?

canvas 方法

表 1 列示了幾個附加到 canvas 上下文的方法。

?
表 1. canvas 方法
方法 用途
getContext(contextId) 公開在 canvas 上繪圖需要的 API。惟一(當前)可用的 contextID 2d
height 設置 canvas 的高度。默認值是 150 像素。
width 設置 canvas 的寬度。默認值是 300 像素。
createLinearGradient(x1,y1,x2,y2) 創建一個線性漸變。起始坐標為 x1,y1 ,結束坐標為 x2,y2
createRadialGradient(x1,y1,r1,x2,y2,r2) 創建一個放射狀漸變。圓圈的起始坐標是 x1,y1 ,半徑為 r1 。圓圈的結束坐標為 x2,y2 ,半徑為 r2
addColorStop(offset, color) 向一個漸變添加一個顏色停止。 顏色停止(color stop) 是漸變中顏色更改發生的位置。offset 必須介于 0 到 1 之間。
fillStyle 設置用于填充一個區域的顏色 — 例如, fillStyle='rgb(255,0,0)' .
strokeStyle 設置用于繪制一根直線的顏色 — 例如, fillStyle='rgb(255,0,0)' .
fillRect(x,y,w,h) 填充一個定位于 x y ,寬度和高度分別為 w h 的矩形。
strokeRect(x,y,w,h) 繪制一個定位于 x y ,寬度和高度分別為 w h 的矩形的輪廓。
moveTo(x,y) 將繪圖位置移動到坐標 x,y
lineTo(x,y) 從繪圖方法結束的最后位置到 x,y 繪制一條直線。

?

構建更復雜的 canvas 應用程序

本小節將展示一系列示例,每個示例的功能都比前一個示例略有增加。

?

更深刻的視覺體驗

首先,將一組矩形放置到 canvas 上。記住,矩形是擁有 4 條直邊和 4 個直角的圖形,正方形是矩形的變體。 圖 2 顯示 canvas 上有一系列矩形,每個矩形都比前一個略小。注意,每個矩形的顏色都不同,使其更清晰明確。

?
圖 2. 使用一些矩形填充的 canvas
canvas 由一些顏色不同的矩形填充

清單 2 顯示了用于創建圖 2 中的 canvas 的代碼。每個矩形都由兩行代碼創建:首先, fillStyle 方法使用顏色定義的紅、綠、藍(RGB)格式定義顏色( fillStyle='rgb(255,0,0) )。然后, fillRect 方法( fillRect(50,50,300,300) )定義大小。前兩個值設置起始坐標,后兩個值設置結束坐標。

?
清單 2. 使用 JavaScript 代碼創建上下文并使用各種方法

?

          <!DOCTYPE html>
<html>
<head>
<title>HTML5 Canvas Demo</title>
<!--[if IE]>
  <script type="text/javascript" src="excanvas.js"></script>
<![endif]-->
<script>
 window.onload=function() {
   var mycanvas=document.getElementById("myCanvasTag");
   var mycontext=mycanvas.getContext('2d');
   mycontext.fillStyle='rgb(0,0,255)'; 
   mycontext.fillRect(0,0,400,400);   
   mycontext.fillStyle='rgb(255,0,0)';  
   mycontext.fillRect(50,50,300,300);    
   mycontext.fillStyle='rgb(0,255,0)';  
   mycontext.fillRect(100,100,200,200);
   mycontext.fillStyle='rgb(100,100,100)';  
   mycontext.fillRect(125,175,150,25);
 }
</script>
</head>
<body>
<div style="margin-left:30px;">
<canvas id="myCanvasTag" width="400" height="400" style="border: 10px yellow solid">
</canvas>
<br /><br />
<a href="index.html">back</a>
</div>
</body>
</html>
        

?

?

要在 canvas 上繪圖,通過將 getContext('2d') 應用到 canvas 元素訪問提供方法的 API。通過這個 document.getElementById 方法,canvas 元素被設置為一個 JavaScript 變量:

          var mycanvas=document.getElementById("myCanvasTag");
        
?

?

然后將 getContext 應用到 canvas 元素,如下所示。

          var mycontext=mycanvas.getContext('2d');
        
?

?

一旦一個變量被設置到上下文,所有方法就可以使用了。

下一個示例展示如何結合兩種技術。一種是矩形重疊,方法是使用 fillRect 參數來定位矩形(見 圖 3)。

?
圖 3. 向一個 canvas 上的矩形應用透明度
設置 canvas 上的對象的透明度

第二種技術是 RGB 顏色處理的變體,即添加透明度。不使用 rgb ,而是使用 rgba a 表示 alpha 通道,該通道控制透明度。在圖 3 中的示例中,第二個矩形的透明度被設置為 50%(或 .5),第三個設置為 25%(或 .25)。清單 3 顯示了完整的標記。

?
清單 3. 使用透明度
          <!DOCTYPE html>
<html>
<head>
<title>HTML5 Canvas Demo</title>
<!--[if IE]>
  <script type="text/javascript" src="excanvas.js"></script>
<![endif]-->
<script>
  window.onload=function() {
    var mycanvas=document.getElementById("myCanvasTag");
    var mycontext=mycanvas.getContext('2d');
    mycontext.fillStyle='rgb(0,0,255)'; 
    mycontext.fillRect(30,30,300,300);           
    mycontext.fillStyle='rgba(0,255,0,0.5)';  
    mycontext.fillRect(60,60,300,300);    
    mycontext.fillStyle='rgba(255,0,0,0.25)';  
    mycontext.fillRect(90,90,300,300); 
  }
</script>
</head>
<body>
<div style="margin-left:30px;">
<canvas id="myCanvasTag" width="400" height="400" style="border: 10px yellow solid">
</canvas>
<br /><br />
<a href="index.html">back</a>
</div>
</body>
</html>
        

?

漸變 — 經過協調的顏色混合 — 原生于 canvas ,通過兩種方法: createLinearGradient createRadialGradient 。圖 4 展示了一個線性漸變。 addColorStop 方法定義一個顏色,以及它在漸變中變為活動狀態的位置。由于一個漸變可以擁有多個顏色停止,因此這種定位是主觀的。顏色定位值必須介于 0 到 1 之間,但測試變體和顏色停止的數量可以生成不同的結果,即使一個值(比如 .25)保持不變。換句話說,一個顏色停止可以將其位置設定為 .25,但是相關顏色可以從整個漸變路徑的四分之一處之后一點開始發生,一直持續到漸變結束,具體情況取決于您設置其他顏色停止的位置。記住,這是一個新 的實現,可能還在改進過程中。漸變的一個好處是它們總是引人注目,無論代碼和結果是否經過完美的協調。

?
圖 4. 一個線性漸變
一個線性漸變

圖 4 中的漸變通過 清單 4 中的 JavaScript 代碼創建。

?
清單 4. 創建一個線性漸變
              var mycanvas=document.getElementById("myCanvasTag");
    var mycontext=mycanvas.getContext('2d');
    var mygradient=mycontext.createLinearGradient(30,30,300,300);           
    mygradient.addColorStop(0,"#FF0000");
    mygradient.addColorStop(1,"#00FF00");
    mycontext.fillStyle=mygradient;
    mycontext.fillRect(0,0,400,400);
        

?

注意,清單 4 中的顏色停止被全面實現為從這個方法本身創建的一個實時(on-the-fly)漸變的一個方法。語句 mygradient.addColorStop(0,"#FF0000") 顯示顏色停止擁有兩個參數:位置和顏色。

圖 5 展示了一個放射狀漸變。用于創建這個漸變的代碼與清單 4 中的代碼類似,除了使用 createRadialGradient 方法替代 createLinearGradient 方法之外。

?
圖 5. 一個放射狀漸變
一個放射狀漸變

用于創建圖 5 中的放射狀漸變的代碼如 清單 5 所示。注意所有 5 個顏色停止。

?
清單 5. 創建一個放射狀漸變
          <!DOCTYPE html>
<html>
<head>
<title>HTML5 Canvas Demo</title>
<!--[if IE]>
  <script type="text/javascript" src="excanvas.js"></script>
<![endif]-->
<script>
  window.onload=function() {
    var mycanvas=document.getElementById("myCanvasTag");
    var mycontext=mycanvas.getContext('2d');
    var mygradient=mycontext.createRadialGradient(300,300,0,300,300,300);           
    mygradient.addColorStop("0","magenta");
    mygradient.addColorStop(".25","blue");
    mygradient.addColorStop(".50","green");
    mygradient.addColorStop(".75","yellow");
    mygradient.addColorStop("1.0","red");                
    mycontext.fillStyle=mygradient;
    mycontext.fillRect(0,0,400,400);
  }
</script>
</head>
<body>
<div style="margin-left:30px;">
<canvas id="myCanvasTag" width="400" height="400" style="border: 10px blue solid">
</canvas>
<br /><br />
<a href="index.html">back</a>
</div>
</body>
</html>
        

?

多個 canvas

一個 web 頁面能夠包含多個 canvas,每個 canvas 引用它們自己的獨特 JavaScript 上下文變量。結果,每個 canvas 都獨立于其他 canvas 工作。圖 6 展示了 4 個 canvas,每個 canvas 上的圖像都不同。

?
圖 6. 一個 web 頁面上的多個 canvas

清單 6 顯示了用于創建圖 6 中的頁面的代碼。注意,每個 canvas 都有一個惟一 ID 且每個上下文都是惟一的。

?
清單 6. 一個 web 頁面上的多個 canvas
          <!DOCTYPE html>
<html>
<head>
<title>HTML5 Canvas Demo</title>
<!--[if IE]>
  <script type="text/javascript" src="excanvas.js"></script>
<![endif]-->
<script>
  window.onload=function() {
    var mycontext1=document.getElementById("myCanvasTag1").getContext('2d');
    var mycontext2=document.getElementById("myCanvasTag2").getContext('2d');
    var mycontext3=document.getElementById("myCanvasTag3").getContext('2d');
    var mycontext4=document.getElementById("myCanvasTag4").getContext('2d');         
    // gradient 1
    var mygradient1=mycontext1.createLinearGradient(30,30,90,90);           
    mygradient1.addColorStop(0,"#FF0000");
    mygradient1.addColorStop(1,"#00FF00");
    mycontext1.fillStyle=mygradient1;
    mycontext1.fillRect(0,0,100,100);
    // gradient 2   
    var mygradient2=mycontext2.createLinearGradient(30,30,90,90);           
    mygradient2.addColorStop(1,"#FF0000");
    mygradient2.addColorStop(0,"#00FF00");
    mycontext2.fillStyle=mygradient2;
    mycontext2.fillRect(0,0,100,100);

    var mygradient3=mycontext3.createLinearGradient(30,30,90,90);           
    mygradient3.addColorStop(0,"#0000FF");
    mygradient3.addColorStop(.5,"#00FFDD");
    mycontext3.fillStyle=mygradient3;
    mycontext3.fillRect(0,0,100,100);

    var mygradient4=mycontext1.createLinearGradient(30,30,90,90);           
    mygradient4.addColorStop(0,"#DD33CC");
    mygradient4.addColorStop(1,"#EEEEEE");
    mycontext4.fillStyle=mygradient4;
    mycontext4.fillRect(0,0,100,100);
  }
</script>
</head>
<body>
<div style="margin-left:30px;">
<canvas id="myCanvasTag1" width="100" height="100" style="border: 10px blue solid">
</canvas>
<canvas id="myCanvasTag2" width="100" height="100" style="border: 10px green solid">
</canvas>
<br />
<canvas id="myCanvasTag3" width="100" height="100" style="border: 10px red solid">
</canvas>
<canvas id="myCanvasTag4" width="100" height="100" style="border: 10px black solid">
</canvas>
<br /><br />
<a href="index.html">back</a>
</div>
</body>
</html>
        

?

JavaScript 事件和動畫

本 文已經展示了可用于 canvas 的各種方法,每種方法都創建了一個可視結果。現在我們提高一個等級,看看 canvas 如何實現事件和動畫。JavaScript 能夠識別許多事件,包括在一個特定 web 頁面元素上方移動或懸停鼠標。JavaScript 語言能夠識別更多事件,下面的示例將使用其中幾個。

?

整合事件

圖 7 中的示例是使用前面清單中的方法創建的。現在我們添加幾個新技術。面部的鼻子、眼睛和圓形項目以及外部邊界都使用 arc 方法創建。眼睫毛被繪制為線條,嘴被創建為一條貝賽爾曲線。圖 7 還在 canvas 底部顯示了一些文本,這是使用 fillText 方法創建的。

?
圖 7. 使用 JavaScript 事件繪制一張正在眨眼的臉
一張正在眨眼的臉

清單 7 顯示圖 7 使用的代碼。

?
清單 7. 使用事件創建一個眨眼
          <!DOCTYPE html>
<html>
<head>
<title>HTML5 Canvas Demo</title>
<!--[if IE]>
  <script type="text/javascript" src="excanvas.js"></script>
<![endif]-->
<script>
window.onload=function() {
  var mycanvas=document.getElementById("myCanvasTag");
  var mycontext=mycanvas.getContext('2d');

  //draw face
  mycontext.beginPath();
  mycontext.arc(300, 250, 200, 0, Math.PI * 2, true);
  mycontext.closePath();
  mycontext.stroke();

  //draw left eye
  mycontext.beginPath();
  mycontext.arc(220, 150, 30, 0, Math.PI * 2, true);
  mycontext.closePath();
  mycontext.fillStyle='rgb(100,100,225)';
  mycontext.fill();

  //draw left iris
  mycontext.beginPath();
  mycontext.arc(220, 150, 10, 0, Math.PI * 2, true);
  mycontext.closePath();
  mycontext.fillStyle='rgb(0,0,0)';
  mycontext.fill();

  //draw left eyelid
  mycontext.beginPath();
  mycontext.arc(220, 150, 30, 0, Math.PI, true);
  mycontext.closePath();
  mycontext.fillStyle='rgb(200,200,200)';
  mycontext.fill();

  //draw left eyelashes
  mycontext.strokeStyle='rgb(0,0,0)';
  lashes(mycontext,198, 170, 193, 185);
  lashes(mycontext,208, 177, 204, 193);
  lashes(mycontext,220, 180, 220, 195);
  lashes(mycontext,232, 177, 236, 193);
  lashes(mycontext,242, 170, 247, 185);
  mycontext.stroke();

  openeye();

  //draw right eyelashes
  mycontext.strokeStyle='rgb(0,0,0)';
  lashes(mycontext, 358, 170, 353, 185);
  lashes(mycontext, 368, 177, 364, 193);
  lashes(mycontext, 380, 180, 380, 195);
  lashes(mycontext, 392, 177, 396, 193);
  lashes(mycontext, 402, 170, 407, 185);
  mycontext.stroke();

  //draw nose
  mycontext.beginPath();
  mycontext.arc(300, 250, 20, 0, Math.PI * 2, true);
  mycontext.closePath();
  mycontext.stroke();

  // draw smile
  mycontext.beginPath();
  mycontext.lineWidth = 10;
  mycontext.moveTo(180, 320);
  mycontext.bezierCurveTo(140, 320, 340, 420, 400, 360);
  mycontext.closePath();
  mycontext.stroke();

  //draw message at bottom
  mycontext.font="1em sans-serif";
  mycontext.fillStyle="rgb(0,0,0)";
  mycontext.fillText("Move the mouse over and off the canvas - the face winks!", 10, 480);
}

function lashes(cntx,x1,y1,x2,y2) {
  cntx.moveTo(x1,y1);
  cntx.lineTo(x2,y2);
}

function closeeye() {
  //close right eye
  var mycanvas=document.getElementById("myCanvasTag");
  var mycontext=mycanvas.getContext('2d');
  mycontext.beginPath();
  mycontext.arc(380, 150, 30, 0, Math.PI * 2, true);
  mycontext.closePath();
  mycontext.fillStyle='rgb(200,200,200)';
  mycontext.fill();
}

function openeye() {
  //open right eye
  var mycanvas=document.getElementById("myCanvasTag");
  var mycontext=mycanvas.getContext('2d');
  mycontext.beginPath();
  mycontext.arc(380, 150, 30, 0, Math.PI * 2, true);
  mycontext.closePath();
  mycontext.fillStyle='rgb(100,100,225)';
  mycontext.fill();
  //draw right iris
  mycontext.beginPath();
  mycontext.arc(380, 150, 10, 0, Math.PI * 2, true);
  mycontext.closePath();
  mycontext.fillStyle='rgb(0,0,0)';
  mycontext.fill();
  //draw right eyelid
  mycontext.beginPath();
  mycontext.arc(380, 150, 30, 0, Math.PI, true);
  mycontext.closePath();
  mycontext.fillStyle='rgb(200,200,200)';
  mycontext.fill();
}
</script>
</head>
<body>
<div style="margin-left:30px;">
<canvas id="myCanvasTag" width="600" height="500" style="border: 5px blue solid"
   onmouseover="closeeye()" onmouseout="openeye()"></canvas>
<br /><br />
<a href="index.html">back</a>
</div>
</body>
</html>
        

?

圖 7 中的臉通過一些 JavaScript 事件而改變。特別是, onmouseover onmouseout 事件分別用于調用 closeeye() openeye() 函數。這些函數不是 canvas 的方法,但是標準 JavaScript 函數。事件和函數之間的連接在 canvas 元素本身中進行。在 清單 7 中,頁面的主體區域接近代碼的底部,那是 canvas 所在的位置。canvas 標記內是:

          onmouseover="closeeye()" onmouseout="openeye()"
        

?

清單 7 中出現了一個新的構造 — beginPath() endPath() 的使用,它們用于明確區分獨立的復雜繪圖動作。封裝在其中的代碼繪制一個特殊的圖像,以分隔其他繪圖動作。

關于 清單 7 中的代碼的幾個值得注意的地方列示如下:

  • 當頁面打開時,通過調用 openeye() 函數來繪制右眼。
  • 使用 fillText 方法將文本寫到 canvas 上。
  • arc 方法中, MATH.PI * 2 創建了一個完整的圓圈,而 MATH.PI 將只創建一個半圓(例如,眼皮)。

?

動畫

JavaScript 打包了一個強大的編程利器。這種語言能夠執行很多操控,如 清單 8 所示。這個代碼重復運行,在 canvas 上繪制一些線條。線條顏色隨機設置。

?
清單 8. 使用 JavaScript 創建動畫
          <!DOCTYPE html>
<html>
<head>
<title>HTML5 Canvas Demo</title>
<!--[if IE]>
  <script type="text/javascript" src="excanvas.js"></script>
<![endif]-->
</head>
<body>
<div style="margin-left:30px;">
<canvas id="myCanvasTag" width="400" height="400" style="border: 10px blue solid">
</canvas>
<br /><br />
<a href="index.html">back</a>
</div>
<script>
  var mycanvas  = document.getElementById("myCanvasTag")
  var mycontext = mycanvas.getContext('2d');
  var x;
  var y;
  var x2;
  var y2;
  var r;
  var g;
  var b;
 function line() {
   x=Math.floor(Math.random()*190) + Math.floor(Math.random()*190);
   y=Math.floor(Math.random()*190) + Math.floor(Math.random()*190);
   x2=Math.floor(Math.random()*190) + Math.floor(Math.random()*190);
   y2=Math.floor(Math.random()*190) + Math.floor(Math.random()*190);
   r=Math.floor(Math.random()*255);
   g=Math.floor(Math.random()*255);
   b=Math.floor(Math.random()*255);
   mycontext.moveTo(x, y);
   mycontext.lineTo(x2, y2);
   mycontext.strokeStyle='rgb(' + r + ',' + g +  ',' + b + ')';  
   mycontext.lineWidth=Math.floor(Math.random()*6);      
   mycontext.stroke();
   mycontext.restore();
 }
 setInterval(line, 100);

</script>
</body>
</html>
        

?

圖 8 顯示了這個動畫的一張快照。清單 8 中的代碼與本文其他所有代碼示例都不同,因為 JavaScript 塊被放置到頁面底部,canvas 元素下方。這確保 canvas 在代碼運行之前就已經被呈現了。

?
圖 8. JavaScript 用于繪制無窮無盡的隨機線條

?

結束語

HTML5 被定位于用于改變 web 開發的面貌。新的元素使得頁面布局更簡單,支持通過瀏覽器存儲本地數據,擁有 canvas 之類的音頻、視頻和圖形平臺。隨著瀏覽器升級以支持更多新功能,web 的性質和用戶體驗將變得妙趣橫生。web 開發前景一片光明!

?

參考資料

學習

獲得產品和技術

討論

原文: http://www.ibm.com/developerworks/cn/web/wa-html5canvas/

?

?

使用 HTML5 canvas 繪制精美的圖形


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日日摸夜夜添夜夜 | 亚洲欧美日韩在线观看播放 | 丝袜中文字幕 | 亚洲精品无码国产爽快A片百度 | 色在线视频观看 | 久久国产乱子免费精品 | 久久精品2 | 波多野结衣 久久 | 在线观看国产情趣免费视频 | 亚洲欧美精品 | 久久91 | 97超级碰碰 | a在线v | 操久久 | 男女xx00xx的视频免费观看 | 国产精品第1页在线播放 | 成人精品国产 | 国产一级在线观看视频 | 18sexvideo | 欧美video巨大粗暴多人 | 天天插天天舔 | 欧洲一级毛片 | 特黄一区二区三区 | 午夜性色一区二区三区不卡视频 | 久久精品视频99 | 亚洲va国产va | 黄色免费在线观看 | 欧美综合中文字幕久久 | 国产精品国产三级国产aⅴ中文 | 国产成人毛片 | 亚洲欧美国产一区二区三区 | 国产精品久久国产精品 | 日韩1区 | 国产一区二区精品丝袜 | 久久性 | 久久久久久久 | 无限看片在线版免费视频大全 | 嫩草影院国产 | 人人舔人人爱 | 日本一区视频在线播放 | 99久久免费国产精品 |