canvas入門

一篙梢、什么是 canvas?

  • HTML5 <canvas> 元素用于圖形的繪制栖博,通過腳本 (通常是JavaScript)來完成
  • 可以通過多種方法使用 canvas 繪制路徑,盒、圓、字符以及添加圖像等
  • Canvas 的默認大小為300像素×150像素(寬×高四瘫,像素的單位是px)
  • 默認情況下 <canvas> 元素沒有邊框和內(nèi)容
  • 可以使用HTML的高度和寬度屬性來自定義Canvas 的尺寸。
  • 一個畫布在網(wǎng)頁中是一個矩形框欲逃,通過 <canvas> 元素來繪制.
  • 標簽通常需要指定一個id屬性 (腳本中經(jīng)常引用)
  • 可以在HTML頁面中使用多個 <canvas> 元素

二找蜜、瀏覽器支持情況

瀏覽器支持

三、坐標系統(tǒng)

如圖所示稳析,canvas元素默認被網(wǎng)格所覆蓋洗做。通常來說網(wǎng)格中的一個單元相當于canvas元素中的一像素。柵格的起點為左上角彰居,坐標為(0,0)诚纸,所有元素的位置都相對于原點定位。
圖中藍色方形左上角的坐標為距離左邊(X軸)x像素陈惰,距離上邊(Y軸)y像素畦徘,坐標為(x,y)。

柵格系統(tǒng).png

四抬闯、使用 JavaScript 來繪制圖像

(一)繪制矩形

canvas提供了三種方法繪制矩形:

fillRect(x, y, width, height)
????繪制一個填充的矩形
strokeRect(x, y, width, height)
????繪制一個矩形的邊框
clearRect(x, y, width, height)
????清除指定矩形區(qū)域井辆,讓清除部分完全透明。

x與y指定了在canvas畫布上所繪制的矩形的左上角(相對于原點)的坐標溶握。
width和height設置矩形的尺寸杯缺。

image.png
<body>
<canvas id="cava1" width="300" height="150"></canvas>
</body>
<script> 
    function draw() {
         var canvas=document.getElementById("cava1");
         var ctx=canvas.getContext("2d");  
        ctx.fillRect(25,25,100,100);
        ctx.clearRect(45,45,60,60);
        ctx.strokeRect(50,50,50,50); 
    } 
    draw(); 
</script>

fillRect()函數(shù)繪制了一個邊長為100px的黑色正方形。clearRect()函數(shù)從正方形的中心開始擦除了一個60x60的正方形睡榆,接著strokeRect()在清除區(qū)域內(nèi)生成一個50x50的正方形邊框夺谁。

(二)繪制路徑

圖形的基本元素是路徑。路徑是通過不同顏色和寬度的線段或曲線相連形成的不同形狀的點的集合肉微。一個路徑,甚至一個子路徑蜡塌,都是閉合的碉纳。使用路徑繪制圖形需要一些額外的步驟:

  1. 首先需要創(chuàng)建路徑起始點。
  2. 然后使用畫圖命令去畫出路徑馏艾。
  3. 之后把路徑封閉劳曹。
  4. 一旦路徑生成奴愉,就能通過描邊或填充路徑區(qū)域來渲染圖形。

要用到的函數(shù):

beginPath()
????新建一條路徑铁孵,生成之后锭硼,圖形繪制命令被指向到路徑上生成路徑。
closePath()
????閉合路徑之后圖形繪制命令又重新指向到上下文中蜕劝。
stroke()
????通過線條來繪制圖形輪廓檀头。
fill()
????通過填充路徑的內(nèi)容區(qū)域生成實心的圖形。

生成路徑的步驟:

第一步叫做beginPath()岖沛。本質(zhì)上暑始,路徑是由很多子路徑構(gòu)成,這些子路徑都是在一個列表中婴削,所有的子路徑(線廊镜、弧形、等等)構(gòu)成圖形唉俗。而每次這個方法調(diào)用之后嗤朴,列表清空重置,然后我們就可以重新繪制新的圖形虫溜。
第二步就是調(diào)用函數(shù)指定繪制路徑雹姊。
第三,就是閉合路徑closePath(),不是必需的吼渡。這個方法會通過繪制一條從當前點到開始點的直線來閉合圖形容为。如果圖形是已經(jīng)閉合了的,即當前點為開始點寺酪,該函數(shù)什么也不做坎背。

注意:當你調(diào)用fill()函數(shù)時,所有沒有閉合的形狀都會自動閉合寄雀,所以你不需要調(diào)用closePath()函數(shù)得滤。但是調(diào)用stroke()時不會自動閉合。

在Canvas上畫線盒犹,我們將使用以下兩種方法:

moveTo(x,y) 定義線條開始坐標
lineTo(x,y) 定義線條結(jié)束坐標

示例:繪制一個三角形


image.png
<body>
     <canvas id="cava1" width="300" height="150"></canvas>
</body>
<script>
    function draw() {
        var canvas = document.getElementById("cava1");
        var ctx = canvas.getContext("2d");
        //繪制三角形
        ctx.beginPath();
        ctx.moveTo(75, 50);
        ctx.lineTo(100, 75);
        ctx.lineTo(100, 25);
        ctx.fill();
    }
    draw();
</script>

示例:圓弧
繪制圓弧或者圓懂更,使用arc()方法。

arc(x, y, radius, startAngle, endAngle, anticlockwise)
以(x,y)為圓心急膀,以radius為半徑的圓痪谛(圓),從startAngle開始到endAngle結(jié)束卓嫂,按照anticlockwise給定的方向(默認為順時針)來生成慷暂。

該方法有六個參數(shù):x,y為繪制圓弧所在圓上的圓心坐標。radius為半徑晨雳。startAngle以及endAngle參數(shù)用弧度定義了開始以及結(jié)束的弧度行瑞。這些都是以x軸為基準奸腺。參數(shù)anticlockwise為一個布爾值。為true時血久,是逆時針方向突照,否則順時針方向。

image.png
<body>
     <canvas id="cava1" width="300" height="150"></canvas>
</body>
<script>
    function draw() {
        var canvas = document.getElementById("cava1");
        var ctx = canvas.getContext("2d");
        //圓形
        ctx.beginPath();
        ctx.arc(95,50,40,0,2*Math.PI); 
        ctx.stroke();
    }
    draw();
</script>

其它文章請訪問:

參考:路徑-CanvasAPI|MDN

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氧吐,一起剝皮案震驚了整個濱河市讹蘑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌副砍,老刑警劉巖衔肢,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異豁翎,居然都是意外死亡角骤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門心剥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邦尊,“玉大人,你說我怎么就攤上這事优烧〔踝幔” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵畦娄,是天一觀的道長又沾。 經(jīng)常有香客問我,道長熙卡,這世上最難降的妖魔是什么杖刷? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮驳癌,結(jié)果婚禮上滑燃,老公的妹妹穿的比我還像新娘。我一直安慰自己颓鲜,他們只是感情好表窘,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著甜滨,像睡著了一般乐严。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衣摩,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天麦备,我揣著相機與錄音,去河邊找鬼。 笑死凛篙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的栏渺。 我是一名探鬼主播呛梆,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磕诊!你這毒婦竟也來了填物?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤霎终,失蹤者是張志新(化名)和其女友劉穎滞磺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莱褒,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡击困,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了广凸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阅茶。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谅海,靈堂內(nèi)的尸體忽然破棺而出脸哀,到底是詐尸還是另有隱情,我是刑警寧澤扭吁,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布撞蜂,位于F島的核電站,受9級特大地震影響侥袜,放射性物質(zhì)發(fā)生泄漏蝌诡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一系馆、第九天 我趴在偏房一處隱蔽的房頂上張望送漠。 院中可真熱鬧,春花似錦由蘑、人聲如沸闽寡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爷狈。三九已至,卻和暖如春裳擎,著一層夾襖步出監(jiān)牢的瞬間涎永,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羡微,地道東北人谷饿。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像妈倔,于是被迫代替她去往敵國和親博投。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 一:canvas簡介 1.1什么是canvas盯蝴? ①:canvas是HTML5提供的一種新標簽 ②:HTML5 ...
    GreenHand1閱讀 4,667評論 2 32
  • 【Android 自定義View之繪圖】 基礎(chǔ)圖形的繪制 一毅哗、Paint與Canvas 繪圖需要兩個工具,筆和紙捧挺。...
    Rtia閱讀 11,643評論 5 34
  • 書中代碼示例效果展示:Core HTML5 Canvas Examples 基礎(chǔ)知識 canvas元素 canva...
    szu_bee閱讀 2,803評論 2 28
  • 一虑绵、canvas簡介 1.1 什么是canvas?(了解) 是HTML5提供的一種新標簽 Canvas是一個矩形區(qū)...
    Looog閱讀 3,938評論 3 40
  • 人活著就像齊天大圣孫悟空一樣闽烙,鬧過翅睛、闖過、拼過鸣峭、恨過宏所。但從未怕過。
    阿克巴瑪耶閱讀 147評論 0 0