Canvas实现环形进度条

直接上代码:

<canvas width="200" height="200" >60%</canvas>
<canvas width="200" height="200" >20%</canvas>
<canvas width="200" height="200" >50%</canvas>

JS:

   window.onload = function() {
var options = [ //存储颜色数组
{"color1": "#00ff00", "color2": "#db4c3d"},
{"color1": "#669900", "color2": "#3faeca"},
{"color1": "#b34d00", "color2": "#4db07c"}
];
var canvas = document.getElementsByTagName("canvas");
for(var i=0;i<canvas.length;i++) {
var that = canvas[i];
var text = that.innerHTML;
var number=text.substring(0,text.length-1);
var ctx = that.getContext("2d"); //画最下面灰色的圆
ctx.clearRect(0, 0, 200, 200);
ctx.beginPath();
ctx.moveTo(100,100);
ctx.arc(100, 100, 100, 0, 2 * Math.PI, false);
ctx.closePath();
ctx.fillStyle = "#ccc";
ctx.fill(); //画扇形
ctx.beginPath();
ctx.moveTo(100, 100);
ctx.arc(100, 100, 100, 0, 2 * Math.PI * number / 100, false);
ctx.closePath();
ctx.fillStyle = options[i].color1;
ctx.fill(); //环形内部的填充
ctx.beginPath();
ctx.moveTo(100, 100);
ctx.arc(100, 100, 80, 0, 2 * Math.PI, false);
ctx.fillStyle = "#fff";
ctx.fill(); //中间圆
ctx.beginPath();
ctx.moveTo(100, 100);
ctx.arc(100, 100, 60, 0, 2 * Math.PI, false);
ctx.fillStyle = options[i].color2;
ctx.fill(); //填充字体
ctx.font = "30px Arial";
ctx.fillStyle = '#fff';
ctx.fillText(text, 70, 110); }
}

效果图:

很明显起始角不合适

改进如下:

补充:因为在IE下canvas不兼容,使用插件excanvas.js,,excanvas.js实现了大部分canvas的API,在绘图方面其核心是通过IE的VML去实现的,利用IE支持的VML对象来模拟Canvas的绘图的。但是还成存在以下缺陷:在速度上与chrome、firefox、safari浏览器相距甚远。也尝试过用其他方式解决IE问题;方法2种,

第一种:通过判断<dd>标签的数字大小,分为两种,大于50,小于50;而改变dt的宽高;

<div class="canvas">
<dl class="every_canvas">
<dt><img src="2.png" alt=""/></dt>
<dd>60%</dd>
</dl>
<dl class="every_canvas">
<dt><img src="2.png" alt=""/></dt>
<dd>30%</dd>
</dl>
<dl class="every_canvas">
<dt><img src="2.png" alt=""/></dt>
<dd>80%</dd>
</dl>
</div> <style>
dl,dt,dd{
margin:0;padding:0;list-style:none;
}
.every_canvas{
width:110px;height:110px;float:left;background:url('1.png');margin-right:20px;
position:relative;overflow:hidden;
}
.every_canvas dt{
width:0px;height:0px;position:absolute;left:0;top:0;overflow:hidden;
}
.every_canvas dd{
width:63px;height:63px;position:absolute;left:23px;top:23px;background:url('3.png')
}
</style>

js:

if (!document.getElementById("canvas").getContext){            //IE浏览器
$('.every_canvas').each(function(index){ //循环每一个dl
var that=$(this);
var text=that.find('dd').text();
var number=text.substring(0,text.length-1); //去掉%
if(number>50){
that.find('dt').css({
"height":"110px",
"width":100*number/110+"px"
})
}else{
that.find('dt').css({
"height":100*number/110+"px",
"width":100*number/110+"px"
})
}
})
}else{ }

效果图:

   环形太直,,太僵硬

第二种:就是在ps里面,把100%的环形,做10%、20%、30%、40%、50%、60%、70%、80%、90%、出来,js把number分成10类,判断数值,选择不一样的图片。繁琐!

最新文章

  1. 未能添加对***.dll的引用 问题解决方法
  2. 2.mongoDB add user in v3.0 问题的解决(Property &#39;addUser&#39; of object admin is not a func)
  3. 基于纯 CSS3 技术实现美观的标签云效果
  4. 能源项目xml文件标签释义--DefaultAdvisorAutoProxyCreator
  5. Yii2.0 实现三级联动 [ 2.0 版本 ]
  6. FPGA内部信号避免高阻态
  7. poj3984迷宫问题
  8. web页面在微信里打开,字体颜色不正常显示
  9. android .9图片制作与注意
  10. 一文入门NodeJS
  11. pl/sql学习(5): 触发器trigger/事务和锁
  12. Scala - 快速学习07 - 模式匹配
  13. 七:python 对象类型详解三:列表
  14. EWS 流通知订阅邮件
  15. mysql学习------错误日志和通用查询日志
  16. 跨系统-跨数据库访问表或创建映射视图-PB访问数据库的特殊处理
  17. #C++初学记录(初识汉诺塔)
  18. 【BZOJ2141】排队(树套树)
  19. Linux系统中提示/usr/bin/ld: cannot find -lxxx错误的通用解决方法
  20. Keil调试程序如何查看变量

热门文章

  1. js取最值:
  2. 团体程序设计天梯赛-练习集-*L1-043. 阅览室
  3. Django MVC与MTV概念 Ajax、分页实现
  4. PAT_A1087#All Roads Lead to Rome
  5. java获取当前日期的前一天,前一月和前一年
  6. NOIP2013 DAY2 T3火车运输
  7. windows 下 logstash 安装启动
  8. Adaptively handling remote atomic execution based upon contention prediction
  9. 服务器监控(包括性能指标与web应用程序)
  10. POJ 1984