Canvas实现环形进度条
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类,判断数值,选择不一样的图片。繁琐!
Canvas实现环形进度条的更多相关文章
- html5 canvas绘制环形进度条,环形渐变色仪表图
html5 canvas绘制环形进度条,环形渐变色仪表图 在绘制圆环前,我们需要知道canvas arc() 方 ...
- canvas绘制环形进度条
<!DOCTYPE html> <html > <head> <meta http-equiv="content-type" conten ...
- canvas 绘制环形进度条
结果: 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...
- 使用canvas实现环形进度条
html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...
- canvas环形进度条
<style> canvas { border: 1px solid red; margin: 100px; }</style> <canvas id="rin ...
- 【css】如何实现环形进度条
最近团队的童鞋接到了一个有关环形进度条的需求,想要还原一个native的沿环轨迹渐变进度条的效果,看到这个效果的时候,笔者陷入了沉思.. 环形进度条的效果,最先想到的就是使用CSS利用两个半圆的hac ...
- 环形进度条的实现方法总结和动态时钟绘制(CSS3、SVG、Canvas)
缘由: 在某一个游戏公司的笔试中,最后一道大题是,“用CSS3实现根据动态显示时间和环形进度[效果如下图所示],且每个圆环的颜色不一样,不需要考虑IE6~8的兼容性”.当时第一想法是用SVG,因为SV ...
- canvas实现半圆环形进度条
html部分 <canvas id="canvas" width="150" height="150"> <p>抱歉 ...
- 用初中数学知识撸一个canvas环形进度条
周末好,今天给大家带来一款接地气的环形进度条组件vue-awesome-progress.近日被设计小姐姐要求实现这么一个环形进度条效果,大体由四部分组成,分别是底色圆环,进度弧,环内文字,进度圆点. ...
随机推荐
- <转>c++引用与指针的区别(着重理解)
★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指 ...
- react和vue对比
相同点 都支持服务器端渲染 都有Virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent规范 数据驱动视图 都有支持native的方案,React的 ...
- day37-1 面向对象高阶
目录 面向对象高阶 isinstance issubclass 反射(自省) 模块的使用 放在类的使用 call 面向对象高阶 isinstance 判断是否为实例化对象,以后可以用来取代type 和 ...
- mongodb多实例部署
安装与管理MongoDB 1.安装解压源码包 [root@bogon ~]# tar xf mongodb-linux-x86_64-rhel70-4.0.6.tgz [root@bogon ~]# ...
- esp32(M5STACK)程序烧写(Ubuntu)
由于我们的开发环境在Ubuntu上,所以介绍一下如何在Ubuntu上烧写esp32的程序 首先下载esptools pip install esptool 擦除 sudo es ...
- 在微信小程序里使用 watch 和 computed
在开发 vue 的时候,我们可以使用 watch 和 computed 很方便的检测数据的变化,从而做出相应的改变,但是在小程序里,只能在数据改变时手动触发 this.setData(),那么如何给小 ...
- 【codeforces 798A】Mike and palindrome
[题目链接]:http://codeforces.com/contest/798/problem/A [题意] 让你严格改变一个字符,使得改变后的字符串为一个回文串; 让你输出可不可能; [题解] 直 ...
- rsync在windows下的安装和配置
rsync分为服务器端和客户端,以A(服务器端),B(客户端)2台服务器为例 A的IP地址为192.168.1.111 B的ip地址为192.168.1.1231, 先配置服务器端,在服务器上安装cw ...
- nodejs-n-nvm版本管理工具
第一种版本管理工具: n n是Node的一个模块,作者是TJ Holowaychuk(鼎鼎大名的Express框架作者),就像它的名字一样,它的理念就是简单: "no subshells, ...
- 链表的原理及java实现
一:单向链表基本介绍 链表是一种数据结构,和数组同级.比如,Java中我们使用的ArrayList,其实现原理是数组.而LinkedList的实现原理就是链表了.链表在进行循环遍历时效率不高,但是插入 ...