学习记录(一)之h5_canvas
canvas(画布)
canvas(画布):
利用JS在网页中绘制图像。
标签:<canvas></canvas>
属性:height,width(宽高属性要写在行内样式中);
公共步骤:
1.获取对象
2.准备绘制工具--获取上下文
方法:
起始点坐标: ctx.moveTo(x轴坐标,y轴坐标);
画线: ctx.lineTo(x坐标,y坐标)
描边颜色: ctx.style="#f00";
描边宽度: ctx.lineWidth=0;
填充颜色: ctx.fillStyle="aqua";
填充: ctx.fill();
描边(默认:黑色1px): ctx.stroke();
开辟新路径: ctx.beginPath();
定义一个渐变方案-保存在一个变量中:
var mylinear.creatliGradient(起始坐标,起始坐标,结束坐标,结束坐标);
mylinear.addColorStop(位置,"#00f");
mylinear.addColorStop(位置,"#0ff");
给矩形,添加渐变色:
ctx.fillstyle=mylinear;
ctx.rect(100,100,200,200);
绘制描边矩形:ctx.strokeRect(起始坐标,起始坐标结束坐标,结束坐标);
绘制填充矩形 ctx.fillRect(起始坐标,起始坐标结束坐标,结束坐标)
清除矩形ctx.clearRect(起始坐标,起始坐标,结束坐标,结束坐标)
设置文本:
ctx.font="24px 微软雅黑";//字体
ctx.fillstyl="#f00";//字体颜色
ctx.text.align="left";//文本对齐方式有三个值:left,right,center
ctx.textBaseline="midden";//基线对齐方式三个值:middle,top,bottom ctx.fillText("字符串", 起始坐标,起始坐标);
画圆: ctx.arc(圆心,圆心,半径,起始角,结束角,顺/逆时针)
创建img图片:
var img=new Img();
img src="img";
img.onload=function(){
ctx.drawImage(img,0,0,512,265)
}
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>线</title> <style type="text/css"> canvas{ border: solid 1px #000; } </style> </head> <body> <canvas width="500" height="500" id="mycanvas"></canvas> <script type="text/javascript"> var mycanvas=document.getElementById("mycanvas"); //获取对象 var ctx=mycanvas.getContext("2d"); //准备绘制工具 //起始点坐标 ctx.moveTo(100,100.5); //画线 ctx.lineTo(300,100.5); //描边颜色 ctx.style="#f00"; //描边宽度 ctx.lineWidth=10; //填充颜色 ctx.fillStyle="aqua"; //填充 ctx.fill(); //描边(默认:黑色1px) ctx.stroke(); //开辟新路径 ctx.beginPath(); //定义一个渐变方案-保存在一个变量中 var mylinear.creatliGradient(100,100,300,300); mylinear.addColorStop(0,"#00f"); mylinear.addColorStop(0.5,"#0ff"); mylinear.addColorStop(1,"#0f0"); //绘制矩形,添加渐变色 ctx.fillstyle=mylinear; ctx.rect(100,100,200,200); /*绘制描边矩形 ctx.strokeRect(100,100,300,200); 绘制填充矩形 ctx.fillRect(100,100,200,300);*/ //清除矩形 ctx.clearRect(200,200,100,100) //设置文本 ctx.font="24px 微软雅黑";//字体 ctx.fillstyl="#f00";//字体颜色 ctx.text.align="left";//文本对齐方式有三个值:left,right,center ctx.textBaseline="midden";//基线对齐方式三个值:middle,top,bottom ctx.fillText("hello",100,100); //画圆 ctx.arc(100,100,100,0,2*Math.PI,false) //图片(在script中的src除外,其他src都是异步); var img=document.getElementsByTagName("img")[0]; ctx.drawImage(img,0,0); //解决方法一,要放在.onloada方法中--等待所有资源下载完成后再去执行; //解决异步的第二种方法 //创建img图片 var img=new Img(); img src="img"; img.onload=function(){ ctx.drawImage(img,0,0,512,265) } </script> </body> </html>
实例:用canvas绘制动态折线图和柱形图
注意:canvas坐标原点与自定义坐标之间的换算
1.折线图:例
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <title></title> 6 <style type="text/css"> 7 canvas{ 8 border: solid 1px #000; 9 margin-left: 300px; 10 } 11 </style> 12 </head> 13 <body> 14 <canvas width="600" height="400" id="mycanvas"></canvas> 15 <script type="text/javascript"> 16 var mycanvas=document.getElementById("mycanvas"); 17 var ctx=mycanvas.getContext("2d"); 18 //网格-循环添加-定义间隔变量space-横线划线起点(0,space*i)终点(canvasw,space*i) 19 var space=10; 20 var canvasw=600; 21 var canvash=400; 22 for (var i = 0; i<40; i++) { 23 ctx.moveTo(0,space*i+0.5); 24 ctx.lineTo(canvasw,space*i+0.5); 25 ctx.strokeStyle="#eee"; 26 ctx.stroke(); 27 } 28 //同理-竖线 29 for (var i = 0; i<60; i++) { 30 ctx.moveTo(space*i+0.5,0); 31 ctx.lineTo(space*i+0.5,canvash); 32 ctx.strokeStyle="#eee"; 33 ctx.stroke(); 34 } 35 //画横纵坐标轴-定义坐标原点(x0,y0)--x轴起点(x0,y0),x轴终点(canvasw-x0,y0) 36 // 三角形/填充-起点(canvasw-x0,y0)-第二个点(canvasw-x0-6,y0-3)-第三个点(canvasw-x0-6,y0+3)-回到起点 37 var yd=30; //原点与边框的距离 38 var x0=yd; 39 var y0=Math.floor(canvash-yd); 40 ctx.beginPath(); 41 ctx.moveTo(x0,y0); 42 ctx.lineTo(canvasw-x0,y0); 43 ctx.strokeStyle="#000000" 44 ctx.stroke(); 45 //三角形 46 ctx.moveTo(canvasw-x0,y0); 47 ctx.lineTo(canvasw-x0-6,y0-4); 48 ctx.lineTo(canvasw-x0-6,y0+4); 49 ctx.lineTo(canvasw-x0,y0); 50 ctx.fillStyle="#000000" 51 ctx.fill(); 52 ctx.textAlign="left"; 53 ctx.textBaseline="middle"; 54 ctx.font="16px 微软雅黑" 55 ctx.fillText("X",canvasw-x0,y0) 56 //y轴 57 ctx.beginPath(); 58 ctx.moveTo(x0,y0); 59 ctx.lineTo(x0,yd); 60 ctx.strokeStyle="#000000" 61 ctx.stroke(); 62 //三角形 63 ctx.moveTo(x0,yd); 64 ctx.lineTo(x0-3,yd+6); 65 ctx.lineTo(x0+3,yd+6); 66 ctx.lineTo(x0,yd); 67 ctx.fillStyle="#000000" 68 ctx.fill(); 69 ctx.textAlign="center"; 70 ctx.textBaseline="bottom"; 71 ctx.font="16px 微软雅黑" 72 ctx.fillText("Y",x0,yd) 73 74 //数据 75 var arr=[ 76 { 77 x:50, 78 y:350 79 }, 80 { 81 x:150, 82 y:310 83 }, 84 { 85 x:250, 86 y:50 87 }, 88 { 89 x:350, 90 y:250 91 }, 92 { 93 x:500, 94 y:200 95 } 96 ] 97 98 ctx.beginPath(); 99 ctx.moveTo(x0,y0); 100 for(i=0;i<arr.length;i++){ 101 //线段 102 ctx.lineTo(arr[i].x,y0-arr[i].y); 103 ctx.strokeStyle="#f00"; 104 ctx.stroke(); 105 //矩形 106 ctx.fillStyle="#f00"; 107 ctx.fillRect(arr[i].x-3,y0-arr[i].y,6,6); 108 //文字 109 ctx.textAlign="left"; 110 ctx.textBaseline="top"; 111 ctx.fillStyle="#333"; 112 ctx.fillText("("+arr[i].x+","+arr[i].y+")",arr[i].x,y0-arr[i].y) 113 114 115 } 116 </script> 117 </body> 118 </html>
2.柱形图:例
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style> 7 canvas{ 8 background-color: #efefef; 9 margin-left: 300px; 10 } 11 </style> 12 </head> 13 <body> 14 <canvas width="800" height="460" id="mycanvas"></canvas> 15 <script type="text/javascript"> 16 var mycanvas=document.getElementById("mycanvas"); 17 var ctx=mycanvas.getContext("2d"); 18 19 var space=100; 20 var canvasw=ctx.canvas.width; 21 var canvash=ctx.canvas.height; 22 23 //画横纵坐标轴-定义坐标原点(x0,y0)--x轴起点(x0,y0),x轴终点(canvasw-x0,y0) 24 var yd=30; //原点与边框的距离 25 var x0=yd; 26 var y0=Math.floor(canvash-yd); 27 ctx.beginPath(); 28 ctx.moveTo(x0,y0); 29 ctx.lineTo(canvasw-x0,y0); 30 ctx.strokeStyle="#000000" 31 ctx.stroke(); 32 //y轴 33 ctx.beginPath(); 34 ctx.moveTo(x0,y0); 35 ctx.lineTo(x0,yd); 36 ctx.strokeStyle="#000000" 37 ctx.stroke(); 38 //横线 39 ctx.beginPath(); 40 for (var i = 1; i<5; i++) { 41 ctx.moveTo(x0,y0-space*i); 42 ctx.lineTo(canvasw-x0,y0-space*i); 43 ctx.strokeStyle="#ccc"; 44 ctx.stroke(); 45 } 46 //前横线 47 ctx.beginPath(); 48 for (var i = 0; i<5; i++) { 49 50 ctx.moveTo(x0-6,y0-space*i); 51 ctx.lineTo(x0,y0-space*i); 52 ctx.strokeStyle="#333"; 53 ctx.stroke(); 54 55 ctx.font="12px 微软雅黑 "; 56 ctx.textAlign="right"; 57 ctx.textBaseline="middle"; 58 ctx.fillStyle="#333"; 59 ctx.fillText(100*i,x0-6,y0-space*i) 60 } 61 var arr=[ 62 { 63 x:"Mon", 64 y:50 65 }, 66 { 67 x:"Tue", 68 y:110 69 }, 70 { 71 x:"Wed", 72 y:150 73 }, 74 { 75 x:"Thu", 76 y:350 77 }, 78 { 79 x:"Fri", 80 y:200 81 }, 82 { 83 x:"sat", 84 y:210 85 }, 86 { 87 x:"sun", 88 y:230 89 } 90 ] 91 92 ctx.beginPath(); 93 for (var i = 0; i<arr.length; i++) { 94 ctx.moveTo(x0+space*(i+1),y0); 95 ctx.lineTo(x0+space*(i+1),y0+6); 96 ctx.strokeStyle="#333"; 97 ctx.stroke(); 98 99 //星期 100 ctx.font="16px 微软雅黑 "; 101 ctx.textAlign="center"; 102 ctx.textBaseline="top"; 103 ctx.fillStyle="#333"; 104 ctx.fillText(arr[i].x,x0+space*(i+1),y0+6); 105 //矩形 106 ctx.fillStyle="#f00"; 107 ctx.fillRect(x0+space*(i+1)-30,y0-arr[i].y,60,arr[i].y); 108 ctx.textBaseline="top"; 109 ctx.fillStyle="#333"; 110 } 111 112 </script> 113 </body> 114 </html>