canvas入门

日期:2020 年 5 月 8 日

canvas 学习笔记

canvas 简介

canvas 是一个用来绘图的 html5 标签,但是 < canvas> 标签本身并不具备绘图能力,实际的绘图需要借助 js 脚本来完成,而具体做这件事情的就是 getContext('2d') 这个对象,这个对象提供的各种属性及方法可以让我们很方便地完成线条,图形,文字,图像等的绘制

以下为使用 canvas 的几个最基本的绘图功能

画线
<canvas id="myCanvas"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的浏览器不支持 HTML5 canvas 标签
 </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>

效果:


画线

这里有几个路径相关的方法需要注意:

  • moveTo() 把路径移动到画布中的指定点,不创建线条
  • lineTo() 添加一个新点,然后在画布中创建从该点到最后指定点的线条
  • stroke() 绘制已定义的路径
绘制矩形
<!DOCTYPE html>
<html lang="en">
<body>
    <canvas id="myCanvas"
        width="200"
        height="100"
        style="border: 1px solid #000"
     >
      您的浏览器不支持 HTML5 canvas 标签
    </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>

效果:


画方

这里需要注意的有两点:

  1. 填充颜色与路径颜色:
    fillStyle : 设置填充的颜色、渐变或模式
    strokeStyle : 设置笔触(路径)的颜色、渐变或模式
  2. 绘制实心矩形与空心矩形:
    fillRect() : 绘制实心矩形,参数为左上角的坐标及矩形宽高
    strokeRect() : 绘制空心矩形,参数为左上角的坐标及矩形宽高
绘制圆(弧)形
<canvas id="myCanvas"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的浏览器不支持 HTML5 canvas 标签
 </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个固定参数合一个可选参数,如下:


arc()方法参数
颜色渐变
1、线性渐变
<canvas id="myCanvas"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的浏览器不支持 HTML5 canvas 标签
 </canvas>
 <script>
    // 线性渐变
    let c = document.getElementById('myCanvas')
    let cxt = c.getContext('2d')
    
    cxt.beginPath()
    let grd1 = cxt.createLinearGradient(0,0,0,50) // 创建从上往下的线性渐变
    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) // 创建从左往右的线性渐变
    grd2.addColorStop(0, 'black')
    grd2.addColorStop(1, 'white')
    cxt.fillStyle = grd2
    cxt.fillRect(10,70, 150,20)
    cxt.closePath()
 </script>

效果:


线性渐变

这里用到的方法是 createLinearGradient() , 该方法接受四个参数,前两个参数为渐变开始的点 的坐标,后两个参数为渐变结束的点的坐标,以此来确实渐变的方向

2、放射性渐变
<canvas id="myCanvas"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的浏览器不支持 HTML5 canvas 标签
 </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 标签
 </canvas>
 <canvas id="myCanvas2"
      width="200"
      height="100"
      style="border: 1px solid #000"
 >
     您的浏览器不支持 HTML5 canvas 标签
 </canvas>
 <script>
        // 实心文字
        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>

效果:


绘制文字

这里要注意的是绘制文字的时候需要设置字号及字体,可以通过 font 属性设置

绘制文字有 fillText() 和 strokeText() 两个方法,他们都接受3个参数,需要绘制的文字,及文字开始绘制的位置坐标,不同的是前一个方法用来绘制实心文字,而后一个方法用来绘制空心文字

图像绘制
<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 标签
</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>

效果:


画图

上图左侧为一个 <image> 标签,右侧为通过 <canvas> 绘制出来的图像,需要注意的是使用
canvas 绘制图像需要在图像加载完毕之后再进行,即上述的 onload() 事件完成后进行图像绘制,绘制图像使用的方法为 drawImage(),接受三个固定参数和6个可选参数,如下:


drawImage()方法参数
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341