Canvas 学习笔记


基本信息

  • <canvas> 默认为 inline ,默认大小为 width:300px;height:150px;,默认 黑色
  • <canvas> 默认原点为左上角,向右为 X轴 正方向,向下为 Y轴 正方向
  • 参照 W3C 标准,<canvas> 的大小应该写在标签中,并且不写单位,如下:
    <canvas id="canvas" width="1024" height="768"></canvas>
  • 也可以在 JavaScript 中使用 canvas.widthcanvas.height 设置画布宽高(同样不用写单位)
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Document</title>
      </head>
      <body>
          <canvas id="canvas" width="1024" height="768" style="border:5px solid red;display: block;margin:50px auto;"></canvas>
          <script>
              // 获取到 canvas 元素
              var canvas = document.getElementById('canvas');
              // JS 中设置宽高
              canvas.width = 1024;
              canvas.height = 768;
              // 兼容
              if(canvas.getConext('2d')){
                  var context = canvas.getContext('2d')
                  // 使用 context 绘制
              }
              else{
                  alert('当前浏览器不支持 Canvas , 请更换浏览器后再试')
              }
          </script>
      </body>
      </html>
    

画一条直线

  • 起点(状态) context.moveTo()
  • 终点(状态) context.lineTo()
  • 线条宽度 context.lineWidth = 5
  • 线条颜色 context.strokeStyle = '#00588'
  • 画线条(绘制) context.stroke()
  • canvas 是基于状态的绘图,即:整个绘图过程应该是先设置绘图的状态,之后调用具体的函数来进行具体绘制
      // 画个三角形
      context.moveTo(100,100);
      context.lineTo(700,700);
      context.lineTo(100,700);
      context.lineTo(100,100);
      context.lineWidth = 5;
      context.strokeStyle = "#005588";
    
      context.stroke();
    
    canvas 三角形

实心图形

  • 填充颜色:.fillStyle = xxx
  • 填充:.fill()
    ...
    context.fillStyle = 'rgb(2,100,30)'
    context.fill();
实心图形

    context.lineWidth = 5;
    context.strokeStyle = "#005588";
    context.stroke();

    context.fillStyle = 'rgb(2,100,30)'
    context.fill();
  • 以上两种方式可以共用,实现一个 带边框且被填充的三角形

  • 如果想画两条线,为保证两条线互不干扰,需要重新调用 beginPath()

  • beginPath()closePath() 不一定非要成对出现,由于 closePath() 会将绘制图形的首尾自动闭合,所以视情况决定是否调用 closePath()

  • closePath() 对于 .fill() 无效,即:当填充时,无论是否有 closePath() ,都会按照闭合状态进行填充

      context.beginPath();        // 第一条开始
      context.moveTo(100,100);
      context.lineTo(700,700);
      context.lineTo(100,700);
      context.lineTo(100,100);
      context.closePath();        // 第一条结束
    
      context.fillStyle = 'rgb(2,100,30)'
      context.fill();
    
      context.lineWidth = 5;
      context.strokeStyle = 'red';
      context.stroke();
    
      context.beginPath();          // 第二条开始
      context.moveTo(200,100);
      context.lineTo(500,100);
      context.closePath();          // 第二条结束
      context.strokeStyle = 'black';
      context.stroke();
    
    画两个图形

画个七巧板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>canvas七巧板</title>
</head>
<body>
    <canvas id="canvas" style="border:5px solid #aaa;margin:50px auto;display: block;"></canvas>
    <script>
        // 存一个数据表
        var tangram = [
        {p:[{x:0,y:0},{x:800,y:0},{x:400,y:400}],color:'#caff67'},
        {p:[{x:0,y:0},{x:400,y:400},{x:0,y:800}],color:'#67becf'},
        {p:[{x:800,y:0},{x:800,y:400},{x:600,y:600},{x:600,y:200}],color:'#ef3d61'},
        {p:[{x:600,y:200},{x:600,y:600},{x:400,y:400}],color:'#f9f51a'},
        {p:[{x:400,y:400},{x:600,y:600},{x:400,y:800},{x:200,y:600}],color:'#a594c0'},
        {p:[{x:200,y:600},{x:400,y:800},{x:0,y:800}],color:'#fa8ecc'},
        {p:[{x:800,y:400},{x:800,y:800},{x:400,y:800}],color:'#f6ca29'},
        ]
        // 获取到 canvas 元素
        var canvas = document.getElementById('canvas');
        // 设置画布宽高
        canvas.width = 800;
        canvas.height = 800;
        // 准备画
        var context = canvas.getContext('2d');
        // 画每个 七巧板
        for(var i = 0;i<tangram.length;i++){
            draw(tangram[i],context)
        }
        // 画画函数
        function draw(piece,cxt){
            // 每个七巧板都需要有 "落笔" "起笔" 标识
            // "落笔" 标识
            cxt.beginPath();
            cxt.moveTo(piece.p[0].x,piece.p[0].y);
            for(var i = 1;i<piece.p.length;i++){
                cxt.lineTo(piece.p[i].x,piece.p[i].y);
            }
            // "起笔" 标识
            cxt.closePath();
            // 填充颜色
            cxt.fillStyle = piece.color;
            // 填充
            cxt.fill();
            // 边框颜色
            cxt.strokeStyle = '#000';
            // 边框宽度
            cxt.lineWidth = 3;
            // 画边框
            cxt.stroke();
        }
    </script>
</body>
</html>
Canvas 七巧板

画弧线

  • context.arc( 圆心x轴 , 圆心y轴 , 半径 , 开始弧度 , 结束弧度 [,顺/逆时针] ),默认顺时针 false;
  • 无论画的方向如何,起点和终点位置都是不变的


    都从右极点开始画
    context.lineWidth = 5;
    context.strokeStyle = 'red';
    // 起点  终点  半径  开始弧度  结束弧度
    context.arc(300,300,200,1*Math.PI,1.5*Math.PI);
    context.stroke();
9点位置画到12点位置
    context.lineWidth = 5;
    context.strokeStyle = 'red';
    // 起点  终点  半径  开始弧度  结束弧度
    context.arc(300,300,200,1.5*Math.PI,1*Math.PI);
    context.stroke();
12点位置画到9点位置

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

推荐阅读更多精彩内容

  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,858评论 3 40
  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,606评论 2 32
  • 最基本的使用创建一个画布所有的操作都在画布的context上面canvas是基于状态而不是基于对象的,比如说颜色都...
    亲爱的孟良阅读 1,630评论 0 4
  • canvas制造2d环境: var txt = cvs.grtContext(‘2d’); 绘制矩形: fillR...
    WeekOne阅读 308评论 0 0
  • 来源:四川水利职业技术学院团委新媒体中心 看了这些才明白了“生活的真谛” 你们听过最毒的鸡汤是什么?来来来,我们一...
    揉皱的蔓越莓阅读 573评论 0 0