Canvas教程(6)——線條的屬性

線條屬性概述

線條的屬性共有以下四個:

1寻歧、lineCap屬性

lineCap 定義上下文中線的端點麦萤,可以有以下 3 個值错森。

  • butt:默認值俄讹,端點是垂直于線段邊緣的平直邊緣。
  • round:端點是在線段邊緣處以線寬為直徑的半圓邑商。
  • square:端點是在選段邊緣處以線寬為長摄咆、以一半線寬為寬的矩形。

2人断、 lineJoin屬性

lineJoin 定義兩條線相交產(chǎn)生的拐角吭从,可將其稱為連接。在連接處創(chuàng)建一個填充三角形恶迈,可以使用 lineJoin 設(shè)置它的基本屬性涩金。

  • miter:默認值,在連接處邊緣延長相接。miterLimit 是角長和線寬所允許的最大比例(默認是 10)步做。
  • bevel:連接處是一個對角線斜角副渴。
  • round:連接處是一個圓。

3全度、線寬

lineWidth 定義線的寬度(默認值為 1.0)煮剧。

4、筆觸樣式

strokeStyle 定義線和形狀邊框的顏色和樣式将鸵。

后面兩個前面已經(jīng)說過了勉盅,這里我們著重來看看前兩個屬性。

線條的帽子lineCap

廢話不多說顶掉,直接上代碼看效果菇篡。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>線條的帽子</title>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">
        你的瀏覽器居然不支持Canvas?一喘!趕快換一個吧G埂!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");

        context.lineWidth = 50;
        context.strokeStyle = "#1BAAAA";

        context.beginPath();
        context.moveTo(100,100);
        context.lineTo(700,100);
        context.lineCap = "butt";
        context.stroke();

        context.beginPath();
        context.moveTo(100,300);
        context.lineTo(700,300);
        context.lineCap = "round";
        context.stroke();

        context.beginPath();
        context.moveTo(100,500);
        context.lineTo(700,500);
        context.lineCap = "square";
        context.stroke();

        //下面畫兩個基準線方便觀察
        context.lineWidth = 3;
        context.strokeStyle = "black";

        context.beginPath();
        context.moveTo(100,0);
        context.lineTo(100,600);
        context.moveTo(700,0);
        context.lineTo(700,600);
        context.stroke();
    }
</script>
</body>
</html>

演示 6-1

運行結(jié)果:

線條的帽子

這里我還做了兩條平行線做一下參考凸克,這樣一眼就能看清lineCap三個值的特點议蟆。但要注意,這個帽子只在線條的端點處起作用萎战,哪怕是折點很多的折線咐容,也僅僅是在開始和終止的兩個端點帶帽子。如果想改變線條折點(兩個線段的連接處)的樣式蚂维,那就要用到下面的lineJoin屬性戳粒。

線條的連接lineJoin

廢話不多說,直接上代碼看效果虫啥。這段代碼改自4-3蔚约,只是設(shè)置了一下連接的屬性。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>線條的連接</title>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">
        你的瀏覽器居然不支持Canvas涂籽?苹祟!趕快換一個吧!评雌!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");

        context.beginPath();
        context.moveTo(100,100);
        context.lineTo(300,300);
        context.lineTo(100,500);
        context.lineJoin = "miter";
        context.lineWidth = 20;
        context.strokeStyle = "red";
        context.stroke();

        context.beginPath();
        context.moveTo(300,100);
        context.lineTo(500,300);
        context.lineTo(300,500);
        context.lineJoin = "bevel";
        context.lineWidth = 20;
        context.strokeStyle = "blue";
        context.stroke();

        context.beginPath();
        context.moveTo(500,100);
        context.lineTo(700,300);
        context.lineTo(500,500);
        context.lineJoin = "round";
        context.lineWidth = 20;
        context.strokeStyle = "black";
        context.stroke();
    }
</script>
</body>
</html>

演示 6-2

運行結(jié)果:

線條的連接

看不清的童鞋自己放大網(wǎng)頁或者自己將代碼的線寬調(diào)寬一點树枫。

這里有一個很隱蔽的屬性,就是當lineJoin設(shè)置為miter時(默認)景东,會解鎖一個成績砂轻,可以使用miterLimit屬性。

舉個例子看看斤吐。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>miterLimit</title>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">
        你的瀏覽器居然不支持Canvas搔涝?丝里!趕快換一個吧!体谒!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");

        context.beginPath();
        context.moveTo(100,100);
        context.lineTo(300,300);
        context.lineTo(100,500);
        context.lineJoin = "miter";
        context.miterLimit = 10;
        context.lineWidth = 5;
        context.strokeStyle = "red";
        context.stroke();

        context.beginPath();
        context.moveTo(300,200);
        context.lineTo(500,300);
        context.lineTo(300,400);
        context.lineJoin = "miter";
        context.miterLimit = 10;
        context.lineWidth = 5;
        context.strokeStyle = "blue";
        context.stroke();

        context.beginPath();
        context.moveTo(500,290);
        context.lineTo(700,300);
        context.lineTo(500,310);
        context.lineJoin = "miter";
        context.miterLimit = 10;
        context.lineWidth = 5;
        context.strokeStyle = "black";
        context.stroke();
    }
</script>
</body>
</html>

演示 6-3

運行結(jié)果:

miterLimit

會發(fā)現(xiàn),這個miterLimit規(guī)定了一個自動填充連接點的極限值臼婆。如果超過了這個值抒痒,會導(dǎo)致lineJoin屬性失效,會從 miter 變成 bevel颁褂」氏欤可以看出來,這個值和線寬以及夾角有關(guān)颁独,具體是啥關(guān)系彩届。看下圖誓酒。

miterLimit

可以看到樟蠕,關(guān)系有點復(fù)雜。有興趣的小伙伴可以推導(dǎo)一下這個值與線寬靠柑、夾角的函數(shù)關(guān)系寨辩。其實,大多時候用不到這個隱藏屬性歼冰,即便用到了也是憑感覺寫個數(shù)然后不滿意再調(diào)試即可靡狞。

高級線段繪制舉例

實際在畫布上繪制線段時,會有一些奇怪的現(xiàn)象發(fā)生隔嫡,這里融合本節(jié)課學(xué)到的兩個線段的屬性講解一個甸怕。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>miterLimit</title>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">
        你的瀏覽器居然不支持Canvas?腮恩!趕快換一個吧I液肌!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");

        // 實例1: 圓形端點,斜角連接,在畫布左上角
        context.beginPath();
        context.moveTo(0,0);
        context.lineTo(180,0);
        context.lineTo(180,180);
        context.lineJoin = 'bevel';
        context.lineCap = 'round';
        context.lineWidth = 10;
        context.strokeStyle = "red";
        context.stroke();

        // 實例2: 圓形端點,斜角連接,不在畫布左上角
        context.beginPath();
        context.moveTo(300,200);
        context.lineTo(480,200);
        context.lineTo(480,380);
        context.lineJoin = 'bevel';
        context.lineCap = 'round';
        context.lineWidth = 10;
        context.strokeStyle = "blue";
        context.stroke();

        // 實例3: 平直端點,圓形連接,不在畫布左上角
        context.beginPath();
        context.moveTo(600,400);
        context.lineTo(780,400);
        context.lineTo(780,580);
        context.lineJoin = 'round';
        context.lineCap = 'butt';
        context.lineWidth = 10;
        context.strokeStyle = "black";
        context.stroke();
    }
</script>
</body>
</html>

演示 6-4

運行結(jié)果:

高級線段繪制舉例

這 3 個線段和連接的實例有助于說明在畫布上繪制線段時不同屬性的組合秸滴。

實例 1 嘗試從畫布左上角開始繪制式曲,結(jié)果發(fā)生了一個奇怪的現(xiàn)象。Canvas 路徑在 x 軸和 y 軸方向上都繪制到了起點的外側(cè)缸榛。由于這個原因?qū)嵗?1 上面的線看起來要細些吝羞。另外,左上角水平部分中圓形端點也無法看到内颗,它們都被繪制到了屏幕之外的負值坐標區(qū)域钧排。此外,lineJoin 定義的對角線斜角也沒有繪出均澳。

實例 2 調(diào)整了例子 1 中出現(xiàn)的問題,將起始點離開左上角恨溜。這樣就繪制出了完整的水平線,并且圓形 lineCap 和斜角 lineJoin 都被繪制出來了符衔。

實例 3 顯示了去掉 lineCap 設(shè)置后的默認端點效果,并且將 lineJoin 調(diào)整為圓角。

至此糟袁,線條的所有內(nèi)容我們已經(jīng)說完了判族。這個看起來很簡單的一個線條,原來還有這么多內(nèi)容项戴!藝術(shù)家可不是那么好當?shù)男伟铮贿^想必也激發(fā)了童鞋們的求知欲。Canvas究竟有多少內(nèi)容等待著我們?nèi)グl(fā)現(xiàn)周叮?這是一個開始辩撑,讓我們繼續(xù)前行!??


如果您喜歡本書仿耽,請使用支付寶掃描下面的二維碼捐助作者合冀。

二維碼

謝謝您的支持!也歡迎您訂閱本書项贺。

如果書中有疏漏或錯誤之處君躺,敬請您指出,期待您的pull request开缎。如果有任何疑問也可以發(fā)送issue晰洒。

本人郵箱:airing@ursb.me

本人博客:http://ursb.me

本書地址:http://airingursb.gitbooks.io/canvas

本書github:http://github.com/airingursb/canvas

Canvas--Draw on the Web
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市啥箭,隨后出現(xiàn)的幾起案子谍珊,更是在濱河造成了極大的恐慌,老刑警劉巖急侥,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砌滞,死亡現(xiàn)場離奇詭異斗躏,居然都是意外死亡派草,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門掂墓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铝宵,“玉大人打掘,你說我怎么就攤上這事∨羟铮” “怎么了尊蚁?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侣夷。 經(jīng)常有香客問我横朋,道長,這世上最難降的妖魔是什么百拓? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任琴锭,我火速辦了婚禮晰甚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘决帖。我一直安慰自己厕九,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布地回。 她就那樣靜靜地躺著扁远,像睡著了一般。 火紅的嫁衣襯著肌膚如雪落君。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天亭引,我揣著相機與錄音绎速,去河邊找鬼。 笑死焙蚓,一個胖子當著我的面吹牛纹冤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播购公,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼萌京,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宏浩?” 一聲冷哼從身側(cè)響起知残,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎比庄,沒想到半個月后求妹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡佳窑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年制恍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片神凑。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡净神,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溉委,到底是詐尸還是另有隱情鹃唯,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布瓣喊,位于F島的核電站俯渤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏型宝。R本人自食惡果不足惜八匠,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一絮爷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梨树,春花似錦坑夯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至指巡,卻和暖如春淑履,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藻雪。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工秘噪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勉耀。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓指煎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親便斥。 傳聞我的和親對象是個殘疾皇子至壤,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

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