canvas入門

日期:2020 年 5 月 8 日

canvas 學(xué)習(xí)筆記

canvas 簡(jiǎn)介

canvas 是一個(gè)用來繪圖的 html5 標(biāo)簽餐禁,但是 < canvas> 標(biāo)簽本身并不具備繪圖能力耿戚,實(shí)際的繪圖需要借助 js 腳本來完成年栓,而具體做這件事情的就是 getContext('2d') 這個(gè)對(duì)象茅特,這個(gè)對(duì)象提供的各種屬性及方法可以讓我們很方便地完成線條,圖形歹篓,文字动知,圖像等的繪制

以下為使用 canvas 的幾個(gè)最基本的繪圖功能

畫線
<canvas id="myCanvas"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的瀏覽器不支持 HTML5 canvas 標(biāo)簽
 </canvas>
 <script>
        let c = document.getElementById('myCanvas')
        let cxt = c.getContext('2d')
        cxt.moveTo(0,0)
        cxt.lineTo(50,50)
        cxt.lineTo(70,15)
        cxt.lineTo(90,90)
        cxt.stroke()
 </script>

效果:


畫線

這里有幾個(gè)路徑相關(guān)的方法需要注意:

  • moveTo() 把路徑移動(dòng)到畫布中的指定點(diǎn),不創(chuàng)建線條
  • lineTo() 添加一個(gè)新點(diǎn)缭召,然后在畫布中創(chuàng)建從該點(diǎn)到最后指定點(diǎn)的線條
  • stroke() 繪制已定義的路徑
繪制矩形
<!DOCTYPE html>
<html lang="en">
<body>
    <canvas id="myCanvas"
        width="200"
        height="100"
        style="border: 1px solid #000"
     >
      您的瀏覽器不支持 HTML5 canvas 標(biāo)簽
    </canvas>
    <script>
        let c = document.getElementById('myCanvas')
        let cxt = c.getContext('2d')
        cxt.beginPath()
        cxt.fillStyle = '#FF0000'
        cxt.fillRect(10,10,50,50)
        cxt.closePath()
        
        cxt.beginPath()
        cxt.strokeStyle = '#FF0000'
        cxt.strokeRect(70,10,100,50)
        cxt.closePath()
    </script>
</body>

效果:


畫方

這里需要注意的有兩點(diǎn):

  1. 填充顏色與路徑顏色:
    fillStyle : 設(shè)置填充的顏色栈顷、漸變或模式
    strokeStyle : 設(shè)置筆觸(路徑)的顏色、漸變或模式
  2. 繪制實(shí)心矩形與空心矩形:
    fillRect() : 繪制實(shí)心矩形嵌巷,參數(shù)為左上角的坐標(biāo)及矩形寬高
    strokeRect() : 繪制空心矩形萄凤,參數(shù)為左上角的坐標(biāo)及矩形寬高
繪制圓(弧)形
<canvas id="myCanvas"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的瀏覽器不支持 HTML5 canvas 標(biāo)簽
 </canvas>
 <script>
     let c = document.getElementById('myCanvas')
     let cxt = c.getContext('2d')
     cxt.beginPath()
     cxt.arc(50,50,40,0,2*Math.PI)
     cxt.stroke()
     cxt.beginPath()
     cxt.arc(150,50,40,0,1.5*Math.PI)
     cxt.stroke()
 </script>

效果:


畫弧

這里要注意繪制圓(惶履摹)形用到的方法是 arc() 方法靡努,該方法接受5個(gè)固定參數(shù)合一個(gè)可選參數(shù),如下:


arc()方法參數(shù)
顏色漸變
1晓折、線性漸變
<canvas id="myCanvas"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的瀏覽器不支持 HTML5 canvas 標(biāo)簽
 </canvas>
 <script>
    // 線性漸變
    let c = document.getElementById('myCanvas')
    let cxt = c.getContext('2d')
    
    cxt.beginPath()
    let grd1 = cxt.createLinearGradient(0,0,0,50) // 創(chuàng)建從上往下的線性漸變
    grd1.addColorStop(0, 'black')
    grd1.addColorStop(1, 'white')
    cxt.fillStyle = grd1
    cxt.fillRect(10,10, 150,50)
    cxt.closePath()
    
    cxt.beginPath()
    let grd2 = cxt.createLinearGradient(0,0,150,0) // 創(chuàng)建從左往右的線性漸變
    grd2.addColorStop(0, 'black')
    grd2.addColorStop(1, 'white')
    cxt.fillStyle = grd2
    cxt.fillRect(10,70, 150,20)
    cxt.closePath()
 </script>

效果:


線性漸變

這里用到的方法是 createLinearGradient() , 該方法接受四個(gè)參數(shù)惑朦,前兩個(gè)參數(shù)為漸變開始的點(diǎn) 的坐標(biāo),后兩個(gè)參數(shù)為漸變結(jié)束的點(diǎn)的坐標(biāo)漓概,以此來確實(shí)漸變的方向

2漾月、放射性漸變
<canvas id="myCanvas"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的瀏覽器不支持 HTML5 canvas 標(biāo)簽
 </canvas>
 <script>
     let c = document.getElementById('myCanvas')
     let cxt = c.getContext('2d')
     let grd = cxt.createRadialGradient(50,50,10,50,50,100)
     grd.addColorStop(0, 'green')
     grd.addColorStop(1, 'blue')
     cxt.fillStyle = grd
     cxt.fillRect(10,10, 150,80)
 </script>

效果:


放射形漸變
文字繪制
<canvas id="myCanvas1"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的瀏覽器不支持 HTML5 canvas 標(biāo)簽
 </canvas>
 <canvas id="myCanvas2"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的瀏覽器不支持 HTML5 canvas 標(biāo)簽
 </canvas>
 <script>
        // 實(shí)心文字
        let c1 = document.getElementById('myCanvas41)
        let cxt1 = c1.getContext('2d')
        cxt1.font = '15px Arial'
        cxt1.fillText('canvas text', 20,20)
        
        // 空心文字
        let c2 = document.getElementById('myCanvas2')
        let cxt2 = c2.getContext('2d')
        cxt2.font = '20px Arial'
        cxt2.strokeText('canvas text', 50,50)
 </script>

效果:


繪制文字

這里要注意的是繪制文字的時(shí)候需要設(shè)置字號(hào)及字體,可以通過 font 屬性設(shè)置

繪制文字有 fillText() 和 strokeText() 兩個(gè)方法胃珍,他們都接受3個(gè)參數(shù)梁肿,需要繪制的文字,及文字開始繪制的位置坐標(biāo)觅彰,不同的是前一個(gè)方法用來繪制實(shí)心文字吩蔑,而后一個(gè)方法用來繪制空心文字

圖像繪制
<image id="picture" src="via.jpg" width="140" height="90"></image>
<canvas
    id="myCanvas"
    width="200"
    height="100"
    style="border: 1px solid #000"
>
    您的瀏覽器不支持 HTML5 canvas 標(biāo)簽
</canvas>
<script>
    // 繪制圖片
    let c = document.getElementById('myCanvas')
    let cxt = c.getContext('2d')
    let pic = document.getElementById('picture')
    pic.onload = function() {
        cxt.drawImage(pic,10,10,140,90);
    }
</script>

效果:


畫圖

上圖左側(cè)為一個(gè) <image> 標(biāo)簽,右側(cè)為通過 <canvas> 繪制出來的圖像填抬,需要注意的是使用
canvas 繪制圖像需要在圖像加載完畢之后再進(jìn)行烛芬,即上述的 onload() 事件完成后進(jìn)行圖像繪制,繪制圖像使用的方法為 drawImage(),接受三個(gè)固定參數(shù)和6個(gè)可選參數(shù)赘娄,如下:


drawImage()方法參數(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仆潮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子擅憔,更是在濱河造成了極大的恐慌鸵闪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暑诸,死亡現(xiàn)場(chǎng)離奇詭異蚌讼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)个榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門篡石,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人西采,你說我怎么就攤上這事凰萨。” “怎么了械馆?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵胖眷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我霹崎,道長(zhǎng)珊搀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任尾菇,我火速辦了婚禮境析,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘派诬。我一直安慰自己劳淆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布默赂。 她就那樣靜靜地躺著沛鸵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缆八。 梳的紋絲不亂的頭發(fā)上谒臼,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音耀里,去河邊找鬼。 笑死拾氓,一個(gè)胖子當(dāng)著我的面吹牛冯挎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼房官,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼趾徽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翰守,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤孵奶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蜡峰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體了袁,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年湿颅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了载绿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡油航,死狀恐怖崭庸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谊囚,我是刑警寧澤怕享,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站镰踏,受9級(jí)特大地震影響函筋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜余境,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一驻呐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芳来,春花似錦含末、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至顽聂,卻和暖如春肥惭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紊搪。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工蜜葱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耀石。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓牵囤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揭鳞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354