canvas(三) 顏色和樣式

使用樣式和顏色


色彩 colors

如果想要給圖形上色,有兩個重要的屬性可以做到:fillStylestrokeStyle

fillStyle = color
設置圖形的填充顏色。

strokeStyle = color
設置圖形輪廓的顏色。

color可以是表示css顏色值的字符串,漸變對象或者圖案對象。默認情況下,線條和填充顏色都是黑色的(#000000)。

下面的例子表示的都是同一種例子:

//這些fillStyle的值均為‘橙色’
ctx.fillStyle = 'orange'
ctx.fillStyle = '#ffa500'
ctx.fillStyle = 'rgb(255,165,0)'
ctx.fillStyle = 'rbga(155,165,0,1)'

fillStyle 示例

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);
        }
    }
}
fillStyle示例
fillStyle示例

利用兩層for循環來繪制方格列陣,每個方格不同的顏色。通過每次循環都設置不同的fillStyle 的值。

strokeStyle 示例

同fillStyle的示例相似,通過循環來變換 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(' + Math.floor(255-42.5*i) + ',' + 
                       Math.floor(255-42.5*j) + ',0)';
            ctx.beginPath();
            ctx.arc(12.5+j*25,12.5+i*25,10,0,Math.PI*2,true)
            ctx.stroke();
        }
    }
}
此處輸入圖片的描述
此處輸入圖片的描述

透明度 Transparency

除了可以繪制實色圖形,還可以用canvas來繪制半透明的圖形。通過設置 globalAlpha 屬性或者使用一個半透明顏色作為輪廓或者填充色。

globalAlpha = transparencyValue
這個屬性影響到canvas里所有的圖形透明度,有效范圍是0.0(完全透明)到1.0(完全不透明),默認是1.0。

globalApha 屬性需要在繪制全局擁有透明度相同的圖形時,如果需要改變單個圖形的透明度,設置 strokeStylefillStyle 的屬性為 rgba 類型。

ctx.fillStyle = "rgba(255,0,0,0.5)"
ctx.strokeStyle = "rgba(255,0,0,0.5)"

線型 Line style

可以通過一系列屬性來設置線的樣式。

lineWidth = value
設置線條的寬度。默認值為1.0。

lineCap = type
設置線條末端樣式。butt round square 默認是 butt

lineJoin = type
設定線條與線條間結合處的樣式。 round bevelmiter 默認是miter

miterLimit = value
限制當兩條線相交時交接處最大的長度,所謂交接處長度是指線條交接處內角頂點到另外角頂點的長度。

getLineDash()
返回一個包含當前虛線樣式,長度為非負數的數組。

setLineDash(segments)
設置當前虛線樣式。

lineDashOffset = value
設置虛線樣式的起始偏移量。

lineWidth 屬性的例子

這個屬性設置當前繪線的粗細,屬性值必須為正數。默認值是1.0。

function draw() {
    let canvas = document.getElementById('tutorial')
    if (canvas.getContext) {
        let ctx = canvas.getContext('2d');
        
        for(var i = 0;i<10;i++){
            ctx.lineWidth = 1+i  //遞增增加lineWidth
            ctx.beginPath()
            ctx.moveTo(5+i*14,5)
            ctx.lineTo(5+i*14,140)
            ctx.stroke()
        }
    }
}
lineWidth
lineWidth

lineCap 屬性的例子

屬性lineCap 的值決定了線段端點顯示的樣子。可以為下面的三種樣式butt round square 默認是butt

function draw() {
let canvas = document.getElementById('tutorial')
    if (canvas.getContext) {
        let ctx = canvas.getContext('2d');
        var lineCap = ['butt', 'round', 'square'];
        // 創建路徑
        ctx.strokeStyle = '#09f';
        ctx.beginPath();
        ctx.moveTo(10, 10);
        ctx.lineTo(140, 10);
        ctx.moveTo(10, 140);
        ctx.lineTo(140, 140);
        ctx.stroke();

        // 畫線條
        ctx.strokeStyle = 'black';
        for (let 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()
        }
    }
}
lineCap
lineCap

最左邊的線用了默認的butt。中間的是 round效果,端點處加了半徑為一半線寬的半圓,右邊的是square的效果,端點處加上了等寬且高度為一半線寬的方塊。

lineJoin 屬性的例子

lineJoin的屬性值決定了圖形中兩線段連接處所顯示的樣子,可以為以下三種樣式: round bevelmiter 默認是 miter

function draw() {
    let canvas = document.getElementById('tutorial')
    if (canvas.getContext) {
        let ctx = 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();
        }
    }
}
lineJoin
lineJoin

用三條折線來做例子,分別設置不同的lineJoin值。最上面一條是 round 的效果,邊角處被磨圓了,圓的半徑等于線寬。中間為bevel效果,下層為miter效果。當值為miter效果時,線段會在連接處外側延伸直至交于一點,延伸效果受到 miterLimit 屬性的制約。

miterLimit 屬性的演示例子

當設置 lineJoin 的屬性為 miter 的效果時,線段的外側邊緣會延伸交匯于一點上。線段夾角越小焦點的距離越大。

miterLimit 屬性就是用來設定外延交點與連接點的最大距離,如果交點距離大于這個值,連接效果就會變為 bevel

使用虛線

setLineDash([a,b]) 方法和 lineDashOffset 屬性來制定虛線樣式。 setLineDash 方法接受一個數組,來指定線段與間隙的交替,lineDashOffset 屬性設置起始偏移量。

function draw() {
    let canvas = document.getElementById('tutorial')
    if (canvas.getContext) {
        let ctx = canvas.getContext('2d');

        ctx.setLineDash([5,15]) //設置交替量為5,15
        ctx.lineDashOffset = 2
        ctx.beginPath()
        ctx.moveTo(0,50)
        ctx.lineTo(400,50)

        ctx.stroke()
    }
}
QQ圖片20171103085448.png

漸變 Gradients

像一般的繪圖軟件一樣,可以使用線性或者徑向的漸變來填充或者描邊。

使用下面的方法新建一個 canvasGradient 對象,并且賦值給圖形的 fillStyle 或者 strokeStyle 屬性。

createLinearGradient(x1,y1,x2,y2)
createLinearGradient 方法接受4個參數,表示漸變的起點(x1,y1) 與終點 (x2,y2)。

createRadialGradient(x1,y1,r1,x2,y2,r2)
createRadialGradient(x1,y1,r1,x2,y2,r2) 方法接受6個參數,前三個定義一個以(x1,y1)為圓心,半徑為r1的圓,后三個參數定義另一個以(x2,y2)為圓心,半徑為r2的圓。

let lineGradient = ctx.createLinearGradient(0,0,150,150)
let radialGradient = ctx.createLinearGradient(75,75,0,75,75,100)

在創建完 canvasGradient 對象之后就可以使用 addColorStop 添加顏色了。

canvasGradient.addColorStop(position,color)
addColorStop 方法接受2個參數,position 參數必須是一個0.0 到 1.0 之間數值,表示漸變中顏色所在的相對位置。例如,0.5 表示顏色會出現在正中間。 color 參數必須是一個有效的css顏色值。

可以添加任意多個色標,下面是最簡單的線性黑白漸變的例子。

let linearGradient = ctx.createLineGradient(0,0,150,150)
linearGradient.addColorStop(0.0,'white')
linearGradient.addColorStop(1,'black')

createLinearGradient 的例子

在例子中設置了兩種不同的漸變。設置漸變的步驟是 創建canvasGradient 對象 --> 使用addcolorStop 設置漸變色標 --> 將 canvasGradient 賦值給 fillStyle 或者 strokeStyle --> 使用 fillRect 或者 strokeRect 繪制圖形

function draw() {
    let canvas = document.getElementById('tutorial')
    if (canvas.getContext) {
        let ctx = 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);

    }
}
此處輸入圖片的描述
此處輸入圖片的描述

createRadialGrdient 的例子

function draw() {
  var ctx = document.getElementById('canvas').getContext('2d');

  // 創建漸變
  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)');
  
  // 畫圖形
  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);
}
此處輸入圖片的描述
此處輸入圖片的描述

圖案樣式 Patterns

createPattern(image,type)
該方法接受兩個參數,image 可以是一個 image 對象的引用,或者另一個canvas對象。 type 必須為下列的參數值之一: repeat repeat-x repeat-y no-repeat

圖案的應用跟漸變很類似的,創建出一個pattern之后,賦值給 fillStyle 或者 strokeStyle 屬性即可。

function draw() {
    let canvas = document.getElementById('tutorial')
    if (canvas.getContext) {
        let ctx = canvas.getContext('2d');

        //創建image對象 用作圖案
        var img = new Image();
        img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png'
        //使用onload 確保圖片已經被加載
        img.onload = function(){
            var ptrn = ctx.createPattern(img,'repeat')
            ctx.fillStyle = ptrn
            ctx.fillRect(0,0,150,150)
        }
    }
}
此處輸入圖片的描述
此處輸入圖片的描述

陰影 Shadows

shadowOffsetX = float shadowOffsetY = float
shadowOffsetXshadowOffsetY 用來設定陰影在X 和 Y 軸的延伸距離,它們是不受變換矩陣所影響的,負值表示陰影會向上或者向左延伸,正值則表示會往下或者右延伸,它們都默認為 0。

shadowBlur = float
shadowBlur 用于設定陰影的模糊程度,其數值并不跟像素數量掛鉤,也不受變換矩陣的影響,默認為 0 。

shadowColor = color
shadowColor 使用標準的css 顏色值,設定陰影的顏色

文字陰影的例子

function draw() {
    let canvas = document.getElementById('tutorial')
    if (canvas.getContext) {
        let ctx = canvas.getContext('2d');
        //設置陰影
        ctx.shadowOffsetX = 2
        ctx.shadowOffsetY = 2
        ctx.shadowBlur = 5
        ctx.shadowColor = "rgba(0,0,0,0.5)"

        //設置文字
        ctx.font = "20px Times New Roman"      
        ctx.fillStyle = 'black'
        ctx.fillText("Sample String", 5, 30);

    }
}
shadow
shadow
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • 一:canvas簡介 1.1什么是canvas? ①:canvas是HTML5提供的一種新標簽 ②:HTML5 ...
    GreenHand1閱讀 4,704評論 2 32
  • 熟悉html5的程序員們肯定都知道 元素,該元素是用來在頁面中規定一塊區域,然后由js在該區域內繪制圖形。canv...
    米幾V閱讀 2,184評論 1 5
  • 一、簡介 HTML5 中的定義:“它是依賴分辨率的位圖畫布,你可以在 canvas 上面繪制任何圖形,甚至加載照片...
    destiny0904閱讀 10,570評論 1 4
  • 一、canvas簡介 1.1 什么是canvas?(了解) 是HTML5提供的一種新標簽 Canvas是一個矩形區...
    Looog閱讀 3,948評論 3 40
  • 小時候媽媽說,男人不要輕易給人承諾,說到就要辦到。 長大后,也沒有和人有過地老天荒的海誓山盟,沒有合適的人,有了,...
    大叔早安閱讀 173評論 0 0