canvas 自定义百分比画圈

如果你需要下面这样的圆

和这样的圆

下面的代码可以 你可以开箱即用(vue2.x), 当然其它的需要技术栈需要你适当优化一下

html 复制代码
<canvas id="circle" height="148px" width="148px"></canvas>
js 复制代码
// 执行
this.circle(80,'#67C23A','#F2F6FC','#67C23A')

// 方法
circle(percentData,textColor,backgroundCircleColor,circleColor) {
  var canvas = document.getElementById('circle');
  var ctx = canvas.getContext("2d");
  let percent = percentData
  /*填充文字*/
  ctx.font = "bold 18px Microsoft YaHei";
  /*文字颜色*/
  ctx.fillStyle = textColor;
  /*文字内容*/
  var insertContent = '';
  // var text = ctx.measureText(insertContent);
  /*插入文字,后面两个参数为文字的位置*/
  /*此处注意:text.width获得文字的宽度,然后就能计算出文字居中需要的x值*/
  // ctx.fillText(insertContent, (132 - text.width) / 2, 68);
  /*填充百分比*/
  var ratioStr = percent + '%';
  var text = ctx.measureText(ratioStr);
  ctx.fillText(ratioStr, (148 - text.width) / 2, 83);
  /*开始圆环*/
  var circleObj = {
    ctx: ctx,
    /*圆心*/
    x: 74,
    y: 74,
    /*半径*/
    radius: 62,
    /*环的宽度*/
    lineWidth: 22
  }
  /*灰色的圆环*/
  /*开始的度数-从上一个结束的位置开始*/
  circleObj.startAngle = 0;
  /*结束的度数*/
  circleObj.endAngle = Math.PI * 2;
  circleObj.color = backgroundCircleColor;
  circleObj.lineWidth = 22;
  this.drawCircle(circleObj,2);
  /*有色的圆环*/
  /*从-90度的地方开始画*/
  circleObj.startAngle = - Math.PI * 2 * 90 / 360;
  /*从当前度数减去-90度*/
  circleObj.endAngle = Math.PI * 2 * (percent / 100 - 0.25);
  circleObj.color = circleColor;
  circleObj.lineWidth = 22; // 确保这里与灰色圆环的宽度一致
  if(percent !=0) {
    this.drawCircle(circleObj,1);
  }
},
/*画曲线*/
drawCircle(circleObj,type) {
  var ctx = circleObj.ctx;
  if(type==1){
    ctx.beginPath();
    // 绘制圆形路径,参数:x, y, 半径,起始角度,结束角度,顺时针/逆时针
    ctx.arc(circleObj.x, circleObj.y, circleObj.radius, circleObj.startAngle, circleObj.endAngle, false);
    //设定曲线粗细度
    ctx.lineWidth = circleObj.lineWidth;
    //给曲线着色
    ctx.strokeStyle = circleObj.color;
    //连接处样式,保证红色圆环有圆角效果
    ctx.lineCap = 'round'
    //给环着色
    ctx.stroke();
    ctx.closePath();
  }else if(type==2){
    // 开始一个新的路径
    ctx.beginPath();
    // 绘制圆形路径,参数:x, y, 半径,起始角度,结束角度,顺时针/逆时针
    ctx.arc(circleObj.x, circleObj.y, circleObj.radius, circleObj.startAngle, circleObj.endAngle);
    ctx.lineWidth = circleObj.lineWidth;
    ctx.strokeStyle = circleObj.color
    ctx.stroke();
  }
}
相关推荐
爱编程的小金5 分钟前
前端请求库的下一个进化方向:从 Promise 到策略化
前端·alova·前端请求库·请求策略
hsg776 分钟前
简述:Jensen Huang‘s Footsteps网站全内容分析
前端·javascript·数据库
珑墨30 分钟前
前端 AI 开发通用skill
前端
kyriewen32 分钟前
一个人+Cursor,7天上线付费小程序:第1天我就想放弃了
前端·微信小程序·cursor
大家的林语冰37 分钟前
Angular 王者归来,第 22 个主版本亮相,一大波前沿技术再度引领潮流!
前端·javascript·前端框架
老毛肚1 小时前
jeecgboot TS + Vue 模板化 03
前端·javascript·vue.js
小林ixn1 小时前
揭秘JavaScript面向对象:从栈模拟队列到原型链的深度剖析
javascript
下北沢美食家1 小时前
SSE 入门
前端
云计算磊哥@1 小时前
运维开发宝典023-WEB网站服务
运维·前端·运维开发
FlyWIHTSKY1 小时前
React 19 + Next.js 16(App Router)项目中集成 MSW
开发语言·javascript·vue.js