溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何繪制HTML5中的Canvas基本線條

發(fā)布時(shí)間:2021-09-14 18:11:53 來(lái)源:億速云 閱讀:147 作者:柒染 欄目:web開(kāi)發(fā)

本篇文章為大家展示了如何繪制HTML5中的Canvas基本線條,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

怎么畫(huà)線條?和現(xiàn)實(shí)中畫(huà)畫(huà)差不多:
1.移動(dòng)畫(huà)筆,使畫(huà)筆移動(dòng)至繪畫(huà)的開(kāi)始處
2.確定第一筆的停止點(diǎn)
3.規(guī)劃好之后,選擇畫(huà)筆(包括畫(huà)筆的粗細(xì)和顏色等)
4.確定繪制

因?yàn)镃anvas是基于狀態(tài)的繪制(很重要,后面會(huì)解釋),所以前面幾步都是在確定狀態(tài),最后一步才會(huì)具體繪制。
1.移動(dòng)畫(huà)筆(moveTo())
之前我們獲得了畫(huà)筆context,所以以此為例,給出改方法的使用實(shí)例——context.moveTo(100,100)。這句代碼的意思是移動(dòng)畫(huà)筆至(100,100)這個(gè)點(diǎn)(單位是px)。記住,這里是以canvas畫(huà)布的左上角為笛卡爾坐標(biāo)系的原點(diǎn),且y軸的正方向向下,x軸的正方向向右。
2.筆畫(huà)停點(diǎn)(lineTo())
同理,context.lineTo(600,600)。這句的意思是從上一筆的停止點(diǎn)繪制到(600,600)這里。不過(guò)要清楚,這里的moveTo()``lineTo()都只是狀態(tài)而已,是規(guī)劃,是我準(zhǔn)備要畫(huà),還沒(méi)有開(kāi)始畫(huà),只是一個(gè)計(jì)劃而已!
3.選擇畫(huà)筆
這里我們暫且只設(shè)置一下畫(huà)筆的顏色和粗細(xì)。
context.lineWidth = 5,這句話的意思是設(shè)置畫(huà)筆(線條)的粗細(xì)為10px。
context.strokeStyle = "#AA394C",這句話的意思是設(shè)置畫(huà)筆(線條)的顏色為玫紅色。
因?yàn)镃anvas是基于狀態(tài)的繪制,所以我們?cè)谶x擇畫(huà)筆粗細(xì)和顏色的同時(shí),其實(shí)也是選擇了線條的粗細(xì)和顏色。
4.確定繪制
確定繪制只有兩種方法,fill()和stroke(),有點(diǎn)繪畫(huà)基礎(chǔ)的應(yīng)該知道,前者是指填充,后者是指描邊。因?yàn)槲覀冎皇抢L制線條,所以只要描邊就可以了。調(diào)用代碼context.stroke()即可。


畫(huà)一個(gè)線條
不就一條線段嗎!廢話了這么多!那我們就開(kāi)始畫(huà)吧。

JavaScript Code復(fù)制內(nèi)容到剪貼板

  1. <!DOCTYPE html>   
    <html lang="zh">   
    <head>   
        <meta charset="UTF-8">   
        <title>從線條開(kāi)始</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.moveTo(100,100);   
            context.lineTo(600,600);   
            context.lineWidth = 5;   
            context.strokeStyle = "#AA394C";   
            context.stroke();   
        }   
    </script>   
    </body>   
    </html>

運(yùn)行結(jié)果:
如何繪制HTML5中的Canvas基本線條

(一直有小伙伴問(wèn)我頁(yè)面右下角的熊是什么鬼?哦哦,之前忘解釋了,那個(gè)是我的防偽水?。?
我還標(biāo)注了一個(gè)頁(yè)面解析圖,供大家參考。
如何繪制HTML5中的Canvas基本線條

這里我將原本<canvas>標(biāo)簽中的width和height去掉了,但在JavaScript代碼中設(shè)置了canvas對(duì)象的width和height的屬性。

小結(jié):要設(shè)置畫(huà)布的大小,只有這兩種方法

1.在<canvas>標(biāo)簽中設(shè)置;

2.在JS代碼中設(shè)置canvas的屬性.

怎么樣,是不是非常的酷。接下來(lái)我們要加快腳步了,繪制一個(gè)多線條組成的圖形。是不是感覺(jué)自己離藝術(shù)家又進(jìn)了一步呢?別看這只是簡(jiǎn)簡(jiǎn)單單的一條線段,這一畫(huà)只是我們的一小步,但卻是人類的一大步!

繪制折線
上面我們已經(jīng)成功繪制了一條線段。那么,如果我要繪制有兩個(gè)筆畫(huà)甚至是很多筆畫(huà)的折線怎么辦呢?
聰明的小伙伴肯定已經(jīng)想到了,這還不簡(jiǎn)單,復(fù)用lineTo()就可以了。下面我就獻(xiàn)丑隨便畫(huà)了一條優(yōu)美的折線~

JavaScript Code復(fù)制內(nèi)容到剪貼板

  1. <!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.moveTo(100,100);   
            context.lineTo(300,300);   
            context.lineTo(100,500);   
            context.lineWidth = 5;   
            context.strokeStyle = "#AA394C";   
            context.stroke();   
        }   
    </script>   
    </body>   
    </html>

運(yùn)行結(jié)果:
如何繪制HTML5中的Canvas基本線條


繪制多條折線
那同理,我們要繪制多條樣式各不相同的折線怎么辦呢?比如我們?cè)谶@里畫(huà)三條折線,分別是紅色、藍(lán)色、黑色。聰明的小伙伴肯定想到了,這還不簡(jiǎn)單,只需要平移一下再改下畫(huà)筆顏色就行了。代碼格式都一樣的,復(fù)制就可以了。代碼如下。

JavaScript Code復(fù)制內(nèi)容到剪貼板

  1. <!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.moveTo(100,100);   
            context.lineTo(300,300);   
            context.lineTo(100,500);   
            context.lineWidth = 5;   
            context.strokeStyle = "red";   
            context.stroke();   
      
            context.moveTo(300,100);   
            context.lineTo(500,300);   
            context.lineTo(300,500);   
            context.lineWidth = 5;   
            context.strokeStyle = "blue";   
            context.stroke();   
      
            context.moveTo(500,100);   
            context.lineTo(700,300);   
            context.lineTo(500,500);   
            context.lineWidth = 5;   
            context.strokeStyle = "black";   
            context.stroke();   
        }   
    </script>   
    </body>   
    </html>

運(yùn)行結(jié)果:
如何繪制HTML5中的Canvas基本線條

咦?是不是很奇怪?說(shuō)好的先紅色,再藍(lán)色,再黑色呢?怎么全是黑色了?其實(shí),這里的原因是我之前一直強(qiáng)調(diào)的一點(diǎn)&mdash;&mdash;Canvas是基于狀態(tài)的繪制。
什么意思呢?其實(shí)這段代碼每次使用stroke()時(shí),它都會(huì)把之前設(shè)置的狀態(tài)再繪制一遍。第一次stroke()時(shí),繪制一條紅色的折線;第二次stroke()時(shí),會(huì)再重新繪制之前的那條紅色的折線,但是這個(gè)時(shí)候的畫(huà)筆已經(jīng)被更換成藍(lán)色的了,所以畫(huà)出的折線全是藍(lán)色的。換言之,strokeStyle屬性被覆蓋了。同理,第三次繪制的時(shí)候,畫(huà)筆顏色是最后的黑色,所以會(huì)重新繪制三條黑色的折線。所以,這里看到的三條折線,其實(shí)繪制了3次,一共繪制了6條折線。
那么,我想繪制三條折線,難道就沒(méi)有辦法了嗎?藝術(shù)家之魂到此為止了么?沒(méi)救了么?不,還有辦法。
使用beginPath()開(kāi)始繪制
為了讓繪制方法不重復(fù)繪制,我們可以在每次繪制之前加上beginPath(),代表下次繪制的起始之處為beginPath()之后的代碼。我們?cè)谌卫L制之前分別加上context.beginPath()。

JavaScript Code復(fù)制內(nèi)容到剪貼板

  1. <!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è)吧?。?nbsp;  
        </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.lineWidth = 5;   
            context.strokeStyle = "red";   
            context.stroke();   
      
            context.beginPath();   
            context.moveTo(300,100);   
            context.lineTo(500,300);   
            context.lineTo(300,500);   
            context.lineWidth = 5;   
            context.strokeStyle = "blue";   
            context.stroke();   
      
            context.beginPath();   
            context.moveTo(500,100);   
            context.lineTo(700,300);   
            context.lineTo(500,500);   
            context.lineWidth = 5;   
            context.strokeStyle = "black";   
            context.stroke();   
        }   
    </script>   
    </body>   
    </html>

如何繪制HTML5中的Canvas基本線條

可以看到,這里得到了我們預(yù)想的結(jié)果。因?yàn)槭褂昧薭eginPath(),所以這里的繪制過(guò)程如我們所想的那樣,只繪制了三次,而且每次只繪制一條折線。beginPath()是繪制設(shè)置狀態(tài)的起始點(diǎn),它之后代碼設(shè)置的繪制狀態(tài)的作用域結(jié)束于繪制方法stroke()、fill()或者closePath(),至于closePath()之后會(huì)講到。
所以我們每次開(kāi)始繪制前都務(wù)必要使用beginPath(),為了代碼的完整性,建議大家在每次繪制結(jié)束后使用closePath()。

上述內(nèi)容就是如何繪制HTML5中的Canvas基本線條,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI