Canvas基础
1.1. 什么是 Canvas
canvas 是 HTML5 提供的一个用于展示绘图效果的标签. canvas 原意画布, 帆布. 在 HTML 页面中用于展示绘图效果. 最早 canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现.
canvas 英 ['kænvəs] 美 ['kænvəs] 帆布 画布
基本语法
<canvas></canvas>
- 使用 canvas 标签, 即可在页面中开辟一格区域. 可以设置其 width 和 height 设置该区域的尺寸.
- 默认 canvas 的宽高为 300 和 150.
- 不要使用 CSS 的方式设置宽高, 应该使用 HTML 属性.
- 如果浏览器不支持 canvas 标签, 那么就会将其解释为 div 标签. 因此常常在 canvas 中嵌入文本, 以提示用户浏览器的能力.
- canvas 的兼容性非常强, 只要支持该标签的, 基本功能都一样, 因此不用考虑兼容性问题.
- canvas 本身不能绘图. 是使用 JavaScript 来完成绘图. canvas 对象提供了各种绘图用的 api.
canvas 的使用领域
canvas 的使用领域很多:
- 游戏
- 可视化数据(重点)
- banner 广告
- 多媒体
- 未来
- 模拟仿真
- 远程操作
- 图形编辑
1.2. 基本绘图
1.2.1. 基本绘图方法
绘图步骤
- 获得
canvas对象. - 调用
getContext方法, 提供字符串参数'2d'. - 该方法返回
CanvasRenderingContext2D类型的对象. 该对象提供基本的绘图命令. - 使用
CanvasRenderingContext2D对象提供的方法进行绘图. - 基本绘图命令
- 设置开始绘图的位置:
context.moveTo( x, y ). - 设置直线到的位置:
context.lineTo( x, y ). - 描边绘制:
context.stroke(). - 填充绘制:
context.fill(). - 闭合路径:
context.closePath().
- 设置开始绘图的位置:
01-绘制基本线
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();
1.2.1.2. 代码分析
- 需要绘图就需要有
canvas标签, 该标签用于展示图像. canvas的宽高不要使用 CSS 来设置, 会有拉伸的问题. 应该直接使用属性设置.- 但是
canvas只是展示图像的标签, 它没有绘图的能力. 需要使用canvas的上下文工具来实现绘图. - 使用
canvas.getContext( '2d' )可以获得绘图工具, 该工具是CanvasRenderingContext2D类型的对象. - 需要绘图, 首选设置绘图的起点.
- 使用
canvas绘图, 需要主要的是他主张先描点, 再连线绘制效果. - 因此需要首先设置起点, 然后在起点的基础上描述其他需要的点.
- 使用
CanvasRenderingContext2D.moveTo( x, y )方法设置起点.- 其中 x, y 表示的是在坐标系中的位置.
- 使用
- 使用
CanvasRenderingContext2D.lineTo( x, y )来描述绘制直线的下一个点. 依次类推可以描述多个点. - 描点结束后, 需要使用
CanvasRenderingContext2D.stroke()方法来连线. 开可以显示出效果.
1.2.1.3. getContext 方法
语法: Canvas.getContext( typeStr )
描述:
- 该方法用于绘制上下文工具.
- 如果是绘制平面图形使用
'2d'作为参数, 如果绘制立体图形使用'webgl'. - 使用
'2d'返回CanvasRenderingContext2D类型的对象. - 使用
'webgl'返回WebGLRenderingContext类型的对象.
1.2.1.4. moveTo 方法
语法: CanvasRenderingContext2D.moveTo( x, y )
描述:
- 该方法用于设置绘制起点.
- 其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.
1.2.1.5. lineTo 方法
语法: CanvasRenderingContext2D.lineTo( x, y )
描述:
- 该方法用于设置需要绘制直线的另一个点. 最终描边后会连线当前点和方法参数描述的点.
- 其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.
1.2.1.6. stroke 方法
语法: CanvasRenderingContext2D.stroke()
描述: 该方法用于连线, 将描述的所有点按照指定顺序连接起来.
1.2.1.7. 结论
- 绘图先要获得上下文, 即绘图工具
- 绘图需要设置开始的坐标
- 绘图是先描点, 然后一个一个依次连线
- 依次绘图只能绘制单一样式( 色彩等 )
1.2.2. 直线图形
1.2.2.1. fill 方法
语法: CanvasRenderingContext2D.fill()
描述: 该方法会按照描绘的点的路径来填充图形. 默认是黑色.
1.2.3. 非零环绕原则
说明:
- 在
canvas中使用各种方法描点实际上描述的是一个称为路径( path )的东西. - 在
canvas绘图中, 所有描述的东西都是路径, 只有最后填充或描边的时候才会显示出效果. - 每一个路径都是一个状态.
1.2.4. 闭合路径
1.2.4.1. closePath 方法
语法: CanvasRenderingContext2D.closePath()
描述: 使用该方法可以将最后一个描点与最开始的描点自动连接起来.
案例
...
ctx.moveTo( 100, 100 );
ctx.lineTo( 300, 100 );
ctx.lineTo( 300, 200 );
ctx.closePath();
ctx.stroke();
1.2.5. 路径的概念
- 路径就是一次绘图
- 类比使用油漆刷墙面
- 首先打底色, 绝对不会一次性使用多个色彩
- 一定是先画完某一个色彩再考虑另一个色彩
- 除非需要自己创作才会考虑墙面绘画
- 路径就好比一桶油漆和一把刷子, 一次性描点绘制. 如果重新更换油漆, 那么是绘制另一个区域.
- 如果需要开启新的绘制, 那么使用
CanvasRenderingContext2D.beginPath()方法.
1.2.6. 线型相关属性
设置描边与填充不一定只能使用黑色的细线. 可以利用一些属性设置其效果
CanvasRenderingContext2D.lineWidth设置线宽.CanvasRenderingContext2D.lineCap设置线末端类型.CanvasRenderingContext2D.lineJoin设置相交线的拐点.CanvasRenderingContext2D.getLineDash()获得线段样式数组.CanvasRenderingContext2D.setLineDash()设置线段样式.CanvasRenderingContext2D.lineDashOffset绘制线段偏移量.
1.2.6.1. 设置线宽
语法: CanvasRenderingContext2D.lineWidth = number
描述: 设置线宽.
案例
...
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();
1.2.6.2. 设置线末端类型
语法: 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();
1.2.6.3. 设置相交线的拐点
语法: 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();
1.2.6.4. 虚线
语法:
CanvasRenderingContext2D.lineDashOffset = numberCanvasRenderingContext2D.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();
1.2.6.5. 填充与描边样式
语法:
CanvasRenderingContext2D.strokeStyle = valueCanvasRenderingContext2D.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();
}
}
Canvas基础的更多相关文章
- HTML5移动开发学习笔记之Canvas基础
1.第一个Canvas程序 看的是HTML5移动开发即学即用这本书,首先学习Canvas基础,废话不多说,直接看第一个例子. 效果图为: 代码如下: <!DOCTYPE html> < ...
- canvas基础之旅
canvas 主要使用2D rendering context API 实现其功能和特效. canvas 一般浏览器都支持,但在ie9之前的是不支持的.(解决办法:添加IxplorerCanvas ...
- canvas 基础知识整理(二)
html部分: <canvas id="myCanvas" width="800" height="800" ></can ...
- canvas 基础知识整理(一)
canvas这个 HTML 元素是为了客户端矢量图形而设计的.它自己没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上. html的基本 ...
- 《HTML5 CANVAS基础教程》读书笔记
一.HTML5简介 1.HTML5新特性 1)结构元素:section,header,hgroup,footer,nav,article,aside, 2)内容元素:figure,figcaption ...
- canvas 基础知识
canvas 基础 低版本的ie不支持html5,需要引入excanvas.js来让ie支持canvas. 检测支持canvas <canvas id="canvas" wi ...
- canvas基础语法
前面的话 canvas顾名思义是定义在浏览器中的画布.它不仅是一个普通的元素,更是一个强大的编程工具.它的出现已然超过了web基于文档的设计初衷,将网页这一形态的应用推向了另一个高度.利用canvas ...
- canvas API ,通俗的canvas基础知识(一)
在没学canvas的时候,觉得canvas是这么的神秘,这么的绚丽,这么的高深,用canvas做出来的效果是如此的炫酷,能做的事情如此的宽广,简直让我心生敬畏之心,时常感叹:我要是得此技能,必定要上天 ...
- canvas基础动画示例
canvas基础动画示例 本文主要用最简单的例子,展示canvas动画效果是如何实现的 动画效果,是一个球绕着一点旋转 const canvas = document.getElementById(' ...
- canvas基础学习
/** * Created by ty on 2016/7/11. * canvas 基础 */ window.onload = function() { var canvas = document. ...
随机推荐
- JAVA类与对象
Employee类: public class EmployeeTest { public static void main(String[] args) { // fill the staff ar ...
- 三、最小化的Spring XML配置
Spring 提供了自动装配(自动识别如何装配Bean的依赖关系)和自动检测(检测哪些类需要被配置成Spring Bean) 1.自动装配Bean的属性 1.1四种类型得自动装配:byName.byT ...
- NAND flash sub-pages
http://www.linux-mtd.infradead.org/doc/ubi.html#L_subpage NAND flash sub-pages As it is said here, a ...
- 使用 Eclipse PhoneGap 构建 Android 应用程序入门
Eclipse 是一种支持多种技术的开源集成开发环境 (IDE),但本文重点介绍 Java 支持,这也是 Android 应用程序的“母语”.Android 是 Google 发布的开源移动操作系统. ...
- iOS UIView上添加mp4视频
ViewController.h文件中添加如下代码: #import <MediaPlayer/MediaPlayer.h> @property(nonatomic,retain) MPM ...
- oracle 查看锁死的表,锁死的进程
select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode f ...
- Ubuntu日常问题搜集和解决办法
搜集了日常工作中linuxmint的使用的命令备份和遇到的问题以及解决办法.(持续更新中) 保持ssh链接超时不自动断开 用ssh链接服务端,一段时间不操作或屏幕没输出(比如复制文件)的时候,会自动断 ...
- Coding源码学习第一部分(AppDelegate.m)
前言:在此首先感谢开源,感谢大神们的无私分享. Coding 的主页:https://coding.net/app#app-feature Coding 自己家的仓库:https://coding.n ...
- ajax属性 data--------------20160705
$.ajax({ type : "get", //这里get和post都可以 url : "cccccc.ccc", data: "name = xx ...
- php截取utf-8中文字符串乱码的解决方法
/** * PHP截取UTF-8字符串,解决半字符问题. * 英文.数字(半角)为1字节(8位),中文(全角)为2字节 * @return 取出的字符串, 当$len小于等于0时, 会返回整个字符串 ...