你想知道的canvas在這里(小白看過(guò)來(lái))

初識(shí)canvas


前段時(shí)間重新看了一下canvas橘茉,覺(jué)得很有意思,現(xiàn)在總結(jié)一下姨丈,只限于基礎(chǔ)的畅卓,中間有一些小的案例,說(shuō)的有一些啰嗦蟋恬,建議初學(xué)者參考翁潘,歡迎批評(píng)指正,共同進(jìn)步歼争!

首先拜马,我們來(lái)認(rèn)識(shí)一下,什么是canvas

一矾飞、Canvas定義:

通常用于繪制圖表一膨、動(dòng)畫(huà),通過(guò)腳本(javascript)來(lái)完成,?<canvas> 元素本身并沒(méi)有繪制能力(它僅僅是圖形的容器)

不支持canvas的瀏覽器頁(yè)面為空不顯示 (ie9以下)

可在canvas標(biāo)簽內(nèi)寫(xiě)p標(biāo)簽

<p>您的瀏覽器不支持canvas</p>

支持cnavas的瀏覽器將不識(shí)別此標(biāo)簽

二洒沦、Canvas使用方法:

創(chuàng)建一個(gè)畫(huà)布豹绪,在頁(yè)面中引入canvas標(biāo)簽, 默認(rèn)寬300px ?高 150px

<canvas? id="can" ></canvas>//默認(rèn)寬300px ?高 150px

設(shè)置畫(huà)布大小的方法:

1申眼、屬性width ?height 設(shè)置寬高瞒津,畫(huà)布上每個(gè)點(diǎn)都是一個(gè)像素

<canvas? id="can" width="800" height="800"></canvas>

那么問(wèn)題來(lái)了

是否可以在style里面修改畫(huà)布大小括尸?

不可以 巷蚪,畫(huà)布里面的內(nèi)容也會(huì)被縮放

獲取canvas畫(huà)布:

var oC = document.getElementById('can');

繪制繪圖環(huán)境

var cte = oC.getContext('2d');

設(shè)置繪制環(huán)境?:getContext(默認(rèn)的是2d的場(chǎng)景)?------方法可返回一個(gè)對(duì)象,該對(duì)象提供了用于在畫(huà)布上繪圖的方法和屬性濒翻。

繪制圖形

一 屁柏、繪制方塊

fillRect(X,Y,W,H): 默認(rèn)填充顏色是黑色

參數(shù):

X/Y:距離畫(huà)布的坐標(biāo)

W/H:矩形的寬高

var can = document.getElementById('can');//獲取畫(huà)布

var canT = can.getContext('2d');//繪制繪圖環(huán)境

canT.fillRect(10,10,100,100);//畫(huà)矩形

效果圖:

設(shè)置繪圖樣式? ? (繪制填充矩形要先設(shè)置樣式,再繪制)

fillStyle: 填充繪畫(huà)的顏色有送、漸變或模式

填充的矩形要設(shè)置lineJoin樣式(設(shè)置一個(gè)同坐標(biāo)的描邊矩形淌喻,設(shè)置描邊矩形的lineJoin樣式

var can = document.getElementById('can');

var canT = can.getContext('2d');

canT.fillStyle='#f40';//繪制填充矩形要先設(shè)置樣式,再繪制

canT.fillRect(10,10,100,100);

效果圖:

二雀摘,設(shè)置描邊矩形

strokeRect(X,Y,W,H): 帶邊框的方塊裸删,默認(rèn)一像素黑色邊框

參數(shù):

X/Y:距離畫(huà)布的坐標(biāo)

W/H:矩形的寬高

var can = document.getElementById('can');

var canT = can.getContext('2d');

canT.fillStyle='#f40';

canT.fillRect(10,10,100,100);

canT.strokeRect(150,10,100,100);

效果圖:


設(shè)置繪圖樣式? ( 繪制填充矩形要先設(shè)置樣式,再繪制)

a 繪圖環(huán)境.strokeStyle='顏色'

b 繪圖環(huán)境.lineWidth ='數(shù)值'

a繪圖環(huán)境.strokeStyle='顏色'

var can = document.getElementById('can');

var canT = can.getContext('2d');//畫(huà)圖的方法和屬性放在了這里

canT.fillStyle='#f40';

canT.fillRect(10,10,100,100);

canT.strokeStyle='#f40';繪制填充矩形要先設(shè)置樣式阵赠,再繪制

canT.strokeRect(150,10,100,100);

效果圖:


b 繪圖環(huán)境.lineWidth ='數(shù)值'

var can = document.getElementById('can');

var canT = can.getContext('2d');

canT.fillStyle='#f40';

canT.fillRect(10,10,100,100);

canT.lineWidth = '30';//線條寬度涯塔,設(shè)置在繪圖前

canT.strokeStyle='#f40';//線條顏色肌稻,設(shè)置在繪圖前

canT.strokeRect(150,10,100,100);

三、邊界繪制

lineJoin: 邊界連接點(diǎn)樣式? 設(shè)置在繪圖前

----miter? [?ma?t?r]? [?ma?t?(r)] 默認(rèn)匕荸,round(圓角)爹谭,bevel [?bevl]? [?bevl](斜角)

? canT.lineWidth = '30';//線條寬度,設(shè)置在繪圖前

? canT.strokeStyle='#f40';

? canT.lineJoin='round';//圓角每聪,設(shè)置在繪圖前

? canT.strokeRect(150,10,100,100);

效果圖:


canT.lineWidth = '30';//線條寬度旦棉,設(shè)置在繪圖前

canT.strokeStyle='#f40';

canT.lineJoin='bevel';//斜角角設(shè)置在繪圖前

canT.strokeRect(150,10,100,100);

效果圖:


四、繪制路徑

beginPath(): 開(kāi)啟一條新路徑

closePath(): 閉合當(dāng)前路徑

moveTo(x,y): 定義線條開(kāi)始坐標(biāo)

lineTo(x,y): 定義線條結(jié)束坐標(biāo)

stroke(): 畫(huà)線药薯,默認(rèn)黑色

? canT.beginPath();//開(kāi)啟一條新路徑

? canT.lineWidth = '30';//線條寬度,設(shè)置在繪圖前

? canT.moveTo(300,100);//定義線條開(kāi)始坐標(biāo)

? canT.lineTo(400,200);//定義線條結(jié)束坐標(biāo)

? canT.stroke();// 畫(huà)線救斑,默認(rèn)黑色

效果圖:


lineCap: 端點(diǎn)樣式

----butt(默認(rèn)), round(圓角)童本,square

fill(): 填充,默認(rèn)黑色

rect(): 矩形區(qū)域(x,y,w,h)

clearRect(x,y,width,height) 方法清空給定矩形內(nèi)的指定像素脸候。

lineCap: 端點(diǎn)樣式

----butt(默認(rèn)), round(圓角)穷娱,square

? canT.beginPath();//開(kāi)啟一條新路徑

? canT.lineWidth = '30';//線條寬度,設(shè)置在繪圖前

? canT.moveTo(300,100);//定義線條開(kāi)始坐標(biāo)

? canT.lineTo(400,200);//定義線條結(jié)束坐標(biāo)

? canT.lineCap = 'round';//端點(diǎn)圓角

? canT.stroke();// 畫(huà)線运沦,默認(rèn)黑色


canT.beginPath();//開(kāi)啟一條新路徑

canT.lineWidth = '30';//線條寬度泵额,設(shè)置在繪圖前

canT.moveTo(300,100);//定義線條開(kāi)始坐標(biāo)

canT.lineTo(400,200);//定義線條結(jié)束坐標(biāo)

canT.lineCap = 'square';//增加原長(zhǎng)度的1/2分到兩端

canT.stroke();// 畫(huà)線,默認(rèn)黑色

效果圖:


canT.beginPath();//開(kāi)啟一條新路徑

canT.lineWidth = '30';//線條寬度携添,設(shè)置在繪圖前? ? ?

canT.moveTo(300,100);//定義線條開(kāi)始坐標(biāo)

canT.lineTo(400,200);//定義線條結(jié)束坐標(biāo)

canT.lineCap = 'square';//增加元長(zhǎng)度的1/2分到兩端

canT.strokeStyle = 'red';//設(shè)置顏色

canT.fill();//填充顏色

canT.stroke();// 畫(huà)線嫁盲,默認(rèn)黑色

效果圖:


fill() 填充顏色

在用moveTo() lineTo()方法畫(huà)矩形時(shí)填充顏色使用,必須先設(shè)置顏色烈掠,fillStyle='顏色'羞秤,再用fill()填充

? ? canT.beginPath();//開(kāi)啟一條新路徑

? ? canT.lineWidth = '30';//線條寬度,設(shè)置在繪圖前? ? ?

? ? canT.moveTo(100,100);//定義線條開(kāi)始坐標(biāo)

? ? canT.lineTo(200,100);//定義線條結(jié)束坐標(biāo)

? ? canT.lineTo(200,200);

? ? canT.lineTo(100,200);

? ? canT.closePath();

? ? canT.lineCap = 'square';

? ? canT.fillStyle = 'red';//設(shè)置要填充的顏色

? canT.fill();//填充?

? canT.stroke();// 畫(huà)線左敌,默認(rèn)黑色

效果圖:


rect(): 矩形區(qū)域(x,y,w,h)

clearRect(x,y,width,height) 方法清空給定矩形內(nèi)的指

定像素羽戒。


canT.clearRect(0,0,150,160);

x: 要清除的矩形左上角的 x 坐標(biāo)

y:要清除的矩形左上角的 y 坐標(biāo)

width: 要清除的矩形的寬度

height: 要清除的矩形的高度


? ? ? // 畫(huà)矩形方法三:

? ? ? ? // cxt.beginPath();

? ? ? ? // cxt.rect(50,50,100,100);

? ? ? ? // cxt.fillStyle = 'red';

? ? ? ? // cxt.fill();

五.畫(huà)圓

arc(x,y,r,起始弧度踢匣,終止弧度,方向)

x/y: 圓心的坐標(biāo) 定義圓的位置

r:圓的半徑 定義圓的大小

弧度:Math.PI/180(一角度的弧度)

角度與弧度的轉(zhuǎn)換關(guān)系: 角度*Math.PI/180

方向:順時(shí)針(false 默認(rèn)值),逆時(shí)針(true)

canvas中畫(huà)圓起始位置為三點(diǎn)鐘方向 六點(diǎn)鐘方向?yàn)?0度届巩,九點(diǎn)鐘方向是+-180度,12點(diǎn)鐘方向?yàn)?90度

示意圖:


案例一:

cxt.arc(100,100,100 ,0,360*Math.PI/180,true);

cxt.stroke();

效果圖:


案例二:

90度扇形

? ? ? ? cxt.moveTo(100,100);

? ? ? ? cxt.arc(100,100,100 ,0,90*Math.PI/180,false);

? ? ? ? cxt.closePath();

? ? ? ? cxt.stroke();

效果圖


? ? ? ? cxt.moveTo(100,100);

? ? ? ? cxt.arc(100,100,100 ,0,90*Math.PI/180,true);

? ? ? ? cxt.closePath();

? ? ? ? cxt.stroke();


案例三

移動(dòng)的方塊

? ? num = 0;

? style = 100;

? setInterval(function(){

? cxt.clearRect(0,0,oc.width,oc.height);

? num ++; //改變位置

? style ++; //改變大小

? cxt.fillRect(num,num,style,style);

},100)



案例四:

畫(huà)扇形

120度? 設(shè)置描邊樣式朋譬,填充顏色樣式

cxt.moveTo(15,15,);

cxt.arc(150,150,150,0,120*Math.PI/180,false);

cxt.strokeStyle = '#f40';//設(shè)置描邊樣式

cxt.fillStyle = 'red';//填充顏色樣式

cxt.fill();//填充 填充顏色樣式

cxt.closePath();

cxt.stroke();


案例五:

canvasOnload

? ? var oc = document.getElementById('c1');

? ? var cxt = oc.getContext('2d');

? ? var num = 0;//定義變量

? ? var timer = setInterval(function(){

? ? cxt.clearRect(0,0,oc.width,oc.height);

? ? num+=10;//定義變化的角度 步頻

? ? cxt.beginPath();//開(kāi)始新路徑

? ? cxt.lineWidth = '6';//線寬

? ? cxt.strokeStyle ='#ccc';

? ? ? ? ? ? ? ? ? ? ? ? //起始弧度? ? ? ? ? ? //終止弧度

? ? cxt.arc(100,100,50,-90*Math.PI/180,(num+-90)*Math.PI/180,false);

? ? cxt.stroke();

? ? if(num>360){

? ? ? ? //當(dāng)圓環(huán)閉合時(shí)休蟹,清除定時(shí)器

? ? ? ? clearInterval(timer);

? ? }

? ? },50)

效果圖:


變換(平移 旋轉(zhuǎn) 縮放)

translate(x,y):

平移 可以重新定義畫(huà)布的(0,0)位置

默認(rèn)畫(huà)布(0,0)位置在畫(huà)布左上角

參數(shù):

x/y:x/y軸的偏移量

? ctx.fillRect(0,0,200,150);//未平移前

? ctx.translate(200,150);

? ctx.fillRect(0,0,200,150);


rotate(rad);

旋轉(zhuǎn)當(dāng)前圖形?

旋轉(zhuǎn)的參考角度為畫(huà)布的(0,0)位置

角度:angle

弧度:radian

參數(shù):

deg:旋轉(zhuǎn)角度 弧度計(jì)

弧度= 角度*Math.PI/180

ctx.rotate(45*Math.PI/180);//旋轉(zhuǎn) 寫(xiě)在繪制圖形前面

ctx.fillRect(0,0,100,50);


? ctx.fillRect(0,0,100,50);

? ctx.translate(200,150);//圖形的起始位置平移至(200,150)位置

? ctx.fillRect(0,0,100,50);


ctx.rotate(45*Math.PI/180);

ctx.fillRect(0,0,100,50);

ctx.translate(200,150);//圖形的起始位置平移至(200,150)位置

ctx.fillRect(0,0,100,50);


以物體中心旋轉(zhuǎn)

ctx.translate(50,25);//設(shè)位移量為寬高一半

ctx.rotate(45*Math.PI/180);

ctx.fillRect(-50,-25,100,50);//設(shè)填充點(diǎn)為寬高的-(1/2)


案例:

方塊旋轉(zhuǎn)

save(): 保存路徑

restore(): 恢復(fù)路徑

save()和restore(): 兩個(gè)配對(duì)使用,save方法用于臨時(shí)保存畫(huà)布的坐標(biāo)系統(tǒng)的狀態(tài)咬扇;restore方法用來(lái)恢復(fù)save之后保存的狀態(tài)甲葬。可以簡(jiǎn)單的理解為懈贺,save之后的一系列的操作经窖,比如translate和rotate等坡垫,在restore后,都會(huì)被釋放恢復(fù)到原來(lái)的狀態(tài)画侣。

var num =0;

ctx.translate(200,200);//定義畫(huà)布的起始(0冰悠,0)位置

var timer = setInterval(function(){

ctx.clearRect(-160,-160,oc.width,oc.height);//注意清除區(qū)域值

ctx.save();//保存路徑

num+=10;

ctx.rotate(num*Math.PI/180);

ctx.fillRect(-100,-100,200,200);

ctx.restore();//恢復(fù)路徑

},1000)


scale(x,y)放大

參數(shù):

x:代表水平放大的倍數(shù)

y:代表垂直放大的倍數(shù)

scale(1,1),默認(rèn)

scale(2,2)放大一倍

scale(0.5,0.5)縮小一半

案例

畫(huà)鐘表

第一步:畫(huà)出60個(gè)小格子代表分針/秒針刻度,每個(gè)刻度之間是6度

function toDrow(){

// 第一步:畫(huà)出60個(gè)小格子代表分針/秒針刻度,每個(gè)刻度之間是6度

// cxt.moveTo(200,200);

// cxt.arc(200,200,150,0,6*Math.PI/180,false);

// 整個(gè)鐘表一共360度,需要進(jìn)行60次配乱,用循環(huán)

? ? for(var i = 0; i < 60; i ++){

? ? cxt.moveTo(200,200);

? ? cxt.arc(200,200,150,i*6*Math.PI/180,(i+1)*6*Math.PI/180,false);

? ? cxt.stroke();

? ? //此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)60個(gè)閉合的扇形角度為6度

? ? ? ? }

? ? ? ? }

toDrow();

效果圖


function toDrow(){

// 第一步:畫(huà)出60個(gè)小格子代表分針/秒針刻度,每個(gè)刻度之間是6度

? // cxt.moveTo(200,200);

? // cxt.arc(200,200,150,0,6*Math.PI/180,false);

? // 整個(gè)鐘表一共360度溉卓,需要進(jìn)行60次,用循環(huán)

? ? cxt.beginPath();

? ? for(var i = 0; i < 60; i ++){

? ? ? cxt.moveTo(200,200);

? ? cxt.arc(200,200,150,i*6*Math.PI/180,(i+1)*6*Math.PI/180,false);

? ? cxt.stroke();

? ? cxt.closePath();

//此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)60個(gè)閉合的扇形角度為6度

? ? }

//第二步:畫(huà)遮罩層

? // 用一個(gè)圓覆蓋到之前畫(huà)出分鐘/秒鐘刻度盤(pán)上搬泥,圓心相同桑寨,

//半徑小于原刻盤(pán),制造出時(shí)中刻度的假象

? ? ? cxt.beginPath();

? ? ? cxt.fillStyle = '#fff';

? ? ? cxt.arc(200,200,140,0,360*Math.PI/180,false);

? ? ? cxt.fill();

? ? ? cxt.closePath();

}

效果圖:


function toDrow(){

// 第一步:畫(huà)出60個(gè)小格子代表分針/秒針刻度,每個(gè)刻度之間是6度

? // cxt.moveTo(200,200);

? // cxt.arc(200,200,150,0,6*Math.PI/180,false);

? // 整個(gè)鐘表一共360度忿檩,需要進(jìn)行60次尉尾,用循環(huán)

? ? cxt.beginPath();

? ? for(var i = 0; i < 60; i ++){

? ? ? cxt.moveTo(200,200);

? ? ? cxt.arc(200,200,150,i*6*Math.PI/180,(i+1)*6*Math.PI/180,false);

? ? ? cxt.stroke();

//此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)60個(gè)閉合的扇形角度為6度

? ? }

? ? cxt.beginPath();

//第二步:畫(huà)遮罩層

? // 用一個(gè)圓覆蓋到之前畫(huà)出分鐘/秒鐘刻度盤(pán)上,圓心相同燥透,半徑小于原刻盤(pán)沙咏,

//制造出時(shí)中刻度的假象

? ? ? cxt.beginPath();

? ? ? cxt.fillStyle = '#fff';

? ? ? cxt.arc(200,200,140,0,360*Math.PI/180,false);

? ? ? cxt.fill();

? ? ? cxt.closePath();

//? ? 第三步:畫(huà)時(shí)針刻度

? ? // 同分鐘,整個(gè)表盤(pán)的分鐘刻度也是360度班套,分12個(gè)肢藐,每個(gè)刻度為30

? ? // 一共有12個(gè)30度

? ? cxt.beginPath();

? ? for(var i = 0; i? < 12; i ++){

? ? ? cxt.moveTo(200,200);

? ? ? cxt.lineWidth = 3;

? ? ? cxt.arc(200,200,150,i*30*Math.PI/180,(i+1)*30*Math.PI/180,false);

? ? ? cxt.stroke();

//此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)12個(gè)閉合的扇形角度為30度? 線寬為3

? ? ? ? }

? ? ? ? cxt.closePath();

? ? ? ? }

toDrow();


function toDrow(){

// 第一步:畫(huà)出60個(gè)小格子代表分針/秒針刻度,每個(gè)刻度之間是6度

? // cxt.moveTo(200,200);

? // cxt.arc(200,200,150,0,6*Math.PI/180,false);

? // 整個(gè)鐘表一共360度,需要進(jìn)行60次吱韭,用循環(huán)

? ? cxt.beginPath();

? ? for(var i = 0; i < 60; i ++){

? ? ? cxt.moveTo(200,200);

? ? ? cxt.arc(200,200,150,i*6*Math.PI/180,(i+1)*6*Math.PI/180,false);

? ? ? cxt.stroke();

//此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)60個(gè)閉合的扇形角度為6度

? ? }

? ? cxt.beginPath();

//第二步:畫(huà)遮罩層

? // 用一個(gè)圓覆蓋到之前畫(huà)出分鐘/秒鐘刻度盤(pán)上吆豹,圓心相同,半徑小于原刻盤(pán)杉女,

//制造出時(shí)中刻度的假象

? ? ? cxt.beginPath();

? ? ? cxt.fillStyle = '#fff';

? ? ? cxt.arc(200,200,140,0,360*Math.PI/180,false);

? ? ? cxt.fill();

? ? ? cxt.closePath();

//? ? 第三步:畫(huà)時(shí)針刻度

? ? // 同分鐘瞻讽,整個(gè)表盤(pán)的分鐘刻度也是360度,分12個(gè)熏挎,每個(gè)刻度為30

? ? // 一共有12個(gè)30度

? ? cxt.beginPath();

? ? for(var i = 0; i? < 12; i ++){

? ? ? cxt.moveTo(200,200);

? ? ? cxt.lineWidth = 3;

? ? ? cxt.arc(200,200,150,i*30*Math.PI/180,(i+1)*30*Math.PI/180,false);

? ? ? cxt.stroke();

//此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)12個(gè)閉合的扇形角度為30度? 線寬為3

? ? ? ? }

? ? ? ? cxt.closePath();

? ? ? ? }

// 第四步:畫(huà)遮罩層

? ? //? 用一個(gè)圓覆蓋到之前畫(huà)出分鐘/秒鐘刻度盤(pán)上速勇,圓心相同,

? ? //? 半徑小于分鐘/秒鐘(原)遮罩層坎拐,制造出時(shí)中刻度的假象


? ? ? ? ? ? cxt.beginPath();

? ? ? ? ? ? cxt.fillStyle = '#fff';

? ? ? ? ? ? cxt.arc(200,200,130,0,360*Math.PI/180,false);

? ? ? ? ? ? cxt.fill();

? ? ? ? ? ? cxt.closePath();

? ? ? ? }

? ? ? ? toDrow();

效果圖:


? 第五步:畫(huà)時(shí)針?lè)轴樏脶槪ㄐ袆?dòng)軌跡)

? 圓心相同 半徑不同 烦磁,起始弧度和終止弧度相等

起始弧度與終止弧度的值有時(shí)間軸來(lái)決定

function toDrow(){

// 第一步:畫(huà)出60個(gè)小格子代表分針/秒針刻度,每個(gè)刻度之間是6度

? // cxt.moveTo(200,200);

? // cxt.arc(200,200,150,0,6*Math.PI/180,false);

? // 整個(gè)鐘表一共360度,需要進(jìn)行60次哼勇,用循環(huán)

? ? cxt.beginPath();

? ? for(var i = 0; i < 60; i ++){

? ? ? cxt.moveTo(200,200);

? ? ? cxt.arc(200,200,150,i*6*Math.PI/180,(i+1)*6*Math.PI/180,false);

? ? ? cxt.stroke();

//此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)60個(gè)閉合的扇形角度為6度

? ? }

? ? cxt.beginPath();

//第二步:畫(huà)遮罩層

? // 用一個(gè)圓覆蓋到之前畫(huà)出分鐘/秒鐘刻度盤(pán)上都伪,圓心相同,半徑小于原刻盤(pán)积担,

//制造出時(shí)中刻度的假象

? ? ? cxt.beginPath();

? ? ? cxt.fillStyle = '#fff';

? ? ? cxt.arc(200,200,140,0,360*Math.PI/180,false);

? ? ? cxt.fill();

? ? ? cxt.closePath();

//? ? 第三步:畫(huà)時(shí)針刻度

? ? // 同分鐘陨晶,整個(gè)表盤(pán)的分鐘刻度也是360度,分12個(gè),每個(gè)刻度為30

? ? // 一共有12個(gè)30度

? ? cxt.beginPath();

? ? for(var i = 0; i? < 12; i ++){

? ? ? cxt.moveTo(200,200);

? ? ? cxt.lineWidth = 3;

? ? ? cxt.arc(200,200,150,i*30*Math.PI/180,(i+1)*30*Math.PI/180,false);

? ? ? cxt.stroke();

//此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)12個(gè)閉合的扇形角度為30度? 線寬為3

? ? ? ? }

? ? ? ? cxt.closePath();

? ? ? ? }

// 第四步:畫(huà)遮罩層

? ? //? 用一個(gè)圓覆蓋到之前畫(huà)出分鐘/秒鐘刻度盤(pán)上先誉,圓心相同湿刽,

? ? //? 半徑小于分鐘/秒鐘(原)遮罩層,制造出時(shí)中刻度的假象


? ? ? ? ? ? cxt.beginPath();

? ? ? ? ? ? cxt.fillStyle = '#fff';

? ? ? ? ? ? cxt.arc(200,200,130,0,360*Math.PI/180,false);

? ? ? ? ? ? cxt.fill();

? ? ? ? ? ? cxt.closePath();

? ? ? ? ? ? // 第五步:畫(huà)時(shí)針?lè)轴樏脶槪ㄐ袆?dòng)軌跡)

? ? ? ? // 圓心相同 半徑不同 褐耳,起始弧度和終止弧度相等

? ? ? ? // 起始弧度與終止弧度的值有時(shí)間軸來(lái)決定

? ? ? ? ? ? // cxt.moveTo(200,200);

? ? ? ? ? ? // cxt.arc(200,200,150*0.5,起始弧度,終止弧度,false);

? ? ? ? ? ? // cxt.stroke();

? ? ? ? ? ? // 時(shí)針:最短最粗诈闺,

? ? ? ? cxt.beginPath();

? ? ? ? cxt.moveTo(200,200);

? ? ? ? cxt.lineWidth =4;

? ? ? ? cxt.arc(200,200,150*0.5,1,1,false);

? ? ? ? cxt.stroke();

? ? ? ? cxt.closePath();

? ? ? ? //? ? 畫(huà)分針

? ? cxt.beginPath();

? ? cxt.moveTo(200,200);

? ? cxt.lineWidth =3;

? ? cxt.arc(200,200,150*0.7,3,3,false);

? ? cxt.stroke();

? ? cxt.closePath();

? ? ? ? }

? ? ? ? toDrow();

效果圖:


// 第六步:

設(shè)置在前邊

// 想要讓時(shí)分秒的顯示和真實(shí)時(shí)間一致

// a:分別時(shí)間的時(shí)分秒

// B:讓時(shí)分秒針的位置同一

// c:將函數(shù)放入定時(shí)器,每1000ms執(zhí)行一次

// 當(dāng)時(shí)間不為整點(diǎn)時(shí)铃芦,時(shí)針在兩個(gè)數(shù)之間雅镊,此時(shí)需要將時(shí)針的位置加上偏移量

var timer = new Date();

ar tH = timer.getHours();//獲取小時(shí)

var tM = timer.getMinutes();//獲取分鐘

var tS = timer.getSeconds();//獲取秒

// 時(shí)針轉(zhuǎn)弧度

// a: 每一個(gè)格代表30度,時(shí)鐘和canvas的起始弧度相差90度刃滓,

// b: 當(dāng)時(shí)間不為整點(diǎn)時(shí)需將偏移量加上

// eg:10:30分仁烹,時(shí)針在10-11正中間,一個(gè)格式2咧虎,判斷分鐘里有幾個(gè)2

var tHVal = (30*tH-90+tM/2)*Math.PI/180;

// 分針轉(zhuǎn)弧度

// 每一個(gè)格代表6度晃危,時(shí)鐘和canvas的起始弧度相差90度,

var tMVal =(6*tM-90)*Math.PI/180;

// 秒針轉(zhuǎn)弧度

//? 每一個(gè)格代表6度老客,時(shí)鐘和canvas的起始弧度相差90度,

var tSVal =(6*tS-90)*Math.PI/180;

//? 第七步:

// 將時(shí)分秒的弧度值替換

function toDrow(){

// 第六步:

// 想要讓時(shí)分秒的顯示和真實(shí)時(shí)間一致

// a:分別時(shí)間的時(shí)分秒

// B:讓時(shí)分秒針的位置同一

// c:將函數(shù)放入定時(shí)器震叮,每1000ms執(zhí)行一次

// 當(dāng)時(shí)間不為整點(diǎn)時(shí)胧砰,時(shí)針在兩個(gè)數(shù)之間,此時(shí)需要將時(shí)針的位置加上偏移量

? var timer = new Date();

? var tH = timer.getHours();//獲取小時(shí)

? var tM = timer.getMinutes();//獲取分鐘

? var tS = timer.getSeconds();//獲取秒

// 將時(shí)分秒轉(zhuǎn)換為弧度

// 時(shí)針轉(zhuǎn)弧度

// a: 每一個(gè)格代表30度苇瓣,時(shí)鐘和canvas的起始弧度相差90度尉间,

// b: 當(dāng)時(shí)間不為整點(diǎn)時(shí)需將偏移量加上

// eg:10:30分,時(shí)針在10-11正中間击罪,一個(gè)格式2哲嘲,判斷分鐘里有幾個(gè)2

? var tHVal = (30*tH-90+tM/2)*Math.PI/180;

// 分針轉(zhuǎn)弧度

? // 每一個(gè)格代表6度眠副,時(shí)鐘和canvas的起始弧度相差90度,

? ? var tMVal =(6*tM-90)*Math.PI/180;

// 秒針轉(zhuǎn)弧度

//? 每一個(gè)格代表6度,時(shí)鐘和canvas的起始弧度相差90度荣德,

? ? var tSVal =(6*tS-90)*Math.PI/180;

//? 第七步:

? // 將時(shí)分秒的弧度值替換

// 第一步:畫(huà)出60個(gè)小格子代表分針/秒針刻度,每個(gè)刻度之間是6度

? // cxt.moveTo(200,200);

? // cxt.arc(200,200,150,0,6*Math.PI/180,false);

? // 整個(gè)鐘表一共360度,需要進(jìn)行60次台谊,用循環(huán)

? ? cxt.beginPath();

? ? for(var i = 0; i < 60; i ++){

? ? ? cxt.moveTo(200,200);

? ? ? cxt.arc(200,200,150,i*6*Math.PI/180,(i+1)*6*Math.PI/180,false);

? ? ? cxt.stroke();

//此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)60個(gè)閉合的扇形角度為6度

? ? }

? ? cxt.beginPath();

//第二步:畫(huà)遮罩層

? // 用一個(gè)圓覆蓋到之前畫(huà)出分鐘/秒鐘刻度盤(pán)上屉凯,圓心相同绰筛,半徑小于原刻盤(pán),

//制造出時(shí)中刻度的假象

? ? ? cxt.beginPath();

? ? ? cxt.fillStyle = '#fff';

? ? ? cxt.arc(200,200,140,0,360*Math.PI/180,false);

? ? ? cxt.fill();

? ? ? cxt.closePath();

//? ? 第三步:畫(huà)時(shí)針刻度

? ? // 同分鐘描融,整個(gè)表盤(pán)的分鐘刻度也是360度铝噩,分12個(gè),每個(gè)刻度為30

? ? // 一共有12個(gè)30度

? ? cxt.beginPath();

? ? for(var i = 0; i? < 12; i ++){

? ? ? cxt.moveTo(200,200);

? ? ? cxt.lineWidth = 3;

? ? ? cxt.arc(200,200,150,i*30*Math.PI/180,(i+1)*30*Math.PI/180,false);

? ? ? cxt.stroke();

//此時(shí) 將出現(xiàn)一個(gè)圓盤(pán)上出現(xiàn)12個(gè)閉合的扇形角度為30度? 線寬為3

? ? ? ? }

? ? ? ? cxt.closePath();

? ? ? ? }

// 第四步:畫(huà)遮罩層

? ? //? 用一個(gè)圓覆蓋到之前畫(huà)出分鐘/秒鐘刻度盤(pán)上窿克,圓心相同骏庸,

? ? //? 半徑小于分鐘/秒鐘(原)遮罩層,制造出時(shí)中刻度的假象


? ? ? ? ? ? cxt.beginPath();

? ? ? ? ? ? cxt.fillStyle = '#fff';

? ? ? ? ? ? cxt.arc(200,200,130,0,360*Math.PI/180,false);

? ? ? ? ? ? cxt.fill();

? ? ? ? ? ? cxt.closePath();

? ? ? ? ? ? // 第五步:畫(huà)時(shí)針?lè)轴樏脶槪ㄐ袆?dòng)軌跡)

? ? ? ? // 圓心相同 半徑不同 年叮,起始弧度和終止弧度相等

? ? ? ? // 起始弧度與終止弧度的值有時(shí)間軸來(lái)決定

? ? ? ? ? ? // cxt.moveTo(200,200);

? ? ? ? ? ? // cxt.arc(200,200,150*0.5,起始弧度,終止弧度,false);

? ? ? ? ? ? // cxt.stroke();

? ? ? ? ? ? // 時(shí)針:最短最粗具被,

? ? ? ? cxt.beginPath();

? ? ? ? cxt.moveTo(200,200);

? ? ? ? cxt.lineWidth =4;

? ? ? ? cxt.arc(200,200,150*0.5,tHVal,tHVal,false);

? ? ? ? cxt.stroke();

? ? ? ? cxt.closePath();

? ? ? ? //? ? 畫(huà)分針

? ? cxt.beginPath();

? ? cxt.moveTo(200,200);

? ? cxt.lineWidth =3;

? ? cxt.arc(200,200,150*0.7,tMVal,tMVal,false);

? ? cxt.stroke();

? ? cxt.closePath();

? ? //? ? 畫(huà)秒針

? ? cxt.beginPath();

? ? cxt.moveTo(200,200);

? ? cxt.lineWidth =2;

? ? cxt.arc(200,200,150*0.7,tSVal,tSVal,false);

? ? cxt.stroke();

? ? cxt.closePath();

? ? ? ? }

? ? ? ? toDrow();

? ? ? ? //定時(shí)器

etInterval(toDrow,1000);

插入圖片

cxt.drawImage(obj,x,y)

參數(shù):

三個(gè)參數(shù)

1.obj:要插入的圖片對(duì)象

2.x/y:代表插入圖片在畫(huà)布上的位置(x,y)

語(yǔ)法:

cxt.drawImage(obj,x,y)

五個(gè)參數(shù)的是時(shí)候

cxt.drawImage(obj,x,y,w,h)

w/h:代表在畫(huà)布上定位圖片并設(shè)置照片的大小

不設(shè)置寬高只损,默認(rèn)為圖片自身寬高

九個(gè)參數(shù)代表

? ? ? cxt.drawImage(obj,sx,sy,sw,sh,x,y,w,h)

sx/sy: 要剪切圖片的位置

sw/sh:剪切的大小

x/y:在畫(huà)布的位置

w/h:圖片的大小

createPattern(obj,是否重復(fù)):設(shè)置背景

? repeat:默認(rèn)重復(fù)

? repeat-x:x軸重復(fù)

? repeat-y:y軸重復(fù)

? no-repeat:不重復(fù)

window.onload = function(){

? ? ? ? ? ? var oC = document.getElementById('c1');

? ? ? ? ? ? var cxt = oC.getContext('2d');

? ? ? ? ? ? //創(chuàng)建圖片對(duì)象

? ? ? ? ? ? var oImg = new Image();

? ? ? ? ? ? //圖片路徑

? ? ? ? ? ? oImg .src = 'img/life.jpg';

? ? ? ? ? ? //當(dāng)圖片加載完成以后執(zhí)行操作

? ? ? ? ? ? oImg.onload = function(){

? ? ? ? ? ? ? ? //圖片插入canvas畫(huà)布中

? ? ? ? ? ? ? ? cxt.drawImage(oImg,50,80)

? ? ? ? ? ? }

? ? ? ? }

效果


平鋪:

window.onload = function(){

? ? ? ? ? ? var oC = document.getElementById('c1');

? ? ? ? ? ? var cxt = oC.getContext('2d');

? ? ? ? ? ? //創(chuàng)建圖片對(duì)象

? ? ? ? ? ? var oImg = new Image();

? ? ? ? ? ? //圖片路徑

? ? ? ? ? ? oImg .src = 'img/life.jpg';

? ? ? ? ? ? //當(dāng)圖片加載完成以后執(zhí)行操作

? ? ? ? ? ? oImg.onload = function(){

? ? ? ? ? ? ? ? //圖片插入canvas畫(huà)布中

? ? ? ? ? ? ? ? cxt.drawImage(oImg,0,0);

? ? ? ? ? ? ? ? var bg = cxt.createPattern(oImg,'repeat');

? ? ? ? ? ? ? ? //createPattern(obj,是否重復(fù)):設(shè)置背景

? ? ? ? ? ? ? ? ? //repeat:默認(rèn)重復(fù)

? ? ? ? ? ? ? ? ? //repeat-x:x軸重復(fù)

? ? ? ? ? ? ? ? ? // repeat-y:y軸重復(fù)

? ? ? ? ? ? ? ? ? // no-repeat:不重復(fù)

? ? ? ? ? ? ? cxt.fillStyle = bg;

? ? ? ? ? ? ? cxt.fillRect(0,0,oC.width,oC.height);

? ? ? ? ? ? }

? ? ? ? }

效果:


剪裁:(剪裁圖片不能設(shè)置平鋪效果

window.onload = function(){

? ? ? ? ? ? var oC = document.getElementById('c1');

? ? ? ? ? ? var cxt = oC.getContext('2d');

? ? ? ? ? ? //創(chuàng)建圖片對(duì)象

? ? ? ? ? ? var oImg = new Image();

? ? ? ? ? ? //圖片路徑

? ? ? ? ? ? oImg .src = 'img/life.jpg';

? ? ? ? ? ? //當(dāng)圖片加載完成以后執(zhí)行操作

? ? ? ? ? ? oImg.onload = function(){

? ? ? ? ? ? ? ? //圖片插入canvas畫(huà)布中

? ? ? ? ? ? ? ? //cxt.drawImage(obj,sx,sy,sw,sh,x,y,w,h)

? ? ? ? ? ? ? ? //sx/sy: 要剪切圖片的位置

? ? ? ? ? ? ? ? //sw/sh:剪切的大小一姿,這個(gè)區(qū)域的圖片舍棄

? ? ? ? ? ? ? ? //x/y:在畫(huà)布的位置

? ? ? ? ? ? ? ? // w/h:圖片的大小

? ? ? ? ? ? ? ? cxt.drawImage(oImg,30,50,100,200,200,100,200,200);


? ? ? ? ? ? }

? ? ? ? }

效果:


案例:

圖片旋轉(zhuǎn):

分析:

第一步:

向畫(huà)布插入圖片

var oImg = new Image();//調(diào)用方法

oImg.src = "img/life.jpg";//圖片路徑

//設(shè)置canvas畫(huà)布與圖片大小一致

? oImg.onload = function() {//圖片預(yù)加載,當(dāng)圖片加載完成再執(zhí)行canvas

? ? ? ? ? ? cxt.drawImage(oImg,0,0,500,300);

? ? ? ? }

第二步:

設(shè)置旋轉(zhuǎn)角度

window.onload = function(){

????????var aInput = document.getElementsByTagName

? ? ? ? ("input");

? ? ? ? var oC = document.getElementById("c1");

? ? ? ? var cxt = oC.getContext("2d");

????????var? i = 0;

? ? ? ? var iNow = 0;

? ? ? ? // 向畫(huà)布插入圖片

? ? ? ? var oImg = new Image();

? ? ? ? oImg.src = "img/life.jpg";

? ? ? ? oImg.onload = function() {

? ? ? ? ? ? cxt.drawImage(oImg,0,0,500,300);

? ? ? ? }

????????// switch? 語(yǔ)句開(kāi)始

? ? ? ? aInput[0].onclick = function() {

? ? ? ? ? ? if(iNow==0) {

? ? ? ? ? ? ? ? iNow = 3;

? ? ? ? ? ? }

? ? ? ? ? ? else {

? ? ? ? ? ? ? ? iNow--;

? ? ? ? ? ? }

? ? ? ? ? toRotate();

? ? ? ? }

? ? ? ? aInput[1].onclick = function() {

? ? ? ? ? ? // 執(zhí)行順時(shí)針旋轉(zhuǎn)圖片

? ? ? ? ? ? // 當(dāng)i= 1 第一次旋轉(zhuǎn) 旋轉(zhuǎn)90度

? ? ? ? ? ? if(iNow==3) {

? ? ? ? ? ? ? ? iNow = 0;

? ? ? ? ? ? }

? ? ? ? ? ? else {

? ? ? ? ? ? ? ? iNow++;

? ? ? ? ? ? }

? ? ? ? ? toRotate();

? ? ? ? }

? ? ? ? function toRotate() {

? ? ? ? ? ? switch(iNow) {

? ? ? ? ? ? ? ? case 1:

? ? ? ? ? ? ? ? ? ? oC.width = oImg.height;

? ? ? ? ? ? ? ? ? ? oC.height = oImg.width;

? ? ? ? ? ? ? ? ? ? cxt.rotate(90*Math.PI/180);

? ? ? ? ? ? ? ? ? ? cxt.drawImage(oImg,0,-oImg.height);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? case 2:

? ? ? ? ? ? ? ? ? ? oC.width = oImg.width;

? ? ? ? ? ? ? ? ? ? oC.height = oImg.height;

? ? ? ? ? ? ? ? ? ? cxt.rotate(180*Math.PI/180);

? ? ? ? ? ? ? ? ? ? cxt.drawImage(oImg,-oImg.width,-oImg.height);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? case 3:

? ? ? ? ? ? ? ? ? ? oC.width = oImg.height;

? ? ? ? ? ? ? ? ? ? oC.height = oImg.width;

? ? ? ? ? ? ? ? ? ? cxt.rotate(270*Math.PI/180);

? ? ? ? ? ? ? ? ? ? cxt.drawImage(oImg,-oImg.width,0);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? case 0:

? ? ? ? ? ? ? ? ? ? oC.width = oImg.width;

? ? ? ? ? ? ? ? ? ? oC.height = oImg.height;

? ? ? ? ? ? ? ? ? ? cxt.rotate(0*Math.PI/180);

? ? ? ? ? ? ? ? ? ? cxt.drawImage(oImg,0,0);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }


? ? ? ? }

漸變

A: 創(chuàng)建線性漸變

creatLinearGradient(x1,y1,x2,y2)

? 參數(shù)

? x1:起始坐標(biāo)x軸

? y1:起始坐標(biāo)y軸

? x2: 終止坐標(biāo)x軸

? y2:終止坐標(biāo)y軸

? 給漸變對(duì)象添加顏色 addColorStop()

? ? 接收兩個(gè)參數(shù)

? ? 第一個(gè)參數(shù) 規(guī)定漸變的位置

? ? 第二個(gè)參數(shù) 漸變的顏色

? ? 語(yǔ)法: addColorStop(0,'red');

// A實(shí)例

? ? ? ? //創(chuàng)建漸變對(duì)象

? ? ? ? var grad = cxt.createLinearGradient(100,100,300,300);

? ? ? ? // 給漸變對(duì)象添加顏色

? ? ? ? grad.addColorStop(0,'#f00');

? ? ? ? grad.addColorStop(0.3,'#e12');

? ? ? ? grad.addColorStop(1,'#f1e');

? ? ? ? // 將漸變對(duì)象賦值給fillStyle并創(chuàng)建一圖形

? ? ? ? cxt.fillStyle = grad;

? ? ? ? cxt.fillRect(0,0,oC.width,oC.height);

效果:


B:創(chuàng)建徑向漸變? createRadialGradient(x1,y1,r1,x2,y2,r2) x1/y1:起始位置坐標(biāo)

x2/y2:結(jié)束位置坐標(biāo)

r1/r2: 開(kāi)始結(jié)束的半徑

? ? // 創(chuàng)建一個(gè)徑向漸變

? ? var? grad = cxt.createRadialGradient(200,200,50,200,200,100) ;

? ? // 給徑向漸變對(duì)象添加顏色

? ? grad.addColorStop(0,'purple');

? ? grad.addColorStop(1,'blue');

? ? // 把樣式賦值給fillStyle

? ? cxt.fillStyle = grad;

? ? // 創(chuàng)建一個(gè)圖形

? ? cxt.fillRect(0,0,oC.width,oC.height);


文本

cxt.strokeText('文本內(nèi)容',x,y);

參數(shù):

x,y:文本位置坐標(biāo)

cxt.fillText('明天',200,300)跃惫;

var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

cxt.fillText('明天',200,300);

效果;


var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

cxt.fillStyle ='yellow';//字體顏色

cxt.fillText('明天',200,300);

效果:


var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

cxt.fillStyle ='yellow';

cxt.font = 'italic bold 100px? impact';//字體 傾斜加粗字號(hào)100px

cxt.fillText('明天',200,300);

效果:


var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

cxt.strokeText('你好',200,300);

效果:


var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

cxt.strokeStyle=‘orange';

cxt.strokeText('你好',200,300);

效果:


var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

cxt.strokeStyle=‘orange';

cxt.font = 'italic bold 100px? impact';//字體 傾斜加粗字號(hào)100px

cxt.strokeText('你好',200,300);

效果:


var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

cxt.strokeStyle='orange';

cxt.font = 'italic bold 100px? impact';//字體 傾斜加粗字號(hào)100px

cxt.strokeText('你好',100,100);

cxt.fillStyle ='yellow';

cxt.fillText('明天',200,300);

效果:


var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

var? grad = cxt.createLinearGradient(250,300,400,500);

grad.addColorStop(0,'#fc3');

? ? ? ? ? ? grad.addColorStop(0.3,'#12fc');

? ? ? ? ? ? grad.addColorStop(1,'#10fc');

? ? ? ? ? ? cxt.font = 'italic bold 100px? impact';

? ? ? ? ? ? cxt.fillStyle = grad;

? ? ? ? ? ? cxt.fillText('明天',200,300)

效果:


var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

cxt.strokeStyle='orange';

cxt.font = 'italic bold 100px? impact';//字體 傾斜加粗字號(hào)100px

var? grad = cxt.createRadialGradient(100,100,100,150,150,200);

// 給徑向漸變對(duì)象添加顏色

grad.addColorStop(0,'#fc3');

grad.addColorStop(0.3,'#12fc');

grad.addColorStop(1,'#10fc');

cxt.strokeText('你好',100,100);

cxt.fillText('明天',200,300);

var? grad = cxt.createRadialGradient(100,100,100,150,150,200);

// 給徑向漸變對(duì)象添加顏色

grad.addColorStop(0,'#fc3');

grad.addColorStop(0.3,'#12fc');

grad.addColorStop(1,'#10fc');

// 把樣式賦值給fillStyle

cxt.strokeStyle = grad;

cxt.strokeText('你好',100,100);

效果:


陰影

創(chuàng)建陰影

cxt.shadowOffsetX:陰影x軸偏移量 叮叹,

可以為負(fù)值,正值向右爆存,負(fù)值向左偏移

cxt.shadowOffsetY:陰影x軸偏移量 衬横,

可以為負(fù)值,正值向下终蒂,負(fù)值向上偏移

cxt.shadowBlur:陰影的模糊值,值越大,

模糊度越強(qiáng)

cxt.shadowColor:陰影的顏色

var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

cxt.shadowOffsetX ='20';//陰影x軸偏移量

cxt.shadowOffsetY = '10'//陰影x軸偏移量

cxt.shadowBlur = '10';//陰影的模糊值

cxt.shadowColor ='red';//陰影的顏色

cxt.fillRect(100,100,100,100);

效果:


var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

var? grad = cxt.createRadialGradient(100,100,100,150,150,200);

// 給徑向漸變對(duì)象添加顏色

grad.addColorStop(0,'#fc3');

grad.addColorStop(0.3,'#12fc');

grad.addColorStop(1,'#10fc');

cxt.shadowOffsetX ='20';

cxt.shadowOffsetY = '10'

cxt.shadowBlur = '10';

cxt.shadowColor ='red'

// 把樣式賦值給fillStyle

cxt.strokeStyle = grad;

cxt.strokeText('你好',100,100);


像素:

oCxt.getImageData(x,y,w,h);

返回一個(gè)圖像對(duì)象遥诉,這個(gè)對(duì)象包含了這個(gè)圖像的像素信息

參數(shù):

x/y:獲取像素點(diǎn)的坐標(biāo)位置

w/h:獲取圖像的寬高

createImageData(w,h)創(chuàng)建圖像

參數(shù):

w:創(chuàng)建圖像的寬

h:創(chuàng)建圖像的高?

putImageData(imgData,x,y,w,h)將像素放入畫(huà)布中拇泣、

參數(shù):創(chuàng)建的像素

x/y:像素坐標(biāo)

w/h:像素大小

練習(xí):創(chuàng)建一個(gè)100*100的圖像 ,紅色矮锈,255,0,,0,255

? var oC = document.getElementById('c1');

? var oCxt = oC.getContext('2d');

? var imgData = oCxt.createImageData(100,100);

? for(var? i =0; i<imgData.data.length;i++){

// 把每個(gè)像素的四個(gè)值都要賦值成紅色對(duì)應(yīng)的rgba

? ? ? ? //rgba? 紅綠藍(lán)透明度 每4個(gè)值代表一個(gè)像素

? ? ? ? imgData.data[4*i]='255';

? ? ? ? imgData.data[4*i+1]='0';

? ? ? ? imgData.data[4*i+2]='0';

? ? ? ? imgData.data[4*i+3]='255';


? ? ? ? }

? ? ? ? //放入畫(huà)布

? oCxt.putImageData(imgData,200,200)

效果:


measure:

? measureText();

? 語(yǔ)法:mearsureText('測(cè)量的文本').wdith;

? ? ? ? 測(cè)量文本的寬度/密度

? ? ? ? 把文字水平居中的方式

? ? ? ? x軸坐標(biāo)(畫(huà)布的寬- 字體的寬)/2

練習(xí):將‘往后余生’水平居中

var oC = document.getElementById('c1');

var cxt = oC.getContext('2d');

var str? = '往后余生';

cxt.font ='bold 100px impact';

var cX = (oC.width - cxt.measureText(str).width)/2;

cxt.fillText(str,cX,100);

效果:


至此霉翔,canvas的一些知識(shí)也介紹的差不多了,中間有一些案例供大家參考苞笨,說(shuō)的有些啰嗦债朵,適合初學(xué)者,希望對(duì)大家有一些幫助吧瀑凝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末序芦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粤咪,更是在濱河造成了極大的恐慌谚中,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宪塔,居然都是意外死亡磁奖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)某筐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)比搭,“玉大人,你說(shuō)我怎么就攤上這事南誊∩砼担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵弟疆,是天一觀的道長(zhǎng)戚长。 經(jīng)常有香客問(wèn)我,道長(zhǎng)怠苔,這世上最難降的妖魔是什么同廉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮柑司,結(jié)果婚禮上迫肖,老公的妹妹穿的比我還像新娘。我一直安慰自己攒驰,他們只是感情好蟆湖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著玻粪,像睡著了一般隅津。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劲室,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天伦仍,我揣著相機(jī)與錄音,去河邊找鬼很洋。 笑死充蓝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喉磁。 我是一名探鬼主播谓苟,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼协怒!你這毒婦竟也來(lái)了涝焙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤孕暇,失蹤者是張志新(化名)和其女友劉穎纱皆,沒(méi)想到半個(gè)月后湾趾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡派草,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年搀缠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片近迁。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艺普,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鉴竭,到底是詐尸還是另有隱情歧譬,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布搏存,位于F島的核電站瑰步,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏璧眠。R本人自食惡果不足惜缩焦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望责静。 院中可真熱鬧袁滥,春花似錦、人聲如沸灾螃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腰鬼。三九已至嵌赠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熄赡,已是汗流浹背猾普。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留本谜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓偎窘,卻偏偏與公主長(zhǎng)得像乌助,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陌知,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 【Python基礎(chǔ)】條件語(yǔ)句 Python條件語(yǔ)句是通過(guò)一條或多條語(yǔ)句的執(zhí)行結(jié)果(True或者False)來(lái)決定執(zhí)...
    開(kāi)發(fā)者學(xué)習(xí)指南閱讀 145評(píng)論 0 0
  • 辯:買(mǎi)了百萬(wàn)醫(yī)療保險(xiǎn)他托,就可以不買(mǎi)重大疾病保險(xiǎn)? 近兩年仆葡,隨著百萬(wàn)醫(yī)療類(lèi)保險(xiǎn)的盛行赏参,市場(chǎng)上開(kāi)始出現(xiàn)這樣一種聲音志笼,很多...
    侃爺說(shuō)保險(xiǎn)閱讀 176評(píng)論 0 1
  • 【日精進(jìn)打卡967天】 姓名:孫玉生 沈陽(yáng)盛和商學(xué)院 六項(xiàng)精進(jìn)第177期學(xué)員(隊(duì)長(zhǎng)),271期284期288期29...
    _玉_生_閱讀 278評(píng)論 0 2
  • 曾經(jīng)天人合一把篓,知道萬(wàn)物相依纫溃,何時(shí)失去天真,凡事總講道理韧掩。 原創(chuàng)作品 (Original Article)
    一詩(shī)一境界閱讀 270評(píng)論 0 0
  • 周星馳捧紅了一大批的女星疗锐,可以說(shuō)香港的半個(gè)娛樂(lè)圈坊谁,都是周星馳撐起來(lái)的,像張柏芝滑臊、朱茵等口芍,都是著名的“星女郎”。 周...
    漫娛小簡(jiǎn)閱讀 329評(píng)論 0 0