开发项目,PM会跟踪项目进度;完成某个事情,也可以设置一个完成的进度。

  这里用canvas绘制一个简单百分比圆环进度条。

  看下效果:

  1. 动画方式

 

  2. 静默方式

 

 

   贴上代码,仅供参考 

  1. /**
  2. * LBS drawRing
  3. * Date: 2015-04-24
  4. * ==================================
  5. * opts.parent 插入到哪里 一个JS元素对象
  6. * opts.width 宽度 = 2* (半径+弧宽)
  7. * opts.radius 半径
  8. * opts.arc 弧宽
  9. * opts.perent 百分比
  10. * opts.color 弧渲染颜色 [底色,进度色]
  11. * opts.textColor 文字渲染颜色
  12. * opts.textSize 文字渲染大小
  13. * opts.animated 是否以动画的方式绘制 默认false
  14. * opts.after 绘制完成时执行函数
  15. * ==================================
  16. **/
  17.  
  18. function drawRing(opts) {
  19. var _opts = {
  20. parent: document.body,
  21. width: 100,
  22. radius: 45,
  23. arc: 5,
  24. perent: 100,
  25. color: ['#ccc', '#042b61'],
  26. textColor: '#000',
  27. textSize: '14px',
  28. animated: false,
  29. after: function() {}
  30. }, k;
  31. for (k in opts) _opts[k] = opts[k];
  32.  
  33. var parent = _opts.parent,
  34. width = _opts.width,
  35. radius = _opts.radius,
  36. arc = _opts.arc,
  37. perent = parseFloat(_opts.perent),
  38. color = _opts.color,
  39. textSize = _opts.textSize,
  40. textColor = _opts.textColor,
  41. c = document.createElement('canvas'),
  42. ctx = null,
  43. x = 0,
  44. animated = _opts.animated,
  45. after = _opts.after;
  46.  
  47. parent.appendChild(c);
  48. ctx = c.getContext("2d");
  49. ctx.canvas.width = width;
  50. ctx.canvas.height = width;
  51.  
  52. function clearFill() {
  53. ctx.clearRect(0, 0, width, width);
  54. }
  55.  
  56. function fillBG() {
  57. ctx.beginPath();
  58. ctx.lineWidth = arc;
  59. ctx.strokeStyle = color[0];
  60. ctx.arc(width / 2, width / 2, radius, 0, 2 * Math.PI);
  61. ctx.stroke();
  62. }
  63.  
  64. function fillArc(x) {
  65. ctx.beginPath();
  66. ctx.lineWidth = arc;
  67. ctx.strokeStyle = color[1];
  68. ctx.arc(width / 2, width / 2, radius, -90 * Math.PI / 180, (x * 3.6 - 90) * Math.PI / 180);
  69. ctx.stroke();
  70. }
  71.  
  72. function fillText(x) {
  73. ctx.font = textSize + ' Arial';
  74. ctx.fillStyle = textColor;
  75. ctx.textBaseline = "middle";
  76. ctx.textAlign = 'center';
  77. ctx.fillText(x.toFixed(1) + '%', width / 2, width / 2);
  78. }
  79.  
  80. function fill(x) {
  81. fillBG();
  82. fillArc(x);
  83. fillText(x);
  84. }
  85.  
  86. if (!animated) return fill(perent);
  87.  
  88. fill(x);
  89. !function animate() {
  90. if (++x > perent) return after && after();
  91. setTimeout(animate, 10);
  92. clearFill();
  93. fill(x);
  94. }();
  95. }

  很简单的一段代码

  先创建一个canvas画布对象,设置宽高。 

  1. var c = document.createElement('canvas');
  2. document.body.appendChild(c);
  3. var ctx = c.getContext("2d");
  4. ctx.canvas.width = width;
  5. ctx.canvas.height = width;

  圆环由两部分组成,底部灰色完整的环,根据百分比变动的环。

  先绘制底部完整的环。

  1. //起始一条路径
  2. ctx.beginPath();
  3. //设置当前线条的宽度
  4. ctx.lineWidth = 10; //10px
  5. //设置笔触的颜色
  6. ctx.strokeStyle = '#ccc';
  7. //arc() 方法创建弧/曲线(用于创建圆或部分圆)
  8. ctx.arc(100, 100, 90, 0, 2 * Math.PI);
  9. //绘制已定义的路径
  10. ctx.stroke();

  重点理解:canvas arc() 方法 :HTML5 canvas arc() 方法

  arc方法默认是从3点钟方向(90度)开始绘制的,一般要把这个开始处设置平常习惯的0点方向。

  也需要理解弧度和角度的互相转换。

  1. degrees = radians * 180/Math.PI
  2. 角度等于弧度乘于180再除于PI
  3.  
  4. radians = degrees * Math.PI/180
  5. 弧度等于角度度乘于PI再除于180

  绘制根据百分比变动的环。

  1. ctx.beginPath();
  2. ctx.lineWidth = 10;
  3. ctx.strokeStyle = '#f30';
  4. //设置开始处为0点钟方向(-90 * Math.PI / 180)
  5. //x为百分比值(0-100)
  6. ctx.arc(100, 100, 90, -90 * Math.PI / 180, (x * 3.6 - 90) * Math.PI / 180);
  7. ctx.stroke();

  绘制中间的文字

  1. ctx.font = '40px Arial';
  2. ctx.fillStyle = '#f30';
  3. ctx.textBaseline = 'middle';
  4. ctx.textAlign = 'center';
  5. ctx.fillText('50.0%', 100, 100);

  到此一个静止的百分比圆环进度条就绘制完成了。

   不满足于绘制静态的,动态的更生动有趣一些。

  canvas动态绘制就是在一段时间内:绘制一个区域的内容,清除这个区域内容,再重新绘制内容,重复这个过程(绘制-清除-绘制)。

  有兴趣可以去研究一下,上面的代码也可以参考,如果结合动画函数和运动公式可以绘制更生动的百分比圆环进度条哦。

  --------------------------------------------

  参考:

  HTML 5 Canvas 参考手册

canvas绘制百分比圆环进度条的更多相关文章

  1. canvas 绘制动态圆环进度条

    由于使用的是vue开发,所以就展示一下绘制函数好了,上图是效果图 drawMain(drawing_elem, percent, forecolor, bgcolor) { /* @drawing_e ...

  2. Vue/React圆环进度条

    数据展示,一直是各行各业乐此不疲的需求,具体到前端开发行业,则是各种各种图表数据展示,各种表格数据展示,烦不胜烦(繁不胜繁)! 前几天刚做了折线图.柱状图.饼状图之类的图表数据展示效果,今天又碰到了类 ...

  3. css3 制作圆环进度条

    引子 移动端做一个 loadiing 加载的图标,跟以往沿用的都不太一样,是一个圆环进度条,圆环进度条也就罢了,还得能用百分比控制. CSS3 实现圆环 demo 刚开始写这个圆环的时候是参照帖子上给 ...

  4. 两种CSS3圆环进度条详解

    晚上睡觉之前,我抽了1个多小时,研究了一下圆环进度条,结合从网上查阅的资料,我终于掌握了两种圆环的生成方法. 这次的效果就是单纯的CSS3效果,也没有写具体的JS,等以后有时间在好好整理一下吧~. 第 ...

  5. 简单实用的纯CSS百分比圆形进度条插件

    percircle是一款简单实用的纯CSS百分比圆形进度条插件.你不需要做任何设置,只需要按该圆形进度条插件提供的标准HTML结构来编写代码,就可以生成一个漂亮的百分比圆形进度条. 首先要做的就是引入 ...

  6. svg实现圆环进度条

    开源实现:https://github.com/lugolabs/circles 自行实现:圆环与svg画布间剩的空间太多. <!DOCTYPE html> <html> &l ...

  7. CSS3实现圆环进度条

    摘要:圆环进度条被应用于各个场景,比如我们可以用来表示加载进度等.通常我们可以用 css3 的动画去实现. 详解 css3 实现圆环进度条 简单的画一个圆环,我们都知道如何使用 css 画一个圆环.( ...

  8. 浅谈一下关于使用css3来制作圆环进度条

    最近PC端项目要做一个这样的页面出来,其他的都很简单,关键在于百分比的圆环效果.我最初打算是直接使用canvas来实现的,因为canvas实现一个圆是很简便的. 下面贴出canvas实现圆环的代码,有 ...

  9. Android 自定义view --圆形百分比(进度条)

    转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50334595 注:本文由于是在学习过程中写的,存在大量问题(overdraw onDr ...

随机推荐

  1. ExtJs选择器

    想要利用ExtJS的库函数对DOM进行各类操作,就要得到Element类型的对象,但是Ext.get()取到的虽然是Element,但是参数只能是id,如果大家对jQuery的selector方式很喜 ...

  2. CentOS Kernel Source Install

    http://linuxmoz.com/centos-kernel-source-install/

  3. IBM之MQ使用指南

    随着计算机网络和分布式应用的不断发展.远程消息传递越来越成为应用系统中必不可少的组成部分. 商业消息中间件的出现保证了消息传输的可靠性,高效率和安全性,同一时候也降低了系统的开发周期. 眼下应用最多的 ...

  4. atitit.高级编程语言的特性 and 未来趋势与进化.doc

    atitit.高级编程语言的特性 and 未来趋势与进化.doc 1 编程语言的发展历程 1 1.1 编程语言的进化,起始发现背后的思想 :不论什么两个系统之间的复杂性,都能够通过加入一个抽象层要屏蔽 ...

  5. 10、ERP设计之系统基础管理(BS)- 平台化设计

    ShareERP 2013-09-03 ERP业务平台化是每个软件提供商必须要进行的趋势,传统定制化路线已死,不能走定制化的老路了.以往最大问的题是不能累积和沉淀技术及提升项目业务管理能力,其次是管理 ...

  6. 使用COM提供SafeArray数据

    在前一篇博文<读取SafeArray数据>我们介绍了C#读取安全数组.那么我们的COM怎么编写呢? 1. 定义SAFEARRAY变量 SAFEARRAY *pSArray = NULL; ...

  7. Django写的投票系统1(转)

    当然主要是从django的帮助文档里面来的,权当是翻译吧 这个投票系统的主要功能有 1.一个前台页面,可以让用户来投票 2.一个管理员页面,可以用来添加.修改.删除投票 首页第一步要确定你已经安装了D ...

  8. Python的TkinterButton做为父窗口

    #-*-coding:utf--*- import Tkinter,time,tkMessageBox,sys,BeBigModule class MainFrame: def __init__(se ...

  9. VMware vSphere 服务器虚拟化之二十七桌面虚拟化之View中使用Thinapp软件虚拟化

    VMware vSphere 服务器虚拟化之二十七桌面虚拟化之View中使用Thinapp软件虚拟化 VMware ThinApp 应用程序虚拟化软件是无代理解决方案,通过将应用程序隔离并封装为EXE ...

  10. Redis11种Web应用场景

    Redis的一个非常大优点就是能够不用整个转入到这个数据库,而是能够沿用之前的MySQL等数据库,而仅在一些特定的应用场景通过Redis的特性提高效率.本文列出了11个这种Web应用场景,如显示最新的 ...