Canvas基本篇

8###什么是 Canvas

canvas 是 HTML5 提供的一个用于展示绘图效果的标签. canvas 原意画布, 帆布. 在 HTML 页面中用于展示绘图效果. 最早 canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现.

canvas 英 ['k?nv?s] 美 ['k?nv?s] 帆布 画布

canvas 的基本用法

基本语法

使用 canvas 标签, 即可在页面中开辟一格区域. 可以设置其 width 和 height 设置该区域的尺寸.

默认 canvas 的宽高为 300 和 150.

不要使用 CSS 的方式设置宽高, 应该使用 HTML 属性.

如果浏览器不支持 canvas 标签, 那么就会将其解释为 div 标签. 因此常常在 canvas 中嵌入文本, 以提示用户浏览器的能力.

canvas 的兼容性非常强, 只要支持该标签的, 基本功能都一样, 因此不用考虑兼容性问题.

canvas 本身不能绘图. 是使用 JavaScript 来完成绘图. canvas 对象提供了各种绘图用的 api.

canvas 的使用领域

canvas 的使用领域很多:

游戏,可视化数据(重点),banner 广告,多媒体,未来

模拟仿真,远程操作,图形编辑

基本绘图

基本绘图方法

绘图步骤

  • 获得canvas对象.

    • 调用getContext方法, 提供字符串参数'2d'.

    • 该方法返回CanvasRenderingContext2D类型的对象. 该对象提供基本的绘图命令.

  • 使用CanvasRenderingContext2D对象提供的方法进行绘图.

    • 基本绘图命令

      • 设置开始绘图的位置:context.moveTo( x, y ).

      • 设置直线到的位置:context.lineTo( x, y ).

      • 描边绘制:context.stroke().

      • 填充绘制:context.fill().

      • 闭合路径:context.closePath().

    • 绘制基本线

       var canvas = document.createElement( 'canvas' );
      
       canvas.width = 500;
      
       canvas.height = 400;
      
       canvas.style.border = '1px dashed red';
      
       document.body.appendChild( canvas );
      
      // 获得 CanvasRenderingContext2D 对象
      
      var context = canvas.getContext( '2d' );
      
      // 设置 起点
      
      context.moveTo( 0, 0 );
      
      // 绘制直线
      
      context.lineTo( 500, 400 );
      
      // 设置 起点
      
      context.moveTo( 0, 400 );
      
      // 绘制直线
      
      context.lineTo( 500, 0 );
      
      // 描边显示效果
      
       context.stroke();
      
计算机直角坐标系

右x正,下y正。

  • . 代码分析

    1. 需要绘图就需要有canvas标签, 该标签用于展示图像.
    • canvas的宽高不要使用 CSS 来设置, 会有拉伸的问题. 应该直接使用属性设置.

    • 但是canvas只是展示图像的标签, 它没有绘图的能力. 需要使用canvas的上下文工具来实现绘图.

    • 使用canvas.getContext( '2d' )可以获得绘图工具, 该工具是CanvasRenderingContext2D类型的对象.

    • 需要绘图, 首选设置绘图的起点.

      • 使用canvas绘图, 需要主要的是他主张先描点, 再连线绘制效果.

      • 因此需要首先设置起点, 然后在起点的基础上描述其他需要的点.

      • 使用CanvasRenderingContext2D.moveTo( x, y )方法设置起点.

      其中 x, y 表示的是在坐标系中的位置.

    1. 使用CanvasRenderingContext2D.lineTo( x, y )来描述绘制直线的下一个点. 依次类推可以描述多个点.
    • 描点结束后, 需要使用CanvasRenderingContext2D.stroke()方法来连线. 开可以显示出效果.
getContext 方法
      语法:Canvas.getContext( typeStr )
  • 描述:

    • 该方法用于绘制上下文工具.

    • 如果是绘制平面图形使用'2d'作为参数, 如果绘制立体图形使用'webgl'.

    • 使用'2d'返回CanvasRenderingContext2D类型的对象.

    • 使用'webgl'返回WebGLRenderingContext类型的对象.

moveTo 方法
      语法:CanvasRenderingContext2D.moveTo( x, y )
  • 描述:

  • 该方法用于设置绘制起点.

  • 其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.

lineTo 方法
  语法:CanvasRenderingContext2D.lineTo( x, y )
  • 描述:

    • 该方法用于设置需要绘制直线的另一个点. 最终描边后会连线当前点和方法参数描述的点.

    其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.

stroke 方法
      语法:CanvasRenderingContext2D.stroke()

描述: 该方法用于连线, 将描述的所有点按照指定顺序连接起来.

结论

1.绘图先要获得上下文, 即绘图工具

2.绘图需要设置开始的坐标

3.绘图是先描点, 然后一个一个依次连线

4.依次绘图只能绘制单一样式( 色彩等 )

直线图形

  • 绘制直线计算坐标.
    • 描边调用 CanvasRenderingContext2D.stroke() 方法.
  • 填充使用 CanvasRenderingContext2D.fill() 方法.

fill 方法

      语法: CanvasRenderingContext2D.fill()
  • 描述: 该方法会按照描绘的点的路径来填充图形. 默认是黑色.
非零环绕原则
  • 说明:
    • 在 canvas 中使用各种方法描点实际上描述的是一个称为路径( path )的东西.
    • 在 canvas 绘图中, 所有描述的东西都是路径, 只有最后填充或描边的时候才会显示出效果.
    • 每一个路径都是一个状态.
      顺时针加一;逆时针减一,为零的不渲染

闭合路径

closePath 方法
    语法: CanvasRenderingContext2D.closePath()
  • 描述: 使用该方法可以将最后一个描点与最开始的描点自动连接起来.

案例

...
ctx.moveTo( 100, 100 );
ctx.lineTo( 300, 100 );
ctx.lineTo( 300, 200 );
ctx.closePath();
ctx.stroke();

线型相关属性

设置描边与填充不一定只能使用黑色的细线. 可以利用一些属性设置其效果

    CanvasRenderingContext2D.lineWidth 设置线宽.
    CanvasRenderingContext2D.lineCap 设置线末端类型.
    CanvasRenderingContext2D.lineJoin 设置相交线的拐点.
    CanvasRenderingContext2D.getLineDash() 获得线段样式数组.
    CanvasRenderingContext2D.setLineDash() 设置线段样式.
    CanvasRenderingContext2D.lineDashOffset 绘制线段偏移量.

案例

...
ctx.moveTo( 100, 100 );
ctx.lineTo( 300, 100 );
ctx.stroke();

ctx.beginPath();
ctx.lineWidth = 10;
ctx.moveTo( 100, 250 );
ctx.lineTo( 300, 250 );
ctx.stroke();
设置线末端类型
  语法: CanvasRenderingContext2D.lineCap = value
  • 描述:

    • 设置线型末端的样式, 可取值为: 'butt'( 默认 ), 'round', 'square'.
    • 'butt' 表示两端使用方形结束.
    • 'round' 表示两端使用圆角结束.
    • 'square' 表示突出的圆角结束.

案例

...
ctx.lineWidth = 10;
ctx.moveTo( 100, 100 );
ctx.lineTo( 300, 100 );
ctx.stroke();

ctx.beginPath();
ctx.lineCap =  'round';
ctx.moveTo( 100, 130 );
ctx.lineTo( 300, 130 );
ctx.stroke();

ctx.beginPath();
ctx.lineCap =  'square';
ctx.moveTo( 100, 160 );
ctx.lineTo( 300, 160 );
ctx.stroke();
设置相交线的拐点
  语法: CanvasRenderingContext2D.lineJoin = value
  • 描述:

    • 设置两条直线的拐点描述方式. 可以取值 'round', 'bevel', 'miter'(默认)
    • 'round' 使用圆角连接.
    • 'bevel' 使用平切连接.
    • 'miter' 使用直角转.

案例

...
ctx.lineWidth = 10;
ctx.lineJoin = 'round';
ctx.moveTo( 100, 100 );
ctx.lineTo( 200, 200 );
ctx.lineTo( 300, 100 );
ctx.stroke();

ctx.beginPath();
ctx.lineJoin = 'bevel';
ctx.moveTo( 100, 150 );
ctx.lineTo( 200, 250 );
ctx.lineTo( 300, 150 );
ctx.stroke();

ctx.beginPath();
ctx.lineJoin = 'miter';
ctx.moveTo( 100, 200 );
ctx.lineTo( 200, 300 );
ctx.lineTo( 300, 200 );
ctx.stroke();
虚线
  • 语法:
...
CanvasRenderingContext2D.lineDashOffset = number
CanvasRenderingContext2D.getLineDash()
CanvasRenderingContext2D.setLineDash()

描述:

setLineDash 用于设置开始绘制虚线的偏移量. 数字的正负表示左右偏移.
getLineDash() 与 setLineDash() 方法使用数组描述实线与虚线的长度.
演示

...
ctx.moveTo( 100, 90 );
ctx.lineTo( 100, 110 );
ctx.moveTo( 300, 90 );
ctx.lineTo( 300, 110 );

ctx.moveTo( 100, 140 );
ctx.lineTo( 100, 160 );
ctx.moveTo( 300, 140 );
ctx.lineTo( 300, 160 );

ctx.moveTo( 100, 190 );
ctx.lineTo( 100, 210 );
ctx.moveTo( 300, 190 );
ctx.lineTo( 300, 210 );
ctx.stroke();

ctx.beginPath();
ctx.moveTo( 100, 100 );
ctx.lineTo( 300, 100 );
ctx.stroke();

ctx.beginPath();
ctx.setLineDash( [ 5, 5 ] );
ctx.moveTo( 100, 150 );
ctx.lineTo( 300, 150 );
ctx.stroke();

ctx.beginPath();
ctx.lineDashOffset = -2;
ctx.moveTo( 100, 200 );
ctx.lineTo( 300, 200 );
ctx.stroke();
填充与描边样式
  • 语法:

      CanvasRenderingContext2D.strokeStyle = value
      CanvasRenderingContext2D.fillStyle = value
    
  • 描述:

    • strokeStyle 可以设置描边颜色, 与 CSS 的语法一样

    • fillStyle 设置填充颜色, 与 CSS 语法一样

    • 这两个属性还可以设置渐变对象.
      案例

      for (var i=0;i<6;i++){
          for (var j=0;j<6;j++){
              ctx.strokeStyle = 'rgb(0,' + Math.floor(255-42.5*i) + ',' + 
                          Math.floor(255-42.5*j) + ')';
              ctx.beginPath();
              ctx.arc(12.5+j*25,12.5+i*25,10,0,Math.PI*2,true);
              ctx.stroke();
          }
      }
      

**小伙伴们看完这些可以自己做一些小案例奥,比如网格了,坐标系了,还有折线图啊什么的,下次见奥!

喜欢请关注,小小程序猿 ,落落izj**

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

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,676评论 2 32
  • 书中代码示例效果展示:Core HTML5 Canvas Examples 基础知识 canvas元素 canva...
    szu_bee阅读 2,816评论 2 28
  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,720评论 2 10
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,940评论 3 40
  • 初为母亲,经验欠缺,错过了你很多习惯培养的黄金期,比如单独入睡,比如独自睡婴儿床,比如早早为你备好爬行垫让你在爬行...
    柯抒阅读 832评论 0 2