MDN鏈接:https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Basic_usage
<div> <div class="prevnext" style="text-align: right;">
<p><a href="/zh-CN/docs/Web/API/Canvas_API/Tutorial" style="float: left;">« 上一頁</a><a href="/zh-CN/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes">下一頁 »</a></p>
<canvas>
元素
<canvas id="tutorial" width="150" height="150"></canvas>
<canvas>
看起來和 <img>
元素很相像,唯一的不同就是它並沒有 src 和 alt 屬性。實際上,<canvas>
標籤只有兩個屬性—— width
和height
。這些都是可選的,並且同樣利用 DOM properties 來設置。當沒有設置寬度和高度的時候,canvas會初始化寬度爲300像素和高度爲150像素。該元素可以使用CSS來定義大小,但在繪製時圖像會伸縮以適應它的框架尺寸:如果CSS的尺寸與初始畫布的比例不一致,它會出現扭曲。
注意: 如果你繪製出來的圖像是扭曲的, 嘗試用width和height屬性爲<canvas>明確規定寬高,而不是使用CSS。
id
屬性並不是<canvas>元素所特有的,而是每一個HTML元素都默認具有的屬性(比如class屬性)。給每個標籤都加上一個id屬性是個好主意,因爲這樣你就能在我們的腳本中很容易的找到它。
<canvas>元素可以像任何一個普通的圖像一樣(有margin
,border
,background
等等屬性)被設計。然而,這些樣式不會影響在canvas中的實際圖像。我們將會在一個專門的章節裏看到這是如何解決的。當開始時沒有爲canvas規定樣式規則,其將會完全透明。
替換內容
<canvas>元素與<img>
標籤的不同之處在於,就像<video>
,<audio>
,或者 <picture>
元素一樣,很容易定義一些替代內容。由於某些較老的瀏覽器(尤其是IE9之前的IE瀏覽器)或者文本瀏覽器不支持HTML元素"canvas",在這些瀏覽器上你應該總是能展示替代內容。
這非常簡單:我們只是在<canvas>標籤中提供了替換內容。不支持<canvas>的瀏覽器將會忽略容器並在其中渲染後備內容。而支持<canvas>的瀏覽器將會忽略在容器中包含的內容,並且只是正常渲染canvas。
舉個例子,我們可以提供對canvas內容的文字描述或者是提供動態生成內容相對應的靜態圖片,如下所示:
<canvas id="stockGraph" width="150" height="150">
current stock price: $3.15 +0.15
</canvas>
<canvas id="clock" width="150" height="150">
<img src="images/clock.png" width="150" height="150" alt=""/>
</canvas>
</canvas>
標籤不可省
與 <img>
元素不同,<canvas>
元素需要結束標籤(</canvas>
)。如果結束標籤不存在,則文檔的其餘部分會被認爲是替代內容,將不會顯示出來。
如果不需要替代內容,一個簡單的 <canvas id="foo" ...></canvas>
在所有支持canvas的瀏覽器中都是完全兼容的。
渲染上下文(The rendering context)
<canvas>
元素創造了一個固定大小的畫布,它公開了一個或多個渲染上下文,其可以用來繪製和處理要展示的內容。我們將會將注意力放在2D渲染上下文中。其他種類的上下文也許提供了不同種類的渲染方式;比如, WebGL 使用了基於OpenGL ES的3D上下文 ("experimental-webgl") 。
canvas起初是空白的。爲了展示,首先腳本需要找到渲染上下文,然後在它的上面繪製。<canvas>
元素有一個叫做 getContext()
的方法,這個方法是用來獲得渲染上下文和它的繪畫功能。getContext()
只有一個參數,上下文的格式。對於2D圖像而言,如本教程,你可以使用 CanvasRenderingContext2D
。
var canvas = document.getElementById('tutorial');
var ctx = canvas.getContext('2d');
代碼的第一行通過使用 document.getElementById()
方法來爲 <canvas>
元素得到DOM對象。一旦有了元素對象,你可以通過使用它的getContext() 方法來訪問繪畫上下文。
檢查支持性
替換內容是用於在不支持 <canvas>
標籤的瀏覽器中展示的。通過簡單的測試getContext()方法的存在,腳本可以檢查編程支持性
。上面的代碼片段現在變成了這個樣子:
var canvas = document.getElementById('tutorial');
if (canvas.getContext){
var ctx = canvas.getContext('2d');
// drawing code here
} else {
// canvas-unsupported code here
}
一個模板骨架
這裏的是一個最簡單的模板,我們之後就可以把它作爲之後的例子的起點。
注意: 爲了簡潔, 我們在HTML中內嵌了script元素, 但並不推薦這種做法。
<html>
<head>
<title>Canvas tutorial</title>
<script type="text/javascript">
function draw(){
var canvas = document.getElementById('tutorial');
if (canvas.getContext){
var ctx = canvas.getContext('2d');
}
}
</script>
<style type="text/css">
canvas { border: 1px solid black; }
</style>
</head>
<body onload="draw();">
<canvas id="tutorial" width="150" height="150"></canvas>
</body>
</html>
上面的腳本中包含一個叫做draw()的函數,當頁面加載結束的時候就會執行這個函數。通過使用在文檔上加載事件來完成。只要頁面加載結束,這個函數,或者像是這個的,同樣可以使用 window.setTimeout()
, window.setInterval()
,或者其他任何事件處理程序來調用。
模板看起來會是這樣。如這裏所示,它最初是空白的。
一個簡單例子
一開始,讓我們來看個簡單的例子,我們繪製了兩個有趣的長方形,其中的一個有着alpha透明度。我們將在接下來的例子裏深入探索一下這是如何工作的。
<html>
<head>
<script type="application/javascript">
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
ctx.fillStyle = "rgb(200,0,0)";
ctx.fillRect (10, 10, 55, 50);
ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
ctx.fillRect (30, 30, 55, 50);
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
例子看起來像是這樣::
Screenshot | Live sample |
---|---|