1.1. 什么是 Canvas

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

  1. canvas ['kænvəs] 美 ['kænvəs] 帆布 画布

基本语法

  1. <canvas></canvas>
  1. 使用 canvas 标签, 即可在页面中开辟一格区域. 可以设置其 width 和 height 设置该区域的尺寸.
  2. 默认 canvas 的宽高为 300 和 150.
  3. 不要使用 CSS 的方式设置宽高, 应该使用 HTML 属性.
  4. 如果浏览器不支持 canvas 标签, 那么就会将其解释为 div 标签. 因此常常在 canvas 中嵌入文本, 以提示用户浏览器的能力.
  5. canvas 的兼容性非常强, 只要支持该标签的, 基本功能都一样, 因此不用考虑兼容性问题.
  6. canvas 本身不能绘图. 是使用 JavaScript 来完成绘图. canvas 对象提供了各种绘图用的 api.

canvas 的使用领域

canvas 的使用领域很多:

  1. 游戏
  2. 可视化数据(重点)
  3. banner 广告
  4. 多媒体
  5. 未来
    • 模拟仿真
    • 远程操作
    • 图形编辑

1.2. 基本绘图

1.2.1. 基本绘图方法

绘图步骤

  1. 获得 canvas 对象.
  2. 调用 getContext 方法, 提供字符串参数 '2d'.
  3. 该方法返回 CanvasRenderingContext2D 类型的对象. 该对象提供基本的绘图命令.
  4. 使用 CanvasRenderingContext2D 对象提供的方法进行绘图.
  5. 基本绘图命令
    • 设置开始绘图的位置: context.moveTo( x, y ).
    • 设置直线到的位置: context.lineTo( x, y ).
    • 描边绘制: context.stroke().
    • 填充绘制: context.fill().
    • 闭合路径: context.closePath().

01-绘制基本线

  1. var canvas = document.createElement( 'canvas' );
  2. canvas.width = 500;
  3. canvas.height = 400;
  4. canvas.style.border = '1px dashed red';
  5. document.body.appendChild( canvas );
  6. // 获得 CanvasRenderingContext2D 对象
  7. var context = canvas.getContext( '2d' );
  8. // 设置 起点
  9. context.moveTo( 0, 0 );
  10. // 绘制直线
  11. context.lineTo( 500, 400 );
  12. // 设置 起点
  13. context.moveTo( 0, 400 );
  14. // 绘制直线
  15. context.lineTo( 500, 0 );
  16. // 描边显示效果
  17. context.stroke();

1.2.1.2. 代码分析

  1. 需要绘图就需要有 canvas 标签, 该标签用于展示图像.
  2. canvas 的宽高不要使用 CSS 来设置, 会有拉伸的问题. 应该直接使用属性设置.
  3. 但是 canvas 只是展示图像的标签, 它没有绘图的能力. 需要使用 canvas 的上下文工具来实现绘图.
  4. 使用 canvas.getContext( '2d' ) 可以获得绘图工具, 该工具是 CanvasRenderingContext2D 类型的对象.
  5. 需要绘图, 首选设置绘图的起点.
    • 使用 canvas 绘图, 需要主要的是他主张先描点, 再连线绘制效果.
    • 因此需要首先设置起点, 然后在起点的基础上描述其他需要的点.
    • 使用 CanvasRenderingContext2D.moveTo( x, y ) 方法设置起点.
      • 其中 x, y 表示的是在坐标系中的位置.
  6. 使用 CanvasRenderingContext2D.lineTo( x, y ) 来描述绘制直线的下一个点. 依次类推可以描述多个点.
  7. 描点结束后, 需要使用 CanvasRenderingContext2D.stroke() 方法来连线. 开可以显示出效果.

1.2.1.3. getContext 方法

语法: Canvas.getContext( typeStr )

描述:

  1. 该方法用于绘制上下文工具.
  2. 如果是绘制平面图形使用 '2d' 作为参数, 如果绘制立体图形使用 'webgl'.
  3. 使用 '2d' 返回 CanvasRenderingContext2D 类型的对象.
  4. 使用 'webgl' 返回 WebGLRenderingContext 类型的对象.

1.2.1.4. moveTo 方法

语法: CanvasRenderingContext2D.moveTo( x, y )

描述:

  1. 该方法用于设置绘制起点.
  2. 其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.

1.2.1.5. lineTo 方法

语法: CanvasRenderingContext2D.lineTo( x, y )

描述:

  1. 该方法用于设置需要绘制直线的另一个点. 最终描边后会连线当前点和方法参数描述的点.
  2. 其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.

1.2.1.6. stroke 方法

语法: CanvasRenderingContext2D.stroke()

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

1.2.1.7. 结论

  1. 绘图先要获得上下文, 即绘图工具
  2. 绘图需要设置开始的坐标
  3. 绘图是先描点, 然后一个一个依次连线
  4. 依次绘图只能绘制单一样式( 色彩等 )

1.2.2. 直线图形

1.2.2.1. fill 方法

语法: CanvasRenderingContext2D.fill()

描述: 该方法会按照描绘的点的路径来填充图形. 默认是黑色.

1.2.3. 非零环绕原则

说明:

  1. 在 canvas 中使用各种方法描点实际上描述的是一个称为路径( path )的东西.
  2. 在 canvas 绘图中, 所有描述的东西都是路径, 只有最后填充或描边的时候才会显示出效果.
  3. 每一个路径都是一个状态.

1.2.4. 闭合路径

1.2.4.1. closePath 方法

语法: CanvasRenderingContext2D.closePath()

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

案例

  1. ...
  2. ctx.moveTo( 100, 100 );
  3. ctx.lineTo( 300, 100 );
  4. ctx.lineTo( 300, 200 );
  5. ctx.closePath();
  6. ctx.stroke();

1.2.5. 路径的概念

  1. 路径就是一次绘图

    • 类比使用油漆刷墙面
    • 首先打底色, 绝对不会一次性使用多个色彩
    • 一定是先画完某一个色彩再考虑另一个色彩
    • 除非需要自己创作才会考虑墙面绘画
  2. 路径就好比一桶油漆和一把刷子, 一次性描点绘制. 如果重新更换油漆, 那么是绘制另一个区域.
  3. 如果需要开启新的绘制, 那么使用 CanvasRenderingContext2D.beginPath() 方法.

1.2.6. 线型相关属性

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

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

1.2.6.1. 设置线宽

语法: CanvasRenderingContext2D.lineWidth = number

描述: 设置线宽.

案例

  1. ...
  2. ctx.moveTo( 100, 100 );
  3. ctx.lineTo( 300, 100 );
  4. ctx.stroke();
  5. ctx.beginPath();
  6. ctx.lineWidth = 10;
  7. ctx.moveTo( 100, 250 );
  8. ctx.lineTo( 300, 250 );
  9. ctx.stroke();

1.2.6.2. 设置线末端类型

语法: CanvasRenderingContext2D.lineCap = value

描述:

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

案例

  1. ...
  2. ctx.lineWidth = 10;
  3. ctx.moveTo( 100, 100 );
  4. ctx.lineTo( 300, 100 );
  5. ctx.stroke();
  6. ctx.beginPath();
  7. ctx.lineCap = 'round';
  8. ctx.moveTo( 100, 130 );
  9. ctx.lineTo( 300, 130 );
  10. ctx.stroke();
  11. ctx.beginPath();
  12. ctx.lineCap = 'square';
  13. ctx.moveTo( 100, 160 );
  14. ctx.lineTo( 300, 160 );
  15. ctx.stroke();

1.2.6.3. 设置相交线的拐点

语法: CanvasRenderingContext2D.lineJoin = value

描述:

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

案例

  1. ...
  2. ctx.lineWidth = 10;
  3. ctx.lineJoin = 'round';
  4. ctx.moveTo( 100, 100 );
  5. ctx.lineTo( 200, 200 );
  6. ctx.lineTo( 300, 100 );
  7. ctx.stroke();
  8. ctx.beginPath();
  9. ctx.lineJoin = 'bevel';
  10. ctx.moveTo( 100, 150 );
  11. ctx.lineTo( 200, 250 );
  12. ctx.lineTo( 300, 150 );
  13. ctx.stroke();
  14. ctx.beginPath();
  15. ctx.lineJoin = 'miter';
  16. ctx.moveTo( 100, 200 );
  17. ctx.lineTo( 200, 300 );
  18. ctx.lineTo( 300, 200 );
  19. ctx.stroke();

1.2.6.4. 虚线

语法:

  1. CanvasRenderingContext2D.lineDashOffset = number
  2. CanvasRenderingContext2D.getLineDash()
  3. CanvasRenderingContext2D.setLineDash()

描述:

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

演示

  1. ...
  2. ctx.moveTo( 100, 90 );
  3. ctx.lineTo( 100, 110 );
  4. ctx.moveTo( 300, 90 );
  5. ctx.lineTo( 300, 110 );
  6. ctx.moveTo( 100, 140 );
  7. ctx.lineTo( 100, 160 );
  8. ctx.moveTo( 300, 140 );
  9. ctx.lineTo( 300, 160 );
  10. ctx.moveTo( 100, 190 );
  11. ctx.lineTo( 100, 210 );
  12. ctx.moveTo( 300, 190 );
  13. ctx.lineTo( 300, 210 );
  14. ctx.stroke();
  15. ctx.beginPath();
  16. ctx.moveTo( 100, 100 );
  17. ctx.lineTo( 300, 100 );
  18. ctx.stroke();
  19. ctx.beginPath();
  20. ctx.setLineDash( [ 5, 5 ] );
  21. ctx.moveTo( 100, 150 );
  22. ctx.lineTo( 300, 150 );
  23. ctx.stroke();
  24. ctx.beginPath();
  25. ctx.lineDashOffset = -2;
  26. ctx.moveTo( 100, 200 );
  27. ctx.lineTo( 300, 200 );
  28. ctx.stroke();

1.2.6.5. 填充与描边样式

语法:

  1. CanvasRenderingContext2D.strokeStyle = value
  2. CanvasRenderingContext2D.fillStyle = value

描述:

  1. strokeStyle 可以设置描边颜色, 与 CSS 的语法一样
  2. fillStyle 设置填充颜色, 与 CSS 语法一样
  3. 这两个属性还可以设置渐变对象.

案例

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

Canvas基础的更多相关文章

  1. HTML5移动开发学习笔记之Canvas基础

    1.第一个Canvas程序 看的是HTML5移动开发即学即用这本书,首先学习Canvas基础,废话不多说,直接看第一个例子. 效果图为: 代码如下: <!DOCTYPE html> < ...

  2. canvas基础之旅

    canvas 主要使用2D rendering context  API 实现其功能和特效. canvas 一般浏览器都支持,但在ie9之前的是不支持的.(解决办法:添加IxplorerCanvas ...

  3. canvas 基础知识整理(二)

    html部分: <canvas id="myCanvas" width="800" height="800" ></can ...

  4. canvas 基础知识整理(一)

    canvas这个 HTML 元素是为了客户端矢量图形而设计的.它自己没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上. html的基本 ...

  5. 《HTML5 CANVAS基础教程》读书笔记

    一.HTML5简介 1.HTML5新特性 1)结构元素:section,header,hgroup,footer,nav,article,aside, 2)内容元素:figure,figcaption ...

  6. canvas 基础知识

    canvas 基础 低版本的ie不支持html5,需要引入excanvas.js来让ie支持canvas. 检测支持canvas <canvas id="canvas" wi ...

  7. canvas基础语法

    前面的话 canvas顾名思义是定义在浏览器中的画布.它不仅是一个普通的元素,更是一个强大的编程工具.它的出现已然超过了web基于文档的设计初衷,将网页这一形态的应用推向了另一个高度.利用canvas ...

  8. canvas API ,通俗的canvas基础知识(一)

    在没学canvas的时候,觉得canvas是这么的神秘,这么的绚丽,这么的高深,用canvas做出来的效果是如此的炫酷,能做的事情如此的宽广,简直让我心生敬畏之心,时常感叹:我要是得此技能,必定要上天 ...

  9. canvas基础动画示例

    canvas基础动画示例 本文主要用最简单的例子,展示canvas动画效果是如何实现的 动画效果,是一个球绕着一点旋转 const canvas = document.getElementById(' ...

  10. canvas基础学习

    /** * Created by ty on 2016/7/11. * canvas 基础 */ window.onload = function() { var canvas = document. ...

随机推荐

  1. PHP 中:: -> self $this 操作符的区别

    访问PHP类中的成员变量或方法时, 如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::, 反之如果被引用的变量或者方法没有被声明成 const ...

  2. WCF学习总结

    1. WCF简介 WCF (Windows Communication Foundation)是由微软发展的一组数据通信的应用程序开发借口.WCF由服务地址(Address) .协议绑定 (Bindi ...

  3. performSelector和performSelectorInBackground

    前者是在主线程下完成的, 不会自动创建一个线程. 后者会创建一个新的线程.

  4. V2EX 上收藏Top200

    截止到目前 V2EX 上收藏人数最多的 56 个帖子 收藏数 Top200 截止到目前V2EX上收藏人数最多的56个帖子 说说自己知道的各个领域水平比较不错的论坛 发一个自用了一年多的加密代理工具 s ...

  5. docker定制化镜像的构建及基于该定制的镜像创建容器

    1.在项目里创建Dockerfile(注意大小写)文件,执行构建命令:docker build -t tiny-node-1 /root/tiny-node-docker    其中tiny-node ...

  6. linux 命令行启动虚拟机

    vmrun -T ws start /root/vmware/Windows\ Server\ 2012/Windows\ Server\ 2012.vmx nogui

  7. 【Linux】【通信】1.ping不通

    关于为什么ping不通有很多种原因,但直接的表象就网络之间没有成功进行通讯: 在构建虚拟机和win之间的交互时,主要使用了3种网络模式: 桥接bridge VMnet0 主机host     VMne ...

  8. 【 2013 Multi-University Training Contest 4 】

    HDU 4632 Palindrome subsequence dp[x][y]表示区间[x,y]构成回文串的方案数. 若str[x]==str[y],dp[x][y]=dp[x+1][y]+dp[x ...

  9. Siverlight 导出Excel (经测试通过 Vs2010 ,silverlight5 )

    网上搜了下,很多代码都有各种问题,自己抽时间整理了一下这个导出 using System; using System.Net; using System.Windows; using System.W ...

  10. code of C/C++(3) - 从 《Accelerated C++》源码学习句柄类

    0  C++中多态的概念 多态是指通过基类的指针或者引用,利用虚函数机制,在运行时确定对象的类型,并且确定程序的编程策略,这是OOP思想的核心之一.多态使得一个对象具有多个对象的属性.class Co ...