原生HTML5 Canvas 参考API文档
来源:互联网 发布:广式糕点 知乎 编辑:程序博客网 时间:2024/05/29 09:11
说明
本篇内容可以看做是一篇关于canvas的API文档,由于全文的篇幅较长,通常用于作为API文档查看,可通过目录查找。本篇也可做为想详细了解canvas所有操作的学习文章。Canvas 对象表示一个 HTML 画布元素<canvas>。它没有自己的行为,但是定义了一个 API 支持脚本化绘图操作。我们可以直接在该对象上指定宽度和高度,但是,其大多数功能都可以通过 CanvasRenderingContext2D 对象获得。例如:
<canvas id="myCanvas" width="400" height="400"></canvas><script>var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");console.log(ctx); // CanvasRenderingContext2D对象console.log(c.width); // 400console.log(c.height); // 400</script>
<canvas> 标记和 SVG 以及 VML 之间的一个重要的不同是,<canvas> 有一个基于 JavaScript 的绘图 API,而 SVG 和 VML 使用一个 XML 文档来描述绘图。这两种方式在功能上是等同的,任何一种都可以用另一种来模拟。从表面上看,它们很不相同,可是,每一种都有强项和弱点。例如,SVG 绘图很容易编辑,只要从其描述中移除元素就行。要从同一图形的一个 <canvas> 标记中移除元素,往往需要擦掉绘图重新绘制它。
Canvas对象的API详解
1.样式设置 fillStyle | strokeStyle
指设置将要绘制图案的填充或边的样式
fillStyle、strokeStyle 属性设置或返回用于填充绘画的颜色、渐变或模式。
CSS颜色的表示方式有:
——直接用颜色名称:"red" "green" "blue";
——十六进制颜色值: "#EEEEFF";
——rgb(1-255,1-255,1-255);
——rgba(1-255,1-255,1-255,透明度);
常与设置样式配合使用的方法是:填充绘制和边绘制。ctx.fillStyle = "#0000ff";ctx.rect(20, 20, 150, 100);ctx.fill();半透明的蓝色矩形,如:
ctx.fillStyle = "rgba(0, 0, 255, 0.5)";
2.形状设置
形状设置包括了矩形、圆形和贝塞尔曲线。
矩形 rect() | fillRect() | strokeRect() | clearRect()
相关JavaScript语法:
context.rect(x,y,width,height);
context.fillRect(x,y,width,height);
context.strokeRect(x,y,width,height);
context.clearRect(x,y,width,height);属性值:
源码:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");// 红色矩形ctx.beginPath();ctx.lineWidth="6";ctx.strokeStyle="red";ctx.rect(5,5,290,140);ctx.stroke();// 绿色矩形ctx.beginPath();ctx.lineWidth="4";ctx.strokeStyle="green";ctx.rect(30,30,50,50);ctx.stroke();// 蓝色矩形ctx.beginPath();ctx.lineWidth="10";ctx.strokeStyle="blue";ctx.rect(50,50,150,80);ctx.stroke();
(注)方法beginPath()的作用在于从新的路径(或新起点)开始绘制图案,简单来说新图案的绘制过程不受画布已有图案影响。
圆形 arc()
JavaScript语法:
context.arc(x,y,r,sAngle,eAngle,counterclockwise);属性值:
(提示):请使用 stroke() 或 fill() 方法在画布上绘制实际的弧。
绘制一个圆形:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.beginPath();ctx.arc(100,75,50,0,2*Math.PI);ctx.stroke();
弧 arcTo()
在画布上创建介于两个切线之间的弧的JavaScript语法:
context.arcTo(x1,y1,x2,y2,r);属性值:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.beginPath();ctx.beginPath();ctx.moveTo(20,20); // 创建开始点ctx.lineTo(100,20); // 创建水平线ctx.arcTo(150,20,150,70,50); // 创建弧ctx.lineTo(150,120); // 创建垂直线ctx.stroke(); // 进行绘制
二次贝塞尔曲线 quadraticCurveTo()
JavaScript语法:
context.quadraticCurveTo(cpx,cpy,x,y);属性值:
绘制一条二次贝塞尔曲线:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.beginPath();ctx.moveTo(20,20);ctx.quadraticCurveTo(20,100,200,20);ctx.stroke();
三次贝塞尔曲线 bezierCurveTo()
JavaScript语法:
context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);属性值:
cp1x第一个贝塞尔控制点的 x 坐标cp1y第一个贝塞尔控制点的 y 坐标cp2x第二个贝塞尔控制点的 x 坐标cp2y第二个贝塞尔控制点的 y 坐标x结束点的 x 坐标y结束点的 y 坐标(提示):三次贝塞尔曲线需要三个点。前两个点是用于三次贝塞尔计算中的控制点,第三个点是曲线的结束点。曲线的开始点是当前路径中最后一个点。如果路径不存在,那么请使用 beginPath() 和 moveTo() 方法来定义开始点。
绘制一条三次贝塞尔曲线:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.beginPath();ctx.moveTo(20,20);ctx.bezierCurveTo(20,100,200,100,200,20);
ctx.stroke();
3.线条和路径设置
结束线帽lineCap
指设置绘制圆形的结束线帽:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.beginPath();ctx.lineCap="round";ctx.moveTo(20,20);ctx.lineTo(20,200);ctx.stroke();
拐角类型lineJoin
两线相交点拐角的类型。当类型值为miter时,常与miterLimit一起使用。因为当两线夹角越小时,miter尖角会越长,miterLimit用于控制尖角的长度。
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.lineWidth=10;ctx.lineJoin="miter";ctx.miterLimit=5;ctx.moveTo(20,20);ctx.lineTo(50,27);ctx.lineTo(20,34);ctx.stroke();(提示):只有当 lineJoin 属性为 "miter" 时,miterLimit 才有效。如果斜接长度超过 miterLimit 的值,边角会以 lineJoin 的 "bevel" 类型来显示(图解 3):
beginPath( ) | closePath( )
beginPath()可以理解为从新的路径(或新起点)开始绘制图案,简单来说新图案的绘制过程不受画布已有图案影响。如不设置beginPath(),多次绘制时,已有图案会受到新图案的绘制样式影响。closePath( )是指闭合路径,即从当前笔触点至最开始的笔触起始点创建连接直线,形成闭合。
绘制闭合三角形:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.beginPath();ctx.moveTo(20,20);ctx.lineTo(20,100);ctx.lineTo(70,100);ctx.closePath();ctx.stroke();ctx.fillStyle="green";ctx.fill();
moveTo( ) | lineTo( )
moveTo()是指将笔触移动到指定坐标点,lineTo是指从当前笔触坐标点往指定坐标点绘制一条直线。
开始一条路径,移动到位置 0,0。创建到达位置 300,150 的一条线:var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(300,150);ctx.stroke();
4.文本设置
文本样式font
规定字体样式。可能的值:
- normal
- italic
- oblique
规定字体变体。可能的值:
- normal
- small-caps
规定字体的粗细。可能的值:
- normal
- bold
- bolder
- lighter
- 100
- 200
- 300
- 400
- 500
- 600
- 700
- 800
- 900
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.font="40px Arial";ctx.fillText("Hello World",10,50);
文本对齐textAlign
var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");// 在位置 150 创建蓝线ctx.strokeStyle = "blue";ctx.moveTo(150, 0);ctx.lineTo(150, 170);ctx.stroke();ctx.font = "15px Arial";// 显示不同的 textAlign 值ctx.textAlign = "start";ctx.fillText("textAlign=start", 150, 15); //起始位置为注册坐标ctx.textAlign = "end";ctx.fillText("textAlign=end", 150, 30); //结束位置为注册坐标ctx.textAlign = "left";ctx.fillText("textAlign=left", 150, 45); //居中对齐ctx.textAlign = "center";ctx.fillText("textAlign=center", 150, 60); //左对齐ctx.textAlign = "right";ctx.fillText("textAlign=right", 150, 75); //右对齐
文本基线textBaseLine
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");//在位置 y=100 绘制蓝色线条ctx.strokeStyle="blue";ctx.moveTo(5,100);ctx.lineTo(395,100);ctx.stroke();ctx.font="20px Arial"//在 y=200 以不同的 textBaseline 值放置每个单词ctx.textBaseline="top";ctx.fillText("Top",5,100);ctx.textBaseline="bottom";ctx.fillText("Bottom",50,100);ctx.textBaseline="middle";ctx.fillText("Middle",120,100);ctx.textBaseline="alphabetic";ctx.fillText("Alphabetic",190,100);ctx.textBaseline="hanging";ctx.fillText("Hanging",290,100);
绘制文本fillText() | strokeText()
JavaScript 语法:context.fillText(text,x,y,maxWidth);
context.strokeText(text,x,y,maxWidth);属性值:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.font="20px Georgia";ctx.fillText("Hello World!",10,50);ctx.font="30px Verdana";// 创建渐变var gradient=ctx.createLinearGradient(0,0,c.width,0);gradient.addColorStop("0","magenta");gradient.addColorStop("0.5","blue");gradient.addColorStop("1.0","red");// 用渐变填色ctx.fillStyle=gradient;ctx.fillText("w3school.com.cn",10,90);
测量文本宽度measureText()
JavaScript语法:context.measureText(text).width;
5.变换设置
缩放scale() | 旋转rotate() | 位移translate()
JavaScript语法:
context.scale(scalewidth,scaleheight); //缩放
context.rotate(angle); //旋转
旋转角度,以弧度计。
如需将角度转换为弧度,请使用 degrees*Math.PI/180 公式进行计算。
举例:如需旋转 5 度,可规定下面的公式:5*Math.PI/180。
context.translate(x,y); //位移
矩阵设置transform() | setTransform()
两者JavaScript语法相同,以transform为例:
context.transform(a,b,c,d,e,f);属性值:
绘制一个矩形;通过 transform() 添加一个新的变换矩阵,再次绘制矩形;添加一个新的变换矩阵,然后再次绘制矩形。请注意,每当您调用 transform() 时,它都会在前一个变换矩阵上构建:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.fillStyle="yellow";ctx.fillRect(0,0,250,100)ctx.transform(1,0.5,-0.5,1,30,10);ctx.fillStyle="red";ctx.fillRect(0,0,250,100);ctx.transform(1,0.5,-0.5,1,30,10);ctx.fillStyle="blue";ctx.fillRect(0,0,250,100);绘制一个矩形,通过 setTransform() 重置并创建新的变换矩阵,再次绘制矩形,重置并创建新的变换矩阵,然后再次绘制矩形。请注意,每当您调用 setTransform() 时,它都会重置前一个变换矩阵然后构建新的矩阵,因此在下面的例子中,不会显示红色矩形,因为它在蓝色矩形下面:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.fillStyle="yellow";ctx.fillRect(0,0,250,100)ctx.setTransform(1,0.5,-0.5,1,30,10);ctx.fillStyle="red";ctx.fillRect(0,0,250,100);ctx.setTransform(1,0.5,-0.5,1,30,10);ctx.fillStyle="blue";ctx.fillRect(0,0,250,100);
6.阴影设置
阴影颜色shadowColor | 阴影模糊级别shadowBlur
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.shadowBlur=20;ctx.shadowColor="black";ctx.fillStyle="blue";ctx.fillRect(20,20,100,80);
阴影水平坐标shadowOffsetX | 阴影垂直坐标shadowOffsetY
var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");ctx.shadowBlur = 10;ctx.shadowOffsetX = 20;ctx.shadowOffsetY = 20;ctx.shadowColor = "black";ctx.fillStyle = "blue";ctx.fillRect(20, 20, 100, 80);
7.色彩渐变设置
渐变色彩和停止位置addColorStop()
JavaScrip语法gradient.addColorStop(stop,color);属性值:
线性渐变createLinearGradient()
语法:
context.createLinearGradient(x0,y0,x1,y1);属性值:
定义从黑到白的渐变(从左向右),作为矩形的填充样式:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");var grd=ctx.createLinearGradient(0,0,170,0);grd.addColorStop(0,"black");grd.addColorStop(1,"white");ctx.fillStyle=grd;ctx.fillRect(20,20,150,100);
放射性渐变createRadialGradient()
语法:context.createRadialGradient(x0,y0,r0,x1,y1,r1);属性值:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");var grd=ctx.createRadialGradient(75,50,5,75,50,40);grd.addColorStop(0,"red");grd.addColorStop(1,"white");ctx.fillStyle=grd;ctx.fillRect(10,10,150,100);
8.其它设置
图像重复createPattern()
JavaScript语法:
context.createPattern(image,"repeat|repeat-x|repeat-y|no-repeat");
属性值:用到的图像:
在水平和垂直方向重复图像:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");var img=document.getElementById("lamp");var pat=ctx.createPattern(img,"repeat");ctx.rect(0,0,150,100);ctx.fillStyle=pat;ctx.fill();
点是否位于当前路径中isPointInPath()
JavaScript语法:
context.isPointInPath(x,y);属性性:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");ctx.rect(20,20,150,100);if (ctx.isPointInPath(20,50)
){ ctx.stroke();};
绘制图像视频drawImage()
在画布上定位图像:
context.drawImage(img,x,y);JavaScript 语法 2
在画布上定位图像,并规定图像的宽度和高度:
context.drawImage(img,x,y,width,height);JavaScript 语法 3
剪切图像,并在画布上定位被剪切的部分:
context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);
属性值:
var c=document.getElementById("myCanvas");var ctx=c.getContext("2d");var img=document.getElementById("scream");ctx.drawImage(img,90,130,90,80,20,20,90,80);
像素操作createImageData | getImageData() | putImageData()
合成操作globalAlpha() | globalCompositeOperation()
(注)globalCompositeOperation可用于遮罩截图功能。
更多
- 原生HTML5 Canvas 参考API文档
- Canvas---HTML5 Canvas API详解
- HTML5: Canvas API
- HTML5:canvas API
- HTML5程序设计 Canvas API
- HTML5 Canvas API详解
- HTML5 Canvas绘图API
- html5中Canvas API
- html5-canvas基础API
- kuix--API参考文档
- HTML5高级程序设计:Canvas API
- HTML5中canvas API 简介
- Google Weather API 参考文档
- Google Weather API 参考文档
- ztree API文档参考地址
- HTML5 Canvas 基础API和实例
- html5 javascript canvas API 画线,画对角线
- HTML5 Canvas 基础API和实例
- 文章标题
- linux安装tomcat80端口不可用
- java编程思想读书笔记三:操作符
- 浏览器阻止了http传code参数,晕死
- mybatis 之 if test 条件
- 原生HTML5 Canvas 参考API文档
- 快速排序
- STM单片机命名规则
- 软件体系结构
- 通信系统仿真速成第5天:PAM系统在AWGN信道下的互信息
- Maven私有库和本地库的安装与配置 Sonatype Nexus
- Tinker热修复示例
- 程序员考试涉及的排序算法
- Android自定义圆形进度条