欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
  这里并没引用jquery等第三方库,只是用dom操作和canvas的特性编写的。
 
  canvas画圆大体分为实心圆和空心圆。
 
  根据需求分析知道该圆为实心圆。
 
  1.先用canvas画实心圆
 
  //伪代码
 
  varcanvas=document.createElement("canvas");
 
  varctx=canvas.getContext('2d');
 
  ctx.beginPath();
 
  ctx.arc(圆心x轴坐标,圆心y轴坐标,半径,开始角,结束角);
 
  ctx.fillStyle='green';
 
  ctx.closePath();
 
  ctx.fill();
 
  2.根据不同颜色绘制饼状图
 
  
 
  //伪代码
 
  varcanvas=document.createElement("canvas");
 
  varctx=canvas.getContext('2d');
 
  ctx.beginPath();
 
  ctx.arc(圆心x轴坐标,圆心y轴坐标,半径,绿色开始角,绿色结束角);
 
  ctx.fillStyle='green';
 
  ctx.closePath();
 
  ctx.fill();
 
  ctx.beginPath();
 
  ctx.arc(圆心x轴坐标,圆心y轴坐标,半径,红色开始角,红色结束角);
 
  ctx.fillStyle='red';
 
  ctx.closePath();
 
  ctx.fill();
 
  ctx.beginPath();
 
  ctx.arc(圆心x轴坐标,圆心y轴坐标,半径,黄色开始角,黄色结束角);
 
  ctx.fillStyle='yellow';
 
  ctx.closePath();
 
  ctx.fill();
 
  ctx.beginPath();
 
  ctx.arc(圆心x轴坐标,圆心y轴坐标,半径,紫色开始角,紫色结束角);
 
  ctx.fillStyle='purple';
 
  ctx.closePath();
 
  ctx.fill();
 
  3.动态绘制饼状图
 
  动态绘制圆网上普遍推荐三种方法:requestAnimationFrame、setInterval(定时)、还有动态算角度的。
 
  这里我用的是第一种requestAnimationFrame方式。
 
  在编写的过程中发现一个问题,就是动态画圆时并不是以圆心的坐标画的。为了解决这一问题,需要在每次画圆时重新将canvas的画笔的坐标定义为最初圆心的坐标。
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  <!DOCTYPEhtml>
 
  <html>
 
  <head>
 
  <metacharset="utf-8">
 
  <title></title>
 
  <style>
 
  #graph{
 
  /*border:1pxsolidblack;
 
  height:100%;
 
  width:100%;
 
  box-sizing:border-box;*/
 
  }
 
  </style>
 
  </head>
 
  <body>
 
  <pid="circle"style="width:500px;float:left;"></p>
 
  </body>
 
  </html>
 
  <scripttype="text/javascript">
 
  (function(window,undefined){
 
  vardata=[
 
  {"product":"产品1","sales":[192.44,210.54,220.84,230.11,220.85,210.59,205.49,200.55,195.71,187.46,180.66,170.90]},
 
  {"product":"产品2","sales":[122.41,133.16,145.65,158.00,164.84,178.62,185.70,190.13,195.53,198.88,204.32,210.91]},
 
  {"product":"产品3","sales":[170.30,175.00,170.79,165.10,165.62,160.92,155.92,145.77,145.17,140.27,135.99,130.33]},
 
  {"product":"产品4","sales":[165.64,170.15,175.10,185.32,190.90,190.01,187.05,183.74,177.24,181.90,179.54,175.98]}
 
  ]
 
  vardom_circle=document.getElementById('circle');
 
  if(dom_circle!=undefined&&dom_circle!=null)
 
  {
 
  varcanvas=document.createElement("canvas");
 
  dom_circle.appendChild(canvas);
 
  varctx=canvas.getContext('2d');
 
  vardefaultStyle=function(Dom,canvas){
 
  if(Dom.clientWidth<=300)
 
  {
 
  canvas.width=300;
 
  Dom.style.overflowX="auto";
 
  }
 
  else{
 
  canvas.width=Dom.clientWidth;
 
  }
 
  if(Dom.clientHeight<=300)
 
  {
 
  canvas.height=300;
 
  Dom.style.overflowY="auto";
 
  }
 
  else
 
  {
 
  canvas.height=Dom.clientHeight;
 
  }
 
  //坐标轴区域
 
  //注意,实际画折线图区域还要比这个略小一点
 
  return{
 
  p1:'green',
 
  p2:'red',
 
  p3:'yellow',
 
  p4:'purple',
 
  x:0,//坐标轴在canvas上的left坐标
 
  y:0,//坐标轴在canvas上的top坐标
 
  maxX:canvas.width,//坐标轴在canvas上的right坐标
 
  maxY:canvas.height,//坐标轴在canvas上的bottom坐标
 
  r:(canvas.width)/2,//起点
 
  ry:(canvas.height)/2,//起点
 
  cr:(canvas.width)/4,//半径
 
  startAngle:-(1/2*Math.PI),//开始角度
 
  endAngle:(-(1/2*Math.PI)+2*Math.PI),//结束角度
 
  xAngle:1*(Math.PI/180)//偏移量
 
  };
 
  }
 
  //画圆
 
  vartmpAngle=-(1/2*Math.PI);
 
  vards=null;
 
  varsum=data[0]['sales'][0]+data[0]['sales'][1]+data[0]['sales'][2]+data[0]['sales'][3]
 
  varpercent1=data[0]['sales'][0]/sum*Math.PI*2;
 
  varpercent2=data[0]['sales'][1]/sum*Math.PI*2+percent1;
 
  varpercent3=data[0]['sales'][2]/sum*Math.PI*2+percent2;
 
  varpercent4=data[0]['sales'][3]/sum*Math.PI*2+percent3;
 
  console.log(percent1);
 
  console.log(percent2);
 
  console.log(percent3);
 
  console.log(percent4);
 
  vartmpSum=0;
 
  vardrawCircle=function(){
 
  if(tmpAngle>=ds.endAngle)
 
  {
 
  returnfalse;
 
  }
 
  elseif(tmpAngle+ds.xAngle>ds.endAngle)
 
  {
 
  tmpAngle=ds.endAngle;
 
  }
 
  else{
 
  tmpAngle+=ds.xAngle;
 
  tmpSum+=ds.xAngle
 
  }
 
  //console.log(ds.startAngle+'***'+tmpAngle);
 
  //console.log(tmpSum);
 
  //ctx.clearRect(ds.x,ds.y,canvas.width,canvas.height);
 
  if(tmpSum>percent1&&tmpSum<percent2)
 
  {
 
  ctx.beginPath();
 
  ctx.moveTo(ds.r,ds.ry);
 
  ctx.arc(ds.r,ds.ry,ds.cr,ds.startAngle+percent1,tmpAngle);
 
  ctx.fillStyle=ds.p2;
 
  }
 
  elseif(tmpSum>percent2&&tmpSum<percent3)
 
  {
 
  ctx.beginPath();
 
  ctx.moveTo(ds.r,ds.ry);
 
  ctx.arc(ds.r,ds.ry,ds.cr,ds.startAngle+percent2,tmpAngle);
 
  ctx.fillStyle=ds.p3;
 
  }
 
  elseif(tmpSum>percent3)
 
  {
 
  ctx.beginPath();
 
  ctx.moveTo(ds.r,ds.ry);
 
  ctx.arc(ds.r,ds.ry,ds.cr,ds.startAngle+percent3,tmpAngle);
 
  ctx.fillStyle=ds.p4;
 
  }
 
  else{
 
  ctx.beginPath();
 
  ctx.moveTo(ds.r,ds.ry);
 
  ctx.arc(ds.r,ds.ry,ds.cr,ds.startAngle,tmpAngle);
 
  ctx.fillStyle=ds.p1;
 
  }
 
  ctx.closePath();
 
  ctx.fill();
 
  requestAnimationFrame(drawCircle);
 
  }
 
  this.toDraw=function(){
 
  ds=defaultStyle(dom_circle,canvas);
 
  //console.log(tmpAngle);
 
  //console.log(ds.xAngle)
 
  ctx.clearRect(ds.x,ds.y,canvas.width,canvas.height);
 
  drawCircle();
 
  }
 
  this.toDraw();
 
  varself=this;
 
  window.onresize=function(){
 
  self.toDraw()
 
  }
 
  }
 
  })(window);
 
  </script>





本文转载自中文网
 

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h55046.shtml