Canvas是HTML5最讓人期待的特性之一,目前已獲得大部分Web瀏覽器支援Canvas可以幫助建立遊戲、增強圖形使用者介面。下面YJBYS小編為大家帶來畫布Canvas基礎知識,希望對大家學習有所幫助!
HTML5規範引進了很多新特性,其中最令人期待的之一就是Canvas元素。HTML5 Canvas提供了通過JavaScript繪製圖形的方法,此方法使用簡單但功能強大。每一個Canvas元素都有一個“上下文(context)” (想象成繪圖板上的一頁),在其中可以繪製任意圖形。瀏覽器支援多個Canvas上下文,並通過不同的API提供圖形繪製功能。
大部分的瀏覽器都支援2D Canvas上下文——包括Opera,Firefox,Konqueror和Safari。而且某些版本的Opera還支援3D Canvas,Firefox也可以通過外掛形式支援 3D Canvas。
本文介紹主要介紹2D Canvas基礎以及如何使用基本Canvas函式,如線條、形狀、影象和文字等。為了理解此文章,你最好了解JavaScript基礎知識。
下面開始我們的講解:
canvas基礎
建立Canvas的方法很簡單,只需要在HTML頁面中新增元素就可以了:
rap: break-word !important; MAX-WIDTH: 100%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px">1 | < canvas id = "myCanvas" width = "300" height = "300" > |
為了能在JavaScript中引用Canvas,最好給它設定ID ;也需要給Canvas設定高度和寬度。
要在Canvas畫布中繪製圖形需要使用JavaScript。首先通過getElementById函式找到Canvas元素,然後初始化上下文,之後可以使用上下文API繪製各種圖形。下面的指令碼可以在Canvas中繪製一個矩形:
1 | var elem = lementById( 'myCanvas' ); |
3 | var context = ontext( '2d' ); |
可以把上面程式碼放置在文件head部分中,或者放在外部JavaScript檔案中。
2D context API
介紹瞭如何建立Canvas後,讓我們來看看2D Canvas API,看看能用這些函式做些什麼。
在上面的例子中,我們展示了繪製矩形是多麼簡單,而通過fillStyle和strokeStyle屬性可以更輕鬆的設定矩形的'填充和線條。顏色值使用方法和CSS一樣:十六進位制數、rgb()、rgba() 和hsla()。
通過fillRect可以繪製帶填充的矩形;使用strokeRect可以繪製只有邊框沒有填充的矩形。如果想清除部分Canvas可以使用 clearRect。上述三個方法的引數相同:x, y, width, height。前兩個引數設定 (x,y) 座標,後兩個引數設定矩形的高度和寬度。
下面將是一個綜合例項的JavaScript指令碼:
可以把上面程式碼放置在文件head部分中,或者放在外部JavaScript檔案中。
路徑
通過Canvas路徑(path)可以繪製任意形狀。可以先繪製輪廓,然後繪製邊框和填充。建立自定義形狀很簡單,使用beginPath()開始 繪製,然後使用直線、曲線和其他圖形繪製你的圖形。繪製完畢後呼叫fill和stroke即可新增填充或者設定邊框。呼叫 closePath()結束自定義圖形繪製。
下面是一個繪製三角的案例的JavaScript指令碼:
可以把上面程式碼放置在文件head部分中,或者放在外部JavaScript檔案中。
插入影象
drawImage方法允許在Canvas中插入其他影象(img和Canvas元素) 。在Opera中可以在Canvas中繪製SVG圖形。此方法比較複雜,可以有3個、5個或9個引數:
3個引數:最基本的drawImage使用方法。一個引數指定影象位置,另兩個引數設定影象在Canvas中的位置。
5個引數:中級的drawImage使用方法,包括上面所述3個引數,加兩個引數指明插入影象寬度和高度 (如果你想改變影象大小)。
9個引數:最複雜drawImage雜使用方法,包含上述5個引數外,另外4個引數設定源影象中的位置和高度寬度。這些引數允許你在顯示影象前動態裁剪源影象。
下面是上述三個使用方法的例子:
1 | Image(img_elem, dx, dy); |
2 | Image(img_elem, dx, dy, dw, dh); |
3 | Image(img_elem, sx, sy, sw, sh, dx, dy, dw, dh); |
可以把上面程式碼放置在文件head部分中,或者放在外部JavaScript檔案中。
畫素級操作
2D Context API提供了三個方法用於畫素級操作:createImageData,getImageData和putImageData。
ImageData物件儲存了影象畫素值。每個物件有三個屬性: width,height和data。data屬性型別為CanvasPixelArray,用於儲存width*height*4個畫素值。每一個畫素 有RGB值和透明度alpha值(其值為0至255,包括alpha在內。)。畫素的順序從左至右,從上到下,按行儲存。
來看一個例子:
1 | var imgd = teImageData(50,50); |
3 | for ( var i = 0; n = th, i < n; i += 4) { |
注意:不是所有瀏覽器都實現了createImageData。在支援的瀏覽器中,需要通過getImageData方法獲取ImageData物件。
通過ImageData可以完成很多功能。如可以實現影象濾鏡,或可以實現數學視覺化 (如分形和其他特效)。來看一個例項:
1 | var imgd = mageData(x, y width, height); |
3 | for ( var i = 0, n = th; i < n; i += 4) { |
4 | pix[i ] = 255 - pix[i ]; |
5 | pix[i+1] = 255 - pix[i+1]; |
6 | pix[i+2] = 255 - pix[i+2]; |
可以把上面程式碼放置在文件head部分中,或者放在外部JavaScript檔案中。
文字
雖然最近的WebKit版本和Firefox 3.1 nightly build才開始支援Text API,為了保證文章完整性我決定仍在這裡介紹文字API。
context物件可以設定以下text屬性:
font:文字字型,同CSS font-family屬性;
textAlign:文字水平對齊方式。可取屬性值: start,end,left,right,center。預設值:start;
textBaseline:文字豎直對齊方式。可取屬性值:top,hanging,middle,alphabetic,ideographic,bottom。預設值:alphabetic。
有兩個方法可以繪製文字:fillText和strokeText。第一個繪製帶fillStyle填充的文字,後者繪製只有 strokeStyle邊框的文字。兩者的引數相同:要繪製的文字和文字的位置(x,y)座標。還有一個可選選項——最大寬度。如果需要的話,瀏覽器會縮 減文字以讓它適應指定寬度。
文字對齊屬性影響文字與設定的(x,y)座標的相對位置。
2 | = 'italic 30px sans-serif' ; |
4 | Text ( 'Hello world!' , 0, 0); |
5 | = 'bold 30px sans-serif' ; |
6 | keText( 'Hello world!' , 0, 50); |
可以把上面程式碼放置在文件head部分中,或者放在外部JavaScript檔案中。
陰影
目前只有Konqueror和Firefox 3.1 nightly build支援Shadows API。API的屬性為:shadowColor:陰影顏色。其值和CSS顏色值一致。
shadowBlur:設定陰影模糊程度。此值越大,陰影越模糊。其效果和Photoshop的高斯模糊濾鏡相同。
shadowOffsetX和shadowOffsetY:陰影的x和y偏移量,單位是畫素。
4 | owColor = 'rgba(255, 0, 0, 0.5)' ; |
可以把上面程式碼放置在文件head部分中,或者放在外部JavaScript檔案中。
顏色漸變
除了CSS顏色, fillStyle和strokeStyle屬性可以設定為CanvasGradient物件。——通過CanvasGradient可以為線條和填充使用顏色漸變。
欲建立CanvasGradient物件,可以使用兩個方法:createLinearGradient和createRadialGradient。前者建立線性顏色漸變,後者建立圓形顏色漸變。
建立顏色漸變物件後,可以使用物件的addColorStop方法新增顏色中間值。
下面的程式碼演示了顏色漸變使用方法:
1 | var gradient1 = teLinearGradient(sx,sy,dx,dy); |
5 | var gradient2 = teRadialGradient(sx,sy,sr,dx,dy, dr); |
可以把上面程式碼放置在文件head部分中,或者放在外部JavaScript檔案中。