06. Web大前端時代之:HTML5+CSS3入門系列~HTML5 畫布


Web大前端時代之:HTML5+CSS3入門系列:http://www.cnblogs.com/dunitian/p/5121725.html

我們先看看畫布的魅力:

 

 

初始畫布

canvas默認是寬300px,高150px;

繪制步驟

1.定義一個id

<canvas id="canvasOne" width="300" height="300"></canvas>

2.獲取canvas對象

var canvasObj = document.getElementById('canvasOne');

3.通過getContext獲取上下文

var context = canvasObj.getContext("2d");

目前支持2d繪圖

4.通過javascript進行繪制

context.fillStyle = "red";

設置樣式為紅色

context.fillRect(125, 125, 50, 50);

x坐標為125y坐標為125的地方繪制一個長為50寬為50的正方形

 

繪制案例

常見幾何

繪制直線

繪制300*300畫布的對角線

beginPath()

開始繪制

moveTo(x,y)

直線起點

lineTo(x,y)

直線終點

stroke()

繪制直線

<canvas id="canvasOne" width="300" height="300"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext("2d");

//context.strokeStyle = "#ff6a00";

context.beginPath();

context.moveTo(0, 0);

context.lineTo(300, 300);

context.stroke();

 

context.moveTo(0, 300);

context.lineTo(300, 0);

context.stroke();

</script>

繪制矩形

在畫布中間繪制一個100*50的矩形

繪制

strokeStyle

strokeRect(x,y,w,h)

填充

fillStyle

fillRect(x,y,w,h)

<canvas id="canvasOne" width="300" height="300"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext("2d");

context.strokeStyle = 'rgb(100%,0%,100%)';

context.strokeRect(100, 125, 100, 50);

</script>

繪制圓形

繪制300*300畫布的內切圓

beginPath()

開始繪制路徑

arc(x, y, r, s, e, b)

x,y 坐標這次是代表圓心

r 代表半徑

s 代表開始弧度

e 代表結束弧度

b 代表是否時針方向畫圖

默認時針

closePath()

結束繪制路徑

擴充案例

fill()

填充

<canvas id="canvasOne" width="300" height="300"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext("2d");

context.fillStyle = 'rgb(0,50,0)';

context.beginPath();//開始繪制路徑

context.arc(150, 150, 150, 0, Math.PI * 2,true);//注意:x,y 坐標這次是代表圓心

context.closePath();//結束繪制路徑

context.fill();//填充

</script>

繪制弧線

context.closePath();

路徑不閉合的時候會自動畫一條直線(代碼看注釋)

<canvas id="canvasOne" width="300" height="300"></canvas>

<canvas id="canvasTwo" width="300" height="300"></canvas>

<canvas id="canvasThree" width="300" height="300"></canvas>

<script type="text/javascript">

//第一個畫布

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext("2d");

for (var i = 0; i <= 15; i++) {

context.strokeStyle= 'rgb(0,50,0)';

context.beginPath();//開始繪制路徑

context.arc(0, 150, i * 10, 0, Math.PI * 1.5);//注意:x,y 坐標這次是代表圓心

//context.closePath();//結束繪制路徑

context.stroke();//填充

}

//第二個畫布

var canvasObj2 = document.getElementById('canvasTwo');

var context2 = canvasObj2.getContext("2d");

for (var i = 0; i <= 30; i++) {

context2.strokeStyle= 'rgb(0,0,50)';

context2.beginPath();//開始繪制路徑

context2.arc(0, 0, i * 10, 0, Math.PI * 1.5);//注意:x,y 坐標這次是代表圓心

//context2.closePath();//結束繪制路徑

context2.stroke();//填充

}

//第三個畫布-搞怪來襲

var canvasObj3 = document.getElementById('canvasThree');

var context3 = canvasObj3.getContext("2d");

for (var i = 0; i <= 30; i++) {

context3.strokeStyle= 'rgb(0,0,50)';

context3.beginPath();//開始繪制路徑

context3.arc(0, 150, i * 10, 1, 3);//注意:x,y 坐標這次是代表圓心

context3.closePath();//結束繪制路徑,路徑不閉合的情況下會自動補上一個直線,所以就搞怪了

context3.stroke();//填充

}

</script>

繪制三角形

繪制三角形

<canvas id="myCanvas" width="200" height="200"></canvas>

<script type="text/javascript">

var c = document.getElementById("myCanvas");

var context = c.getContext("2d");

context.strokeStyle = "red";

context.beginPath();

context.moveTo(25, 25);

context.lineTo(150, 25);

context.lineTo(25, 150);

context.closePath();

context.stroke();

</script>

常用技能

透 明 度

rgba(r,g,b,a)

a代表透明度,取值范圍在 0~1

清 除 畫 布

context.clearRect(x,y,w,h)

(圓形橡皮擦)

案例

保存與恢復狀態

狀態

指當前畫面所有樣式,變形,裁切的快照

舉個例子:你先用紅色樣式畫一個矩形,然后保存狀態,然后再用藍色樣式畫一個矩形。

恢復狀態畫個矩形看看,發現====> 矩形是紅色的====>說明====>狀態保存下來了。

圖例

保存

context.save();

恢復

context.restore()

移動坐標空間

context.translate(60,50);

x軸方向右移60,y軸方向下移50

for (var i = 1; i < 10; i++) {

context.save();//保存一下狀態

 

context.translate(60 * i, 50);//x軸方向右移60*i,y軸方向下移50

 

//畫傘的頂部

context.fillStyle = 'rgb(' + i * 25 + ',' + 0 + ',' + 255 + ')';

context.beginPath();

context.arc(0, 0, 30, 0, Math.PI, true);//在起點位置順時針畫一個半圓

context.closePath();

context.fill();

 

//畫傘的底

context.strokeStyle = "red";

context.strokeRect(-0.2, 0, 0.4, 30);

//畫傘的根部

context.beginPath();

context.arc(-5, 30, 5, 0, Math.PI);//圓心左移五個單位,圓的右邊點就在根部了

context.stroke();

 

context.restore();//恢復一下狀態(不然每次都移動坐標原點,就變成天女散花了)

}

for (var i = 1; i < 10; i++) {

//x軸方向右移60+i,y軸方向下移50

context.translate(60 + i, 50);

 

//畫傘的頂

context.fillStyle = 'rgb(' + 255 + ',' + i * 25 + ',' + 0 + ')';

context.beginPath();

context.arc(0, 0, 30, 0, Math.PI, true);//在起點位置順時針畫一個半

context.closePath();

context.fill();

 

//畫傘的底部

context.strokeStyle = "red";

context.strokeRect(-0.2, 0, 0.4, 30);

//畫傘的根部

context.beginPath();

context.arc(-5, 30, 5, 0, Math.PI);//圓心左移五個單位,圓的右邊點就在根部了

context.stroke();

}

旋轉坐標空間

rotate(angle)

angle 代表旋轉角度

弧度為單位

在坐標原點順時針方向旋轉

<canvas id="canvasOne" width="600" height="600"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext('2d');

context.translate(300, 300);

 

//畫傘

function drawUmbrella(i) {

//畫傘的頂部

context.fillStyle = 'rgb(' + i * 25 + ',' + 0 + ',' + 255 + ')';

context.beginPath();

context.arc(0, 0, 30, 0, Math.PI, true);//在起點位置順時針畫一個半圓

context.closePath();

context.fill();

//畫傘的底部

context.strokeStyle = "red";

context.strokeRect(-0.2, 0, 0.4, 30);

//畫傘的根部

context.beginPath();

context.arc(-5, 30, 5, 0, Math.PI);//圓心左移五個單位,圓的右邊點就在根部了

context.stroke();

}

 

function draw() {

for (var i = 1; i <= 10; i++) {

context.save();//保存一下狀態

context.rotate(Math.PI * (0.2 * i));//2Pi 弧度是一個圓

context.translate(0, 150);//越小越緊湊

drawUmbrella(i);//畫傘(畫傘代碼未變)

context.restore();//恢復一下狀態

}

}

 

window.onload = function () {

draw();

}

</script>

縮 放 圖 形

context.scale(1.1, 1.1)

擴大1.1倍

rgba(r,g,b,a)

a代表透明度,取值范圍在 0~1

<canvas id="canvasOne" width="600" height="600"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext('2d');

context.translate(300, 300);

for (var i = 1; i < 50; i++) {

context.rotate(Math.PI / 9);//旋

context.scale(1.1, 1.1);//擴大1.1倍

context.translate(0.5, 0.5);//平

 

context.fillStyle = 'rgba(' + i * 5 + ',' + 0 + ',' + 200 + ',' + 0.5 + ')';

context.beginPath();

context.arc(0, 0, 1, 0, Math.PI * 2, true);

context.closePath();

context.fill();

}

</script>

矩 陣 變 化

其實像 translate(移動),scale(縮放),rotate(旋轉)都是特殊的矩陣變換

transform(m11,m12,m21,m22,dx,dy)

替換當前的變換矩陣(transform() 允許您縮放、旋轉、移動並傾斜當前的環境)

http://www.w3school.com.cn/tags/canvas_transform.asp

參數圖解

本質公式

參數詳解

水平縮放繪圖

m11

水平傾斜繪圖

m12

垂直傾斜繪圖

m21

垂直縮放繪圖

m22

水平移動繪圖

dx

垂直移動繪圖

dy

setTransform(m11,m12,m21,m22,dx,dy)

重置並創建新的變換矩陣

http://www.w3school.com.cn/tags/canvas_settransform.asp

小案例

 

<canvas id="canvasOne" width="600" height="600"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext('2d');

context.translate(200, 20);

for (var i = 1; i < 90; i++) {

context.save();

//參數:水平縮放繪圖,水平傾斜繪圖,垂直傾斜繪圖,垂直縮放繪圖,水平移動繪圖,垂直移動繪圖

context.transform(0.95, 0, 0, 0.95, 30, 30);

context.rotate(Math.PI / 12);//旋轉角度

context.beginPath();

context.fillStyle = "rgba(255,0,0,0.5)";

context.arc(0, 0, 50, 0, Math.PI * 2, true);

context.closePath();

context.fill();

}

//參數:水平縮放繪圖,水平傾斜繪圖,垂直傾斜繪圖,垂直縮放繪圖,水平移動繪圖,垂直移動繪圖

context.setTransform(1, 0, 0, 1, 10, 10);

//檢驗一下是否變化過來了

context.fillStyle = "blue";

context.fillRect(0, 0, 50, 50);

context.fill();

</script>

擴 展 樣 式

線形屬性

lineWidth

設置線條粗細默認為1,為正數

<canvas id="canvasOne" width="300" height="300"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext('2d');

for (var i = 1; i < 12; i++) {

context.strokeStyle = 'rgb(255,0,0)';

context.lineWidth = i;

context.beginPath();

context.moveTo(i * 20, 0);

context.lineTo(i * 20, 300);

//context.closePath();

context.stroke();

}

</script>

lineCap

設置端點樣式

butt

平頭

默認

round

圓頭

square

方頭

<canvas id="canvasOne" width="300" height="300"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext('2d');

//義數組

var lineCap = ['butt', 'round', 'square'];

// 繪制參考線。

context.strokeStyle = 'red';

context.beginPath();

context.moveTo(10,10);

context.lineTo(10,150);

context.moveTo(150,10);

context.lineTo(150,150);

context.stroke();

// 繪制直線段。

context.strokeStyle = 'blue';

for (var i = 0; i < lineCap.length; i++) {

context.lineWidth = 20;

context.lineCap = lineCap[i];

context.beginPath();

context.moveTo(10, 30 + i * 50);

context.lineTo(150, 30 + i * 50);

context.stroke();

}

</script>

lineJoin

設置連接處樣式

round

bevel

斜面

miter

默認

<canvas id="canvasOne" width="500" height="200"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext('2d');

var lineJoin = ['round', 'bevel', 'miter'];

context.strokeStyle = 'rgb(0,0,0)';

for (var i = 0; i < lineJoin.length; i++) {

context.lineWidth = 25;

context.lineJoin = lineJoin[i];

context.beginPath();

context.moveTo(10 + i * 150, 30);

context.lineTo(100 + i * 150, 30);

context.lineTo(100 + i * 150, 100);

context.stroke();

}

</script>

miterLimit

設置或返回最大斜接長度

前提

lineJoin使用默認屬性(miter)

<canvas id="canvasOne" width="1600" height="300"></canvas>

<script type="text/javascript">

var context = document.getElementById('canvasOne').getContext('2d');

for (var i = 1; i < 10; i++) {

context.strokeStyle = 'blue';

context.lineWidth = 10;

context.lineJoin = 'miter';

context.miterLimit = i * 10;

context.beginPath();

context.moveTo(10, i * 30);

context.lineTo(100, i * 30);

context.lineTo(10, 33 * i);

context.stroke();

}

</script>

漸 變 系 列

線形漸變

createLinearGradient(x0, y0, x1, y1)

請使用該對象作為 strokeStyle 或 fillStyle 屬性的值

x0,y0

漸變起點

x1,y1

漸變終點

addColorStop(position, color);

一般都是設置多個色標

position

色相偏移值

取值 0~1

color

顏色

並非一定從0開始,1結束

 

<canvas id="canvasOne" width="300" height="300"></canvas>

<script type="text/javascript">

var context = document.getElementById('canvasOne').getContext('2d');

var lingrad = context.createLinearGradient(0, 0, 0, 200);

lingrad.addColorStop(0, '#ff0000');

lingrad.addColorStop(1 / 7, '#ff9900');

lingrad.addColorStop(2 / 7, '#ffff00');

lingrad.addColorStop(3 / 7, '#00ff00');

lingrad.addColorStop(4 / 7, '#00ffff');

lingrad.addColorStop(5 / 7, '#0000ff');

lingrad.addColorStop(6 / 7, '#ff00ff');

lingrad.addColorStop(1, '#ff0000');

context.fillStyle = lingrad;

context.fillRect(10, 10, 200, 200);

</script>

var c = document.getElementById('myCanvas');

var ctx = c.getContext('2d');

var grd = ctx.createLinearGradient(0, 0, 170, 0);

grd.addColorStop(0.1, 'rgb(255,255,255)');

grd.addColorStop(0.5, 'rgb(0,100,0)');

grd.addColorStop(0.9, 'rgb(0,0,0)');

ctx.fillStyle = grd;

ctx.fillRect(20, 20, 150, 100);

徑向漸變

createRadialGradient(x1,y1,r1,x2,y2,r2)

以(x1,y1)為原點,r1為半徑的圓

以(x2,y2)為原點,r2為半徑的圓

addColorStop(position, color);

一般都是設置多個色標

position

色相偏移值

取值 0~1

color

顏色

並非一定從0開始,1結束

 

<canvas id="myCanvas" width="300" height="240"></canvas>

<script language="javascript">

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

var radgrad = ctx.createRadialGradient(55, 55, 20, 100, 100, 90);

radgrad.addColorStop(0, 'rgb(255,255,0)');

radgrad.addColorStop(0.75, 'rgb(255,0,0)');

radgrad.addColorStop(1, 'rgb(255,255,255)');

ctx.fillStyle = radgrad;

ctx.fillRect(10, 10, 200, 200);

</script>

創 建 陰 影

參數

shadowOffsetX

shadowOffsetX 屬性設置或返回形狀與陰影的水平距離

shadowOffsetX=0 指示陰影位於形狀的正下方。

shadowOffsetX=20 指示陰影位於形狀 left 位置右側的 20 像素處。

shadowOffsetX=-20 指示陰影位於形狀 left 位置左側的 20 像素處。

shadowOffsetY

shadowOffsetY 屬性設置或返回形狀與陰影的垂直距離。

shadowOffsetY=0 指示陰影位於形狀的正下方。

shadowOffsetY=20 指示陰影位於形狀 top 位置下方的 20 像素處。

shadowOffsetY=-20 指示陰影位於形狀 top 位置上方的 20 像素處。

shadowBlur

shadowBlur 屬性設置或返回陰影的模糊級數。

shadowColor

shadowColor 屬性設置或返回用於陰影的顏色

<canvas id="canvasOne" width="600" height="600"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext('2d');

 

//設置前畫個圖

context.fillStyle = '#0094ff';

context.fillRect(410, 310, 50, 50);

 

//置陰

context.shadowOffsetX = 3;

context.shadowOffsetY = 3;

context.shadowBlur = 1;

context.shadowColor = '#808080';

 

//畫矩形

context.fillRect(200, 200, 200, 100);

 

//繪圖

var img = new Image();

img.src = '/images/1.jpg';

img.onload = function () {

context.fillStyle = context.createPattern(img, 'no-repeat');

context.fillRect(0, 0, 600, 600);

}

</script>

繪制文字

繪制填充文字

fillText(str,x,y,[mw])

str

文字內容

x,y

起點坐標

mw

最大寬度

可選參數

繪制文字輪廓

strokeText(str,x,y,[mw])

str

文字內容

x,y

起點坐標

mw

最大寬度

可選參數

測量文字寬度

measureText(str)

context.measureText(str).width

文字寬度

str

文字內容

文字系列屬性

context.font

語法

context.font="italic small-caps bold 12px arial";

font-style

規定字體樣式。可能的值:

normal

italic

斜體字

oblique

傾斜

font-variant

規定字體變體。可能的值:

normal

small-caps

大寫

font-weight

規定字體的粗細。可能的值:

normal

bold

bolder

lighter

100

font-family

規定字體系列。

font-size / line-height

規定字號和行高,以像素計。

icon

使用用於標記圖標的字體。

menu

使用用於菜單中的字體(下拉列表和菜單列表)。

caption

使用標題控件的字體(比如按鈕、下拉列表等)。

status-bar

使用用於窗口狀態欄中的字體。

message-box

使用用於對話框中的字體。

small-caption

使用用於標記小型控件的字體。

案例

<canvas id="canvasOne" width="500" height="300"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext('2d');

var str = 'http://dnt.dkill.net';

context.fillStyle = 'rgba(255,0,0,0.9)';

context.strokeStyle = 'rgba(255,0,0,0.9)';

 

context.font = '30px 微軟雅黑';

context.strokeText(str, 100, 40);

console.log(context.measureText(str).width);

context.fillText(str, 100, 80);

console.log(context.measureText(str).width);

 

context.font = 'bold 30px 微軟雅黑';

context.strokeText(str, 100, 150);

console.log(context.measureText(str).width);

context.fillText(str, 100, 180);

console.log(context.measureText(str).width);

</script>

圖像系列

1.圖像來源

路徑圖片

直接對 src 賦值

var img=new Image();

img.src='xxx';

頁面圖片

來源於頁面,如果已知id則可通過

document.images 集合

document.getElementsByTagName

document.getElementsById

其他canvas元素

document.getElementsByTagName

document.getElementsById

2.drawImage繪圖

context.drawImage(img,x,y)

在畫布上定位圖像

img 規定要使用的圖像、畫布或視頻。

x 在畫布上放置圖像的 x 坐標位置。

y 在畫布上放置圖像的 y 坐標位置。

//獲取路徑圖片

document.getElementById('btn1').onclick = function () {

clearCanvas(context);

var img1 = new Image();

img1.src = '/images/1.jpg';

context.drawImage(img1, 150, 150);

}

context.drawImage(img,x,y,w,h)

在畫布上定位圖像,並規定圖像的寬度和高度

img 規定要使用的圖像、畫布或視頻。

x 在畫布上放置圖像的 x 坐標位置。

y 在畫布上放置圖像的 y 坐標位置。

w 要使用的圖像的寬度。(伸展或縮小圖像)

h 要使用的圖像的高度。(伸展或縮小圖像)

//獲取頁面圖片

document.getElementById('btn2').onclick = function () {

clearCanvas(context);

var img2 = document.getElementById('imgOne');

context.drawImage(img2, 150, 150, 200, 200);

}

context.drawImage(img,sx,sy,sw,sh,x,y,w,h)

剪切圖像,並在畫布上定位被剪切的部分

img 規定要使用的圖像、畫布或視頻。

sx 開始剪切的 x 坐標位置。

sy 開始剪切的 y 坐標位置。

sw 被剪切圖像的寬度。

sh 被剪切圖像的高度。

x 在畫布上放置圖像的 x 坐標位置。

y 在畫布上放置圖像的 y 坐標位置。

w 要使用的圖像的寬度。(伸展或縮小圖像)

h 要使用的圖像的高度。(伸展或縮小圖像)

//從Canvas獲取

document.getElementById('btn3').onclick = function () {

clearCanvas(context);

var img3 = document.getElementById('canvasTwo');

context.drawImage(img3, 150, 150, 300, 250, 50, 50, 400, 300);

}

擴展(不完美)

createPattern(image,type)

image

規定要使用的圖片、畫布或視頻元素

var img=new Image();

type

是否重發

repeat|repeat-x|repeat-y|no-repeat

<canvas id="canvasOne" width="600" height="600"></canvas>

<script type="text/javascript">

var canvasObj = document.getElementById('canvasOne');

var context = canvasObj.getContext('2d');

var img = new Image();

img.src = '/images/1.jpg';

img.onload = function () {

context.fillStyle = context.createPattern(img, 'repeat');

context.fillRect(0, 0, 600, 600);

}

</script>

注意:

context.fillRect(100, 0, 600, 600);

這里的fillRect(x,y,w,h)。x,y既指的是坐標原點,也指的是圖片原點

擴展部分

繪制貝塞爾曲線

二次方貝塞爾曲線

quadraticCurveTo(cp1x,cp1y,x,y)

cp1x,cp1y是控制點坐標

x,y是終點坐標

<canvas id="myCanvas" style="border:1px solid;" width="300" height="200"></canvas>

<script type="text/javascript">

var c=document.getElementById("myCanvas");

var context=c.getContext("2d");

// 下面開始繪制二次方貝塞爾曲線。

context.strokeStyle="dark";

context.beginPath();

context.moveTo(0,200);

context.quadraticCurveTo(75,50,300,200);

context.stroke();

context.globalCompositeOperation="source-over";

// 下面制的直線用上面曲線的控制點和控制,控制點坐標即兩直線的交點(75,50)。

context.strokeStyle="#ff00ff";

context.beginPath();

context.moveTo(75,50);

context.lineTo(0,200);

context.moveTo(75,50);

context.lineTo(300,200);

context.stroke();

</script>

三次方貝塞爾曲線

bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)

cp1x,cp1y是控制點坐標

cp2x,cp2y是第二個控制點坐標

x,y是終點坐標

<canvas id="myCanvas" width="300" height="200"></canvas>

<script type="text/javascript">

var c=document.getElementById("myCanvas");

var context=c.getContext("2d");

// 下面開始繪制三次方貝塞爾曲線。

context.strokeStyle="dark";

context.beginPath();

context.moveTo(0,200);

context.bezierCurveTo(25,50,75,50,300,200);

context.stroke();

context.globalCompositeOperation="source-over";

// 下面繪制的線用於表示上曲線的控制點和控制線,控制坐標為(25,50)和75,50)

context.strokeStyle="#ff00ff";

context.beginPath();

context.moveTo(25,50);

context.lineTo(0,200);

context.moveTo(75,50);

context.lineTo(300,200);

context.stroke();

</script>

組合裁切

組合

globalCompositeOperation

設置或返回如何將一個源(新的)圖像繪制到目標(已有)的圖像上

裁切

clip()

從原始畫布中剪切任意形狀和尺寸

案例

從畫布中剪切 200*120 像素的矩形區域。然后,繪制綠色矩形。只有被剪切區域內的綠色矩形部分是可見的

<p>不使用 clip():</p>

<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;"></canvas>

<script>

var c = document.getElementById("myCanvas");

var ctx = c.getContext("2d");

ctx.rect(50, 20, 200, 120);

ctx.stroke();

ctx.fillStyle = "green";

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

</script>

<br />

<p>使用 clip():</p>

<canvas id="myCanvas2" width="300" height="150" style="border:1px solid #d3d3d3;"></canvas>

<script>

var c = document.getElementById("myCanvas2");

var ctx = c.getContext("2d");

// Clip a rectangular area

ctx.rect(50, 20, 200, 120);

ctx.stroke();

ctx.clip();

// Draw red rectangle after clip()

ctx.fillStyle = "green";

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

</script>

案例2

<canvas id="myCanvas" style="border:1px solid;" width="300" height="300"></canvas>

<script type="text/javascript">

function draw() {

var ctx = document.getElementById('myCanvas').getContext("2d");

// 繪制背景。

ctx.fillStyle = "black";

ctx.fillRect(0, 0, 300, 300);

ctx.fill();

// 繪制圓形。

ctx.beginPath();

ctx.arc(150, 150, 130, 0, Math.PI * 2, true);

//切路徑。

ctx.clip();

ctx.translate(200, 20);

for (var i = 1; i < 90; i++) {

ctx.save();

ctx.transform(0.95, 0, 0, 0.95, 30, 30);

ctx.rotate(Math.PI / 12);

ctx.beginPath();

ctx.fillStyle = "red";

ctx.globalAlpha = "0.4";

ctx.arc(0, 0, 50, 0, Math.PI * 2, true);

ctx.closePath();

ctx.fill();

}

}

window.onload = function () {

draw();

}

</script>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM