å¨ç¹ªç«åå½¢ç« ç¯ä¸ï¼æååªç¨äºé è¨çç·æ¢è填滿樣å¼ï¼è卿¬ç« ï¼æåå°é²ä¸æ¥ççææå¯ç¨ç樣å¼é¸é ï¼ç«åºæ´å¸å¼äººçåã
é¡è²U æªè³ç®åçºæ¢æååªæçå°ç¹ªåç°å¢çæ¹æ³(methods)ï¼å¦ææåæ³è¦è¨å®åå½¢çé¡è²ï¼æåæå
©å屬æ§è½ç¨: fillStyle
èstorkeStyle.
fillStyle = color
è¨å®å¡«æ»¿åå½¢æç¨çé¡è².
strokeStyle = color
è¨å®å¾ååå½¢æç¨çé¡è².
å
¶ä¸color
å¯ä»¥æ¯ CSS<color>
表示åä¸²ãæ¼¸å±¤è²ç©ä»¶(gradient color)ææ¯æ¨¡å¼ç©ä»¶(pattern object)ï¼ç¾å¨å
çä¸ä¸ CSS{<color>}表示å串ï¼ç¨å¾åçå¦å¤å
©åé
ç®.
é è¨ä¸å¾ååå¡«æ»¿è²æ¯é»è²(CSS é¡è²å¼çº#000000).
åè¨»ï¼ ä¸æ¦æ¹è®äº strokeStyle çé¡è²å¼ï¼é£éº¼ä¹å¾åå½¢å¾åé¡è²é½æè®ææ°é¡è²ï¼åæ¨£çæ³ä¸æ¨£é©ç¨æ¼ fillStyle.
åæ ¼çé¡è²å¼è«åç
§ CSS3<color>
è¦ç¯ï¼ä¸é¢ç¯ä¾ææ¨ç¤ºçé¡è²é½æååä¸åé¡è².
// these all set the fillStyle to 'orange'
ctx.fillStyle = "orange";
ctx.fillStyle = "#FFA500";
ctx.fillStyle = "rgb(255,165,0)";
ctx.fillStyle = "rgba(255,165,0,1)";
åè¨»ï¼ ç®å Gecko 弿䏦䏿¯æ´ CSS3 å ¨é¨çé¡è²å¼ï¼ä¾å¦ hsl(100%,25%,0)å rgb(0,100%,0)å°±ä¸è¢«æ¯æ´.
fillStyle
ç¯ä¾
é裡æåå©ç¨å ©å for è¿´åä¾ç«åºä¸åç©å½¢é£åï¼èä¸é£å䏿¯ä¸åç©å½¢çé¡è²é½ä¸ç¸åãä¸é¢ç¨å¼ç¢¼ééæ¹è® i å j å ©åè®æ¸ä¾åå¥è®æ RGB ä¸çç´ è²å¼åç¶ è²å¼ï¼ç¶å¾çºæ¯ä¸åç©å½¢ç¢çèªå·±å°å±¬çé¡è²å¼ãééæ¹è® RGB çåé¡è²å¼ï¼æåå¯ä»¥ç¢çåå¼å樣ç調è²ç¤ï¼åæ¯éæ¥èª¿æ´é¡è²å¼ï¼ä½ ä¹å¯ä»¥ååºå Photoshop å §å»ºä¸æ¨£ç調è²ç¤ã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle =
"rgb(" +
Math.floor(255 - 42.5 * i) +
"," +
Math.floor(255 - 42.5 * j) +
",0)";
ctx.fillRect(j * 25, i * 25, 25, 25);
}
}
}
<canvas id="canvas" width="150" height="150"></canvas>
çµæå¦ä¸:
strokeStyle
ç¯ä¾
æ¬ä¾ååä¾ç¸ç¶é¡ä¼¼ï¼ä¸åçæ¯æåæ¹ç¨ arc()æ¹æ³ç«åå½¢è䏿¯ç©å½¢ãæ¹è¨å® strokeStyle è®æå形輪å»é¡è²ã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.strokeStyle =
"rgb(0," +
Math.floor(255 - 42.5 * i) +
"," +
Math.floor(255 - 42.5 * j) +
")";
ctx.beginPath();
ctx.arc(12.5 + j * 25, 12.5 + i * 25, 10, 0, Math.PI * 2, true);
ctx.stroke();
}
}
}
<canvas id="canvas" width="150" height="150"></canvas>
çµæå¦ä¸:
éæåº¦ééè¨å® globalAlpha å±¬æ§ææ¯ä»¥åéæé¡è²å¼è¨å® strokeStyle è fillStyle 屬æ§ï¼é¤äºç«ä¸éæçåå½¢ï¼æåéå¯ä»¥ç«åéæçåå½¢ã
globalAlpha = transparencyValue
å 許å¼ä»æ¼ 0.0(å ¨éæ)å° 1.0(ä¸éæ)ã䏿¦è¨å®å¾ï¼ä¹å¾ç«å¸ä¸ç«çææåå½¢çä¸éæåº¦é½æå¥ç¨æ¤è¨å®å¼ãé è¨å¼çº 1.0ã
ç¶æåæ³ç«ä¸ç³»åç¸åä¸éæåº¦çåï¼è¨å® globalAlpha 弿¯ä¸åæ¹ä¾¿ç使³ã
ç± CSS3 é¡è²å¼è½å¤ æå®ä¸éæåº¦ï¼æåä¹å¯ä»¥å¦ä¸é¢ä¸è¬ï¼è¨å® strokeStyle 以å fillStyle ä¾è®æ´ä¸éæåº¦ã
// Assigning transparent colors to stroke and fill style
ctx.strokeStyle = "rgba(255,0,0,0.5)";
ctx.fillStyle = "rgba(255,0,0,0.5)";
rgba()彿¸æ¯ rgb()彿¸å¤åºä¸åä¸éæåº¦åæ¸ï¼å 許å¼ä»æ¼ 0.0(å ¨éæ)å° 1.0(ä¸éæ).
globalAlpha
ç¯ä¾
ä¸é¢æåå°å¨ååæ¹æ ¼è²å¡èæ¯ä¸ç«ä¸ç³»ååéæåå½¢ãå°æ¼ææåå½¢ï¼æåèç±è¨ç½® globalAlpha 屬æ§å¼çº 0.2 使å¾åå½¢è®æåéæï¼ç¶å¾ for è¿´å裡æåéä¸å¢å å形繪ååå¾ï¼æçµçµæçèµ·ä¾ä¾¿åæ¯è¼»å°çæ¼¸å±¤åæ¡ï¼èä¸åå½¢ç¸äºçå å¨å½¼æ¤ä¹ä¸å¾ï¼åå æ·±äºéçååçä¸éæåº¦ï¼åªè¦æå䏿·å¢å åå½¢æ¸éï¼æå¾åçä¸å¤®å°è¢«å®å ¨é®èï¼çä¸å°èå¾çèæ¯ã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
// draw background
ctx.fillStyle = "#FD0";
ctx.fillRect(0, 0, 75, 75);
ctx.fillStyle = "#6C0";
ctx.fillRect(75, 0, 75, 75);
ctx.fillStyle = "#09F";
ctx.fillRect(0, 75, 75, 75);
ctx.fillStyle = "#F30";
ctx.fillRect(75, 75, 150, 150);
ctx.fillStyle = "#FFF";
// set transparency value
ctx.globalAlpha = 0.2;
// Draw semi transparent circles
for (i = 0; i < 7; i++) {
ctx.beginPath();
ctx.arc(75, 75, 10 + 10 * i, 0, Math.PI * 2, true);
ctx.fill();
}
}
<canvas id="canvas" width="150" height="150"></canvas>
rgba()
使ç¨ç¯ä¾
éåç¯ä¾é¡ä¼¼æ¼ä¸é¢çç¯ä¾ï¼ä½ä¸åçæ¯æåæ¹ç«åéæçç©å½¢ãrgba()å¨ä½¿ç¨ä¸æå¤ä¸é»å½æ§ï¼å çºæåå¯ä»¥åå¥è¨ç½®å¾åå填滿åå½¢çä¸éæåº¦ã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
// Draw background
ctx.fillStyle = "rgb(255,221,0)";
ctx.fillRect(0, 0, 150, 37.5);
ctx.fillStyle = "rgb(102,204,0)";
ctx.fillRect(0, 37.5, 150, 37.5);
ctx.fillStyle = "rgb(0,153,255)";
ctx.fillRect(0, 75, 150, 37.5);
ctx.fillStyle = "rgb(255,51,0)";
ctx.fillRect(0, 112.5, 150, 37.5);
// Draw semi transparent rectangles
for (var i = 0; i < 10; i++) {
ctx.fillStyle = "rgba(255,255,255," + (i + 1) / 10 + ")";
for (var j = 0; j < 4; j++) {
ctx.fillRect(5 + i * 14, 5 + j * 37.5, 14, 27.5);
}
}
}
<canvas id="canvas" width="150" height="150"></canvas>
ç·æ¢æ¨£å¼
ææ¸ç¨®å±¬æ§å¯ä»¥è®æåè¨å®ç·æ¢æ¨£å¼.
lineWidth = value
è¨å®ç·æ¢å¯¬åº¦ã
lineCap = type
è¨å®ç·æ¢çµå°¾ç樣å¼ã
lineJoin = type
è¨å®ç·æ¢åç·æ¢éæ¥åèçæ¨£å¼ã
miterLimit = value
éå¶ç¶å ©æ¢ç·ç¸äº¤æäº¤æ¥èæå¤§é·åº¦ï¼æè¬äº¤æ¥èé·åº¦(miter length)æ¯æç·æ¢äº¤æ¥èå §è§é é»å°å¤è§é é»çé·åº¦ã
åºä¸æåå°ä¸ä¸ç¤ºç¯éäºå±¬æ§çç¨éã
lineWidth
ç¯ä¾
æ¤å±¬æ§æ±ºå®ç·æ¢å¯¬åº¦ï¼å¿ é çºæ£æ¸ï¼é è¨å¼çº 1.0 å®ä½ã
ç·æ¢å¯¬åº¦çèµ·ç®é»æ¯å¾ç¹ªåè·¯å¾ä¸å¤®éå§å¾å ©æå延伸ä¸åè¨å®å¯¬åº¦ï¼ç±æ¼ç«å¸åº§æ¨ä¸ç´æ¥å°æå°åç´ (pixel)ï¼æä»¥è¦æ¯è¼å°å¿è¨å®å¥½å徿¸ æ°çç´ç·ã
ç±ä¸æ¹ä¾åå¯ä»¥æé¡¯çå°ï¼ç«å¸ä¸æ 10 æ¢ç´ç·ï¼ç±å·¦è³å³ï¼å¾æå°ç 1.0 å®ä½å¯¬éå§é漸å 寬ï¼è«æ³¨æå¥æ¸å¯¬åº¦ç´ç·æå çºç¹ªåè·¯å¾ä½ç½®éä¿èæ¯è¼æ¨¡ç³ã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
for (var i = 0; i < 10; i++) {
ctx.lineWidth = 1 + i;
ctx.beginPath();
ctx.moveTo(5 + i * 14, 5);
ctx.lineTo(5 + i * 14, 140);
ctx.stroke();
}
}
<canvas id="canvas" width="150" height="150"></canvas>
çºäºç«åºæ¸ æ°çç´ç·ï¼æåéè¦äºè§£ç¹ªåè·¯å¾æ¯å¦ä½ç¢çï¼å¦ä¸æ¹å示ï¼ç¶²æ ¼ä»£è¡¨ç«å¸åº§æ¨è»¸ï¼ç¶²æ ¼ææ¡åºçæ¹æ ¼å代表è¢å¹ä¸çåç´ ï¼ç¬¬ä¸å¼µåç填滿äºåº§æ¨(2,1)å°(5,5)çç´ è²ååï¼èéåç´ è²ååçééæ£å¥½ç¬¦ååç´ éçééï¼æä»¥æç¢çåºæ¸ æ°çå½±åã
第äºå¼µåçä¸ï¼æä¸æ¢å¯¬ 1.0 å®ä½çç´ç·å¾åº§æ¨(3,1)å°(3,5)被ç«å¨ç«å¸ä¸ï¼ä¸éç±æ¼ç·æ¢å¯¬åº¦çèµ·ç®é»æ¯å¾ç¹ªåè·¯å¾ä¸å¤®éå§å¾å ©æå延伸ä¸åè¨å®å¯¬åº¦ï¼æä»¥ç¶å¾åç·æ¢æï¼ç¹ªåè·¯å¾å ©æçåç´ æ ¼åªæä¸åæè¢«å¡«æ»¿æèè²ï¼è³æ¼å¦å¤ä¸ååæç¶ç±è¨ç®å¡«å ¥è¿ä¼¼è²(æ·¡èè²)ï¼çµæå°±æ¯æ´æ ¼åç´ ä¸¦éå ¨é¨å¡«å ¥ç¸åçæèè²ï¼é²èç¢çåºéç·£è¼çºæ¨¡ç³çç·æ¢ï¼ä¸é¢ç¨å¼ç¢¼ç¯ä¾ä¸ç奿¸å¯¬åº¦ç´ç·å°±æ¯å æ¤èç¢ç䏿¸ æ°çç·æ¢ã
çºäºé¿å ååºé緣模ç³ç´ç·ï¼æåå¿ é ç²¾æºè¨å®ç¹ªåè·¯å¾ä½ç½®ï¼å°±æ¬ç¯ä¾èè¨ï¼å¦ææåçç´ç·ç¹ªåè·¯å¾æ¯å¾åº§æ¨(3.5, 1)å°(3.5, 5)ç話(å¦ç¬¬ä¸å¼µå)ï¼é£éº¼ 1.0 å®ä½å¯¬çç´ç·å°å好填滿åç´ æ ¼ï¼æä»¥æåå°å¯ä»¥ç«åºæ¸ æ°çç´ç·ã
åè¨»ï¼ è«æ³¨ææ¬ç¯ä¾ç Y 軸座æ¨é½æ¯æ´æ¸é»ï¼è¥é妿¤ï¼ä¸æ¨£æå°è´ç·æ¢ç«¯é»çåç´ æ ¼ç¡æ³å好被填滿çç¾è±¡ï¼èä¸åææå¾ç¢çççµæä¹æè¢« lineCap 給影é¿ï¼åè¥ lineCap å¼çºé è¨ butt æï¼æåæéè¦çºå¥æ¸å¯¬åº¦ç´ç·è¨ç®ä¸ä¸éæ´æ¸ç座æ¨é»ï¼åè¥ lineCap 樣å¼çº squareï¼é£éº¼ç·æ®µç«¯é»çåç´ æ ¼å°èªåè¢«å®æ´å¡«æ»¿ãéæä¸é»éè¦æ³¨æï¼åªè¦ç¹ªåè·¯å¾è¢« closePath()彿¸éåèµ·ä¾ï¼éæ¨£ä¾¿æ²æäºç·æ¢ç«¯é»ï¼ææçç·æ¢ç«¯é»é½æä¾æ lineJoin 樣å¼å ¨é¨åå¾äºç¸é£æ¥èµ·ä¾ï¼éæèªå延伸端é»éç·£å°ç·æ®µæ¥åèï¼å¦ææ¤ææ¥åç«¯é»æ¯æ°´å¹³æåç´ç話ï¼ä½æ¼ä¸å¤®çåç´ æ ¼å°æè¢«å®æ´å¡«æ»¿ãå¾é¢ç說ææä»ç´¹ lineCap å lineJoin 樣å¼ã
è³æ¼æ¬ä¾ä¸å¶æ¸å¯¬åº¦çç´ç·ï¼çºäºé¿å 模ç³ï¼ç¹ªåè·¯å¾æå¥½æ¯è½å¨æ´æ¸åº§æ¨é»ä¸ã
éç¶è裡 2D 繪åç¸®æ¾æäºéº»ç ©ï¼ä½åªè¦ä»ç´°è¨ç®åç´ æ ¼å繪åè·¯å¾ä½ç½®ï¼ç¸±ä½¿é²è¡ååç¸®æ¾æè®å½¢ï¼åå輸åºéæ¯å¯ä»¥ä¿ææ£ç¢ºã䏿¢å¯¬ 1.0 å®ä½çç´ç·ï¼åªè¦ä½ç½®è¨ç®æ£ç¢ºï¼æ¾å¤§å ©åå¾æè®æä¸æ¢ 2 ååç´ å¯¬çæ¸ æ°ç´ç·ï¼èä¸éæ¯æä¿ææ£ç¢ºä½ç½®ã
lineCap
ç¯ä¾
éåå±¬æ§æ±ºå®ç·æ¢ç«¯é»ç樣å¼ï¼ç¸½å ±æä¸ç¨®æ¨£å¼å¯é¸:
butt
ç·æ¢ç«¯é»æ¨£å¼çºæ¹å½¢ã
round
ç·æ¢ç«¯é»æ¨£å¼çºåå½¢ã
square
å¢å 寬åç·æ¢å¯¬åº¦ãé«ç·æ¢å¯¬åº¦ä¸åççæ¹å¡æ¼ç·æ¢ç«¯é»ã
ä¸é¢ç¨å¼ç¢¼æç«åºä¸æ¢ç·ï¼æ¯æ¢ç·ç lineCap å¼çä¸åãç¶å¾çºäºçæ¸ å·®ç°é»ï¼æåå ä¸äºå ©æ¢æ·¡èè²çè¼å©ç·ï¼ç·æ¢ç繪åèµ·å§é»åçµé»é½å好è½å¨è¼å©ç·ä¸ã
æå·¦éçç·æ¢å ¶ lineCap çº buttï¼ä¸é£çåºå®å®å ¨ä»æ¼è¼å©ç·ä¹éï¼ç¬¬äºæ¢ç·å ¶ lineCap çº roundï¼ç«¯é»æ¨£å¼çºåå¾çæ¼ç·æ¢å¯¬åº¦ä¸åçååï¼æå³éçç·æ¢å ¶ lineCap çº squareï¼ç«¯é»æ¨£å¼çºå¯¬åç·æ¢å¯¬åº¦ãé«ç·æ¢å¯¬åº¦ä¸åççæ¹å¡ã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
var lineCap = ["butt", "round", "square"];
// Draw guides
ctx.strokeStyle = "#09f";
ctx.beginPath();
ctx.moveTo(10, 10);
ctx.lineTo(140, 10);
ctx.moveTo(10, 140);
ctx.lineTo(140, 140);
ctx.stroke();
// Draw lines
ctx.strokeStyle = "black";
for (var i = 0; i < lineCap.length; i++) {
ctx.lineWidth = 15;
ctx.lineCap = lineCap[i];
ctx.beginPath();
ctx.moveTo(25 + i * 50, 10);
ctx.lineTo(25 + i * 50, 140);
ctx.stroke();
}
}
<canvas id="canvas" width="150" height="150"></canvas>
lineJoin
ç¯ä¾
lineJoin å±¬æ§æ±ºå®å ©å飿¥å端(å¦ç·æ¢ãå¼§å½¢ææ²ç·)å¦ä½é£æ¥(å°æ¼é·åº¦çºé¶ï¼äº¦å³çµé»åæ§å¶é»çºåä¸é»çåå½¢ç¡æ)ã
lineJoin 屬æ§å ±æä¸å屬æ§å¼å¦ä¸ï¼å ¶ä¸ miter çºé è¨å¼ï¼è«æ³¨æä¸é»è¥æ¯å ©å飿¥å段çç¹ªåæ¹åä¸è´ï¼é£ä»£è¡¨ä¸ææé£æ¥èï¼æä»¥æ¸¬å®æ¯ç¡æçã
round
代表åå¼§å飿¥æ¨£å¼ã
bevel
代表æé¢å飿¥æ¨£å¼ãå¨é£æ¥å段çå ±åçµé»è填滿ä¸åä¸è§å½¢ååï¼å°åæ¬ç夿¥è§èå½¢æä¸ååé¢ã
miter
代表æäº¤å飿¥æ¨£å¼ãåå¤å»¶ä¼¸é£çµå段å¤ç·£ç´å°ç¸äº¤æ¼ä¸é»ï¼ç¶å¾å½¢æè±å½¢ååï¼è miterLimit å±¬æ§æå½±é¿ miter 屬æ§ã
䏿¹ç¨å¼ç¢¼åå形輸åºå±ç¤ºäº lineJoin å¨ä¸å屬æ§å¼ä¸åç¾çä¸åçµæ
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
var lineJoin = ["round", "bevel", "miter"];
ctx.lineWidth = 10;
for (var i = 0; i < lineJoin.length; i++) {
ctx.lineJoin = lineJoin[i];
ctx.beginPath();
ctx.moveTo(-5, 5 + i * 40);
ctx.lineTo(35, 45 + i * 40);
ctx.lineTo(75, 5 + i * 40);
ctx.lineTo(115, 45 + i * 40);
ctx.lineTo(155, 5 + i * 40);
ctx.stroke();
}
}
<canvas id="canvas" width="150" height="150"></canvas>
miterLimit
屬æ§
åé¢ç¯ä¾é¡¯ç¤ºåºï¼ç¶ lineJoin å¼çº miter æï¼å ©æ¢ç·çå¤ç·£æå»¶ä¼¸ç¸äº¤ï¼æä»¥ï¼ç¶éå ©æ¢ç¸äº¤ç·çç¸äº¤è§åº¦è¶å°ç話ï¼ä»åç延伸交æé»å°±æè¶é é¢å §ç·£é£æ¥é»ï¼èä¸é¨èè§åº¦è®å°ï¼è·é¢åææ¸åå¢é·ã
miterLimit æéå¶å»¶ä¼¸äº¤æé»æé å¯ä»¥é¢å §ç·£é£æ¥é»å°å¤é ï¼ç¶å»¶ä¼¸äº¤æé»çè½é»è¶ åºéåç¯åï¼é£éº¼ä¾¿ä»¥æé¢(bevel)ä½çºäº¤æ¥æ¨£å¼ãè«æ³¨æï¼æå¤§ miter é·åº¦çºç·å¯¬ä¹æ¼ miterLimit å¼ï¼æä»¥ miterLimit å¯ä»¥ç¨ç«æ¼ç®å顯示縮æ¾å°ºå¯¸æå ¶ä»è®å½¢è¨å®ã
miterLimit é è¨å¼çº 10.0ã
æ´ç²¾ç¢ºä¾èªªï¼miter éå¶æ¯æå»¶ä¼¸é·åº¦(å¨ HTML ç«å¸ä¸ï¼éåé·åº¦æ¯å¤ç·£ç¸äº¤è§å°é£æ¥å段çå ±å繪åè·¯ç¶çµé»)ç¸å°æ¼ä¸åç·å¯¬çæå¤§å 許æ¯çï¼ä¹çåæ¼ï¼å¤ç·£è·å §ç·£ç¸äº¤é»ä¹è·é¢ç¸å°æ¼ç·å¯¬ççæå¤§å 許æ¯çï¼ç¸ç¶æ¼ï¼é£æ¥åæå°å §ç·£è§çä¸åè§åº¦çé¤å²(cosecant)å¼, å°æ¼æ¤å¼å便以æé¢(bevel)ä½çºäº¤æ¥æ¨£å¼:
miterLimit
= max miterLength
/ lineWidth
= 1 / sin ( min θ / 2 )ä¸é¢æ¯ä¸åç¯ä¾ï¼å ¶ä¸èç·æ¨ç¤ºåºååç·æ¢ç¹ªåè·¯å¾çèµ·å§é»èçµé»ã
åè¥è¨å®ç¯ä¾ç¨å¼ç¢¼ä¸ç miterLimit 使¼ 4.2ï¼ææç miter 交æ¥é½æè¢«ç§»é¤ï¼åè代ä¹çæ¯åºç¾å¨èç·éè¿ç bevel 交æ¥ï¼åè¥è¨å® miterLimit å¤§æ¼ 10ï¼é£éº¼å¤§é¨åç miter 交æ¥é½æåºç¾ï¼èä¸ä½ æç¼ç¾ï¼ç±å·¦å°å³ï¼miter é·åº¦é漸縮çï¼éæ¯ç±æ¼ç·æ¢ç¸äº¤è§åº¦é漸å 大乿 ï¼åè¥è¨å®ä¸éå¼ï¼é£éº¼å·¦éæåºç¾ bevel 交æ¥ï¼å³éæåºç¾ miter 交æ¥ã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
// Clear canvas
ctx.clearRect(0, 0, 150, 150);
// Draw guides
ctx.strokeStyle = "#09f";
ctx.lineWidth = 2;
ctx.strokeRect(-5, 50, 160, 50);
// Set line styles
ctx.strokeStyle = "#000";
ctx.lineWidth = 10;
// check input
if (document.getElementById("miterLimit").value.match(/\d+(\.\d+)?/)) {
ctx.miterLimit = parseFloat(document.getElementById("miterLimit").value);
} else {
alert("Value must be a positive number");
}
// Draw lines
ctx.beginPath();
ctx.moveTo(0, 100);
for (i = 0; i < 24; i++) {
var dy = i % 2 == 0 ? 25 : -25;
ctx.lineTo(Math.pow(i, 1.5) * 2, 75 + dy);
}
ctx.stroke();
return false;
}
<table>
<tr>
<td><canvas id="canvas" width="150" height="150"></canvas></td>
<td>
Change the <code>miterLimit</code> by entering a new value below and
clicking the redraw button.<br /><br />
<form onsubmit="return draw();">
<label>Miter limit</label>
<input type="text" size="3" id="miterLimit" />
<input type="submit" value="Redraw" />
</form>
</td>
</tr>
</table>
document.getElementById("miterLimit").value = document
.getElementById("canvas")
.getContext("2d").miterLimit;
draw();
漸層
å¦åå ¶ä»ç¹ªåè»é«å¯ä»¥ç«åºç·æ§åæ¾å°ççæ¼¸å±¤åæ¡ï¼ééè¨å® fillStyle å strokeStyle 屬æ§çº canvasGradient 漸層ç©ä»¶ï¼æåä¹å¯ä»¥å¨ canvas ä¸åå°ä¸æ¨£çææãè¦åµé 漸層ç©ä»¶ï¼å¯ä»¥ä½¿ç¨ä¸é¢çæ¹æ³:
createLinearGradient(x1, y1, x2, y2)
ç¢çä¸åç·æ§æ¼¸å±¤ç©ä»¶ï¼å ¶æ¼¸å±¤èµ·å§é»çº(x1, y1)ãçµé»çº(x2, y2)ã
createRadialGradient(x1, y1, r1, x2, y2, r2)
ç¢çä¸åæ¾å°ç漸層ç©ä»¶ï¼ç¬¬ä¸ååä¹åå¿è½å¨(x1, y1)ãåå¾çº r1ï¼ç¬¬ä¸ååä¹åå¿è½å¨(x2, y2)ãåå¾çº r2ã
ä¾å¦:
var lineargradient = ctx.createLinearGradient(0, 0, 150, 150);
var radialgradient = ctx.createRadialGradient(75, 75, 0, 75, 75, 100);
䏿¦ç¢çäº canvasGradient 漸層ç©ä»¶ï¼æåç¨ addColorStop()æ¹æ³å¯ä»¥æ·»å é¡è²ä¸å»ã
gradient.addColorStop(position, color)
æ¼ gradient 漸層ç©ä»¶å»ºç«ä¸åé¡è²é»ï¼å
¶ä¸ color æ¯ CSS<color>
çå串表示ï¼è position 仿¼ 0.0 å° 1.0 ä¹éï¼å®ç¾©äºè©²é¡è²å¨æ¼¸å±¤ä¸çç¸å°ä½ç½®ãå¼å«éåæ¹æ³ææå®ç¶é²è¡å°è¨å®çä½ç½®æï¼æ¼¸å±¤éè¦å®å
¨è½è®æè¨å®çé¡è²ã
æåå¯ä»¥æç §éè¦è¨å®ç¡æ¸åé¡è²é»ï¼ä¸é¢æ¯ä¸åç°¡å®çç±ç½å°é»çç°¡å®æ¼¸å±¤ç¯ä¾ç¨å¼ç¢¼ã
var lineargradient = ctx.createLinearGradient(0, 0, 150, 150);
lineargradient.addColorStop(0, "white");
lineargradient.addColorStop(1, "black");
createLinearGradient
ç¯ä¾
æ¬ç¯ä¾ä¸ï¼æåå°å»ºç«å ©ç¨®æ¼¸å±¤ï¼å¦ç¯ä¾æç¤ºï¼strokeStyle å fillSyle 屬æ§é½å¯ä»¥æ¥å canvasGradient ç©ä»¶ä½çºå±¬æ§å¼ã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
// Create gradients
var lingrad = ctx.createLinearGradient(0, 0, 0, 150);
lingrad.addColorStop(0, "#00ABEB");
lingrad.addColorStop(0.5, "#fff");
lingrad.addColorStop(0.5, "#26C000");
lingrad.addColorStop(1, "#fff");
var lingrad2 = ctx.createLinearGradient(0, 50, 0, 95);
lingrad2.addColorStop(0.5, "#000");
lingrad2.addColorStop(1, "rgba(0,0,0,0)");
// assign gradients to fill and stroke styles
ctx.fillStyle = lingrad;
ctx.strokeStyle = lingrad2;
// draw shapes
ctx.fillRect(10, 10, 130, 130);
ctx.strokeRect(50, 50, 50, 50);
}
<canvas id="canvas" width="150" height="150"></canvas>
第ä¸å漸層çºèæ¯æ¼¸å±¤ï¼ç¯ä¾ä¸æåå¨ä¸åä½ç½®ä¸æå®äºå ©ç¨®é¡è²(ç½è²å°ç¶ è²)ï¼é樣åæç¢çé常çªç¶çé¡è²è½æï¼ä¸è¬ä¾èªªï¼ä¸ç®¡å¦ä½è¨å®é¡è²é»é åºé½æ²éä¿ï¼ç¶èå°±éåä¾åèè¨ï¼éç¨®ä½æ³å¤ªéå¼·çäºï¼ä½æ¯å¦æéæ¯ä½ æ³è¦çé¡è²æ¼¸å±¤é åºï¼é£å ¶å¯¦ä¹æ¯å¯ä»¥ã
第äºå漸層起å§ä½ç½®(position 0.0)çé¡è²ä¸¦æ²æè¢«æå®ï¼æä»¥ä¸ä¸å漸層é¡è²æèªå被è¨çºèµ·å§ä½ç½®é¡è²ï¼å æ¤å³ä½¿æåæ²ææå®æ¼¸å±¤èµ·å§ä½ç½®é¡è²ä¹æ²æéä¿ï¼å°±åæ¬ç¯ä¾èªåæè¨å®èµ·å§ä½ç½®çé¡è²çæ¼ä½ç½® 0.5 çé»è²ã
createRadialGradient
ç¯ä¾
ééæåå®ç¾©äºå種æ¾å°ç漸層ï¼ç¸è¼æ¼ä¸è¬å¨ Photoshop çå°çãç¶å ¸ãæ¾å°çæ¼¸å±¤åæ¡(漸層å¾ä¸ååæ¡ä¸å¿é»åå¤ååå¿ç延伸)ï¼å çºæåå¯ä»¥æ§å¶æ¼¸å±¤èµ·å§åçµæ¢é»ï¼æåå¯ä»¥åå°æ´å¥½çææã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
// Create gradients
var radgrad = ctx.createRadialGradient(45, 45, 10, 52, 50, 30);
radgrad.addColorStop(0, "#A7D30C");
radgrad.addColorStop(0.9, "#019F62");
radgrad.addColorStop(1, "rgba(1,159,98,0)");
var radgrad2 = ctx.createRadialGradient(105, 105, 20, 112, 120, 50);
radgrad2.addColorStop(0, "#FF5F98");
radgrad2.addColorStop(0.75, "#FF0188");
radgrad2.addColorStop(1, "rgba(255,1,136,0)");
var radgrad3 = ctx.createRadialGradient(95, 15, 15, 102, 20, 40);
radgrad3.addColorStop(0, "#00C9FF");
radgrad3.addColorStop(0.8, "#00B5E2");
radgrad3.addColorStop(1, "rgba(0,201,255,0)");
var radgrad4 = ctx.createRadialGradient(0, 150, 50, 0, 140, 90);
radgrad4.addColorStop(0, "#F4F201");
radgrad4.addColorStop(0.8, "#E4C700");
radgrad4.addColorStop(1, "rgba(228,199,0,0)");
// draw shapes
ctx.fillStyle = radgrad4;
ctx.fillRect(0, 0, 150, 150);
ctx.fillStyle = radgrad3;
ctx.fillRect(0, 0, 150, 150);
ctx.fillStyle = radgrad2;
ctx.fillRect(0, 0, 150, 150);
ctx.fillStyle = radgrad;
ctx.fillRect(0, 0, 150, 150);
}
<canvas id="canvas" width="150" height="150"></canvas>
ç¨å¼ç¢¼ç¯ä¾ä¸ï¼çºäºçé åº 3D ææï¼æåè®èµ·å§é»åçµæ¢é»ä½æ¼ä¸åä½ç½®ï¼è«æ³¨æï¼æå¥½ä¸è¦è®å §å¤åç¸éçï¼ä»¥é¿å é£ä»¥é 測ç奿ªææã
æ¯ä¸åæ¼¸å±¤åæ¡æå¾ä¸å漸層è²é½æ¯å ¨éæçï¼å¦æå¸æåæ¸ç¬¬äºå漸層è²è½å¤ å¹³é å°è½æå°éåæå¾ä¸å漸層è²ï¼é£éº¼å ©è æè©²è¨å®ä¸æ¨£çé¡è²å¼ï¼åæ¯ç¨å¼ç¢¼ç¯ä¾ä¸çæ¼¸å±¤è² #019F62 å ¶å¯¦å°±çæ¼ rgba(1,159,98,1)ã
樣å¼(Patterns)å åçç¯ä¾ä¸ï¼æå齿¯èç±è¿´åä¾éè¤ç¢ç影忍£å¼ï¼ä¸éå ¶å¯¦æä¸æ¢æ´ç°¡å®çæ¹æ³ï¼é£å°±æ¯å¼å« createPattern æ¹æ³ã
createPattern(image, type)
å¼å« createPattern()æç¢ä¸åç«å¸æ¨£å¼ç©ä»¶ï¼ç¶å¾åå³åºä¾ã å
¶ä¸ image æ¯CanvasImageSourceé¡å¥ç©ä»¶(忝HTMLImageElement
,ã<canvas>å
ç´ ã<video>
å
ç´ ç)
Type æ¯ä¸ä¸²å串ï¼å®ç¾©äºå¦ä½ç¢ç樣å¼ï¼å 許ç弿:
repeat
沿åç´èæ°´å¹³æ¹åéè¤æåå½±å
repeat-x
åªæ²¿æ°´å¹³æ¹åéè¤æåå½±å
repeat-y
åªæ²¿åç´æ¹åéè¤æåå½±å
no-repeat
ä¸éè¤æåå½±åï¼åªä½¿ç¨ä¸æ¬¡
åè¨»ï¼ Firefox ç¾å¨åªæ¯æ´ repeatï¼æä»¥å ¶ä»å¼é½æ¯ç¡æç
åè¨»ï¼ å³å ¥å°ºå¯¸çº 0x0 åç´ çç«å¸æå¼èµ·é¯èª¤
å©ç¨ createPattern()çæ¹æ³ååé¢å©ç¨æ¼¸å±¤çæ¹æ³ååé¡ä¼¼ï¼æåå¼å« createPattern()ç¢çCanvasPattern
ç©ä»¶ï¼ç¶å¾å°{CanvasPattern}ç©ä»¶è¨æ fillStyle æ strokeStyle ç屬æ§å¼ï¼ä¾å¦:
var img = new Image();
img.src = "someimage.png";
var ptrn = ctx.createPattern(img, "repeat");
åè¨»ï¼ ä¸å drawImage()æ¹æ³ï¼å¼å« createPattern()æ¹æ³åå½±åå¿ é è¦å è¼å ¥å®æï¼å¦åå¯è½ååçç¨çææåé¡ã
createPattern
ç¯ä¾
éåç¯ä¾ä¸æåæ fillStyle
屬æ§å¼åçºæ¨£å¼ç©ä»¶ï¼æ¯è¼å¼å¾æ³¨æçæ¯å½±å onload
äºä»¶èçå¨ï¼éæ¯çºäºç¢ºä¿å½±åè¼å
¥å®æå¾åé²è¡ã
function draw() {
const ctx = document.getElementById("canvas").getContext("2d");
// å»ºç«æ°çãç¨ä½æ¨£å¼çååç©ä»¶
const img = new Image();
img.src = "canvas_createpattern.png";
img.onload = () => {
// å»ºç«æ¨£å¼
const ptrn = ctx.createPattern(img, "repeat");
ctx.fillStyle = ptrn;
ctx.fillRect(0, 0, 150, 150);
};
}
<canvas id="canvas" width="150" height="150" role="presentation"></canvas>
çµæå¦ä¸ :
é°å½±è¦ç¢çé°å½±åªéè¦åå屬æ§:
shadowOffsetX = float
代表é°å½±å¾ç©ä»¶å»¶ä¼¸åºä¾çæ°´å¹³è·é¢ï¼é è¨çº 0ï¼ä¸åè®å½¢ç©é£å½±é¿ã
shadowOffsetY = float
代表é°å½±å¾ç©ä»¶å»¶ä¼¸åºä¾çåç´è·é¢ï¼é è¨çº 0ï¼ä¸åè®å½¢ç©é£å½±é¿ã
shadowBlur = float
代表é°å½±æ¨¡ç³å¤§å°ç¯åï¼é è¨çº 0ï¼ä¸åè®å½¢ç©é£å½±é¿ï¼ä¸çåæ¼åç´ å¼ã
shadowColor = <color>
CSS é¡è²å¼ï¼ä»£è¡¨é°å½±é¡è²ï¼é è¨çºå ¨éæã
shadowOffsetXåshadowOffsetYææ±ºå®é°å½±å»¶ä¼¸å¤§å°ï¼è¥æ¯çºæ£å¼ï¼åé°å½±æå¾å³(沿X軸)åå¾ä¸(沿Y軸)延伸ï¼è¥æ¯çºè² å¼ï¼åæå¾æ£å¼ç¸åæ¹å延伸ã
åè¨»ï¼ åºæ¼ HTML5 æè°è¦æ ¼è®æ´ï¼å¾ éå§ï¼é°å½±åªæå¨ source-over çæ§åæåä¸ç¢ç
æåé°å½±ç¯ä¾æ¬ç¨å¼ç¢¼ç¯ä¾æç¢çä¸ä¸²å¸¶æé°å½±çæåã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
ctx.shadowOffsetX = 2;
ctx.shadowOffsetY = 2;
ctx.shadowBlur = 2;
ctx.shadowColor = "rgba(0, 0, 0, 0.5)";
ctx.font = "20px Times New Roman";
ctx.fillStyle = "Black";
ctx.fillText("Sample String", 5, 30);
}
<canvas id="canvas" width="150" height="80"></canvas>
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4