Canvas入門(mén)

<canvas>是一個(gè)可以使用腳本(通常為JavaScript)來(lái)繪制圖形的 HTML 元素.例如,它可以用于繪制圖表、制作圖片構(gòu)圖或者制作簡(jiǎn)單的(以及不那么簡(jiǎn)單的)動(dòng)畫(huà)。
<canvas> 標(biāo)簽只有兩個(gè)屬性—— width和height。這些都是可選的,并且同樣利用 DOMproperties 來(lái)設(shè)置。當(dāng)沒(méi)有設(shè)置寬度和高度的時(shí)候,canvas會(huì)初始化寬度為300像素和高度為150像素。

替換內(nèi)容

<canvas>元素與<img>標(biāo)簽的不同之處在于,就像<video>,<audio>,或者 <picture>元素一樣,很容易定義一些替代內(nèi)容。由于某些較老的瀏覽器(尤其是IE9之前的IE瀏覽器)或者文本瀏覽器不支持HTML元素"canvas",在這些瀏覽器上你應(yīng)該總是能展示替代內(nèi)容。

我們只是在<canvas>標(biāo)簽中提供了替換內(nèi)容。不支持<canvas>的瀏覽器將會(huì)忽略容器并在其中渲染后備內(nèi)容。而支持<canvas>的瀏覽器將會(huì)忽略在容器中包含的內(nèi)容,并且只是正常渲染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> 元素創(chuàng)造了一個(gè)固定大小的畫(huà)布,它公開(kāi)了一個(gè)或多個(gè)渲染上下文,其可以用來(lái)繪制和處理要展示的內(nèi)容。

canvas起初是空白的。為了展示,首先腳本需要找到渲染上下文,然后在它的上面繪制。<canvas> 元素有一個(gè)叫做 getContext() 的方法,這個(gè)方法是用來(lái)獲得渲染上下文和它的繪畫(huà)功能。getContext()只有一個(gè)參數(shù),上下文的格式。

var canvas = document.getElementById('id');
var ctx = canvas.getContext('2d');

第一行,得到DOM對(duì)象,使用getContext()方法來(lái)訪問(wèn)繪畫(huà)上下文。

檢查支持性

替換內(nèi)容是用于在不支持<canvas>標(biāo)簽的瀏覽器中展示的。通過(guò)簡(jiǎn)單的測(cè)試getContext()方法是否存在可以檢查編程支持性。

var canvas = document.getElementById('id');

if(canvas.getContex){
    var ctx = canvas.getContext('2d');
    // drawing code here
}else{
    //canvas-unsupported code here
}

繪制矩形


所有元素的位置都相對(duì)于原點(diǎn)定位。
canvas提供了三種方式繪制矩形。

fillRect(x,y,width,height)  繪制一個(gè)填充的矩形

strokeRect(x,y,width,height)    繪制一個(gè)矩形的邊框

clearRect(x,y,width,height) 清除指定矩形區(qū)域,讓清除部分完全透明

x與y指定了在canvas畫(huà)布上所繪制的矩形的左上角(相對(duì)于原點(diǎn))的坐標(biāo)。width和height設(shè)置矩形的尺寸。

繪制路徑

圖形的基本元素是路徑。路徑是通過(guò)不同顏色和寬度的線段或曲線相連形成的不同形狀的點(diǎn)的集合。一個(gè)路徑,甚至一個(gè)子路徑,都是閉合的。使用路徑繪制圖形需要一些額外的步驟。

  1. 首先,需要?jiǎng)?chuàng)建路徑起始點(diǎn)
  2. 使用畫(huà)圖命令去畫(huà)出路徑
  3. 把路徑封閉
  4. 通過(guò)描邊或填充路徑區(qū)域來(lái)渲染圖形
beginPath()

新建一條路徑,生成之后,圖形繪制命令被指向到路徑上生成路徑。

closePath()

閉合路徑之后圖形繪制命令又重新指向到上下文中。

stroke()

通過(guò)線條來(lái)繪制圖形輪廓

fill()

通過(guò)填充路徑的內(nèi)容區(qū)域生成實(shí)心的圖形。

生成路徑的第一步叫做beginPath()。本質(zhì)上,路徑是由很多子路徑構(gòu)成,這些子路徑都是在一個(gè)列表中,所有的子路徑構(gòu)成圖形。而每次這個(gè)方法調(diào)用之后,列表清空重置,然后就可以重新繪制新的圖形。

第二步就是調(diào)用函數(shù)指定繪制路徑。

第三步,閉合路徑colsePath(),不是必需的。這個(gè)方法會(huì)通過(guò)繪制一條從當(dāng)前點(diǎn)到開(kāi)始點(diǎn)的直線來(lái)閉合圖形。如果圖形已經(jīng)閉合,該函數(shù)什么也不做。
注:當(dāng)你調(diào)用fill()函數(shù)時(shí),所有沒(méi)有閉合的形狀都會(huì)自動(dòng)閉合,所以你不需要調(diào)用closePath()函數(shù)。但是調(diào)用stroke()時(shí)不會(huì)自動(dòng)閉合。

moveTo(x,y)

將筆觸移動(dòng)到指定的坐標(biāo)上。
當(dāng)canvas初始化或者beginPath()調(diào)用后,你通常會(huì)使用movTo()函數(shù)設(shè)置起點(diǎn)。

lineTo(x,y)

繪制一條從當(dāng)前位置到指定坐標(biāo)的直線

arc(x,y,radius,startAngle,endAngle,anticlockwise)

畫(huà)一個(gè)以(x,y)為圓心的以radius為半徑的圓弧,從startAngle開(kāi)始到endAngle結(jié)束(弧度=Math.PI/180*角度),按照anticlockwise給定的方向(默認(rèn)為false,順時(shí)針)生成。

貝塞爾曲線

一般用來(lái)繪制復(fù)雜有規(guī)律的圖形。


quadraticCurveTo(cp1x, cp1y, x, y)
繪制二次貝塞爾曲線,cp1x,cp1y為一個(gè)控制點(diǎn),x,y為結(jié)束點(diǎn)。

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
繪制三次貝塞爾曲線,cp1x,cp1y為控制點(diǎn)一,cp2x,cp2y為控制點(diǎn)二,x,y為結(jié)束點(diǎn)。

樣式和顏色

colors

fillStyle = color
設(shè)置圖形的填充顏色

strokeStyle = color
設(shè)置圖形輪廓的顏色

透明度

通過(guò)設(shè)置globalAlpha屬性或者使用一個(gè)半透明顏色作為輪廓或填充的樣式。
globalAlpha = transparencyValue
有效值范圍0.0到1.0. 默認(rèn)為1.0
ctx.globalAlpha = 0.1;

Line styles

lineWidth = value 線條寬度

lineCap = type 線條末端樣式


butt,round 和 square
默認(rèn)的為 butt 。它是與輔助線齊平的。中間的是 round 的效果,端點(diǎn)處加上了半徑為一半線寬的半圓。右邊的是 square 的效果,端點(diǎn)處加上了等寬且高度為一半線寬的方塊。

lineJoin = type 線條與線條間接合處的樣式


round, bevel 和 miter。默認(rèn)是 miter
最上面一條是 round 的效果,邊角處被磨圓了,圓的半徑等于線寬。中間和最下面一條分別是 bevel 和 miter 的效果。當(dāng)值是 miter 的時(shí)候,線段會(huì)在連接處外側(cè)延伸直至交于一點(diǎn)。

miterLimit = value 限制當(dāng)兩條線相交時(shí)交接處最大長(zhǎng)度;所謂交接處長(zhǎng)度(斜接長(zhǎng)度)是指線條交接處內(nèi)角頂點(diǎn)到外角頂點(diǎn)的長(zhǎng)度。
就如上一個(gè)例子所見(jiàn)的應(yīng)用 miter 的效果,線段的外側(cè)邊緣會(huì)延伸交匯于一點(diǎn)上。線段直接夾角比較大的,交點(diǎn)不會(huì)太遠(yuǎn),但當(dāng)夾角減少時(shí),交點(diǎn)距離會(huì)呈指數(shù)級(jí)增大。miterLimit 屬性就是用來(lái)設(shè)定外延交點(diǎn)與連接點(diǎn)的最大距離,如果交點(diǎn)距離大于此值,連接效果會(huì)變成了 bevel。

getLineDash() 返回一個(gè)包含當(dāng)前虛線樣式,長(zhǎng)度為非負(fù)偶數(shù)的數(shù)組。

setLineDash(segments) 設(shè)置當(dāng)前虛線樣式

lineDashOffset = value 設(shè)置虛線樣式的起始偏移量


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容