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 广告多媒体未来 模拟仿真远程操作图形编辑绘图步骤
获得 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();运行结果为
语法: Canvas.getContext( typeStr )
描述:
该方法用于绘制上下文工具.如果是绘制平面图形使用 '2d' 作为参数, 如果绘制立体图形使用 'webgl'.使用 '2d' 返回 CanvasRenderingContext2D 类型的对象.使用 'webgl' 返回 WebGLRenderingContext 类型的对象.语法: CanvasRenderingContext2D.moveTo( x, y )
描述:
该方法用于设置绘制起点.其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.语法: CanvasRenderingContext2D.lineTo( x, y )
描述:
该方法用于设置需要绘制直线的另一个点. 最终描边后会连线当前点和方法参数描述的点.其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.语法: CanvasRenderingContext2D.stroke()
描述: 该方法用于连线, 将描述的所有点按照指定顺序连接起来.
分别绘制下面的案例:
绘制直线计算坐标.描边调用 CanvasRenderingContext2D.stroke() 方法.填充使用 CanvasRenderingContext2D.fill() 方法.
语法: CanvasRenderingContext2D.fill()
描述: 该方法会按照描绘的点的路径来填充图形. 默认是黑色.
绘制下面的图
填充满足非零环绕数原则
说明:
在 canvas 中使用各种方法描点实际上描述的是一个称为路径( path )的东西.在 canvas 绘图中, 所有描述的东西都是路径, 只有最后填充或描边的时候才会显示出效果.每一个路径都是一个状态.练习: 绘制下面图形
语法: CanvasRenderingContext2D.closePath()
描述: 使用该方法可以将最后一个描点与最开始的描点自动连接起来.
案例
... ctx.moveTo( 100, 100 ); ctx.lineTo( 300, 100 ); ctx.lineTo( 300, 200 ); ctx.closePath(); ctx.stroke();结果为:
练习: 使用 closePath 改写非零环绕的案例.
墙面油漆图示
示例
如果需要在一个区域内绘制描边的图形和填充的图形. 例如
设置描边与填充不一定只能使用黑色的细线. 可以利用一些属性设置其效果
CanvasRenderingContext2D.lineWidth 设置线宽.CanvasRenderingContext2D.lineCap 设置线末端类型.CanvasRenderingContext2D.lineJoin 设置相交线的拐点.CanvasRenderingContext2D.getLineDash() 获得线段样式数组.CanvasRenderingContext2D.setLineDash() 设置线段样式.CanvasRenderingContext2D.lineDashOffset 绘制线段偏移量.语法: 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();效果
语法: 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 = 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();效果
语法:
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(); } }效果