by Conmajia
SN: S22-W1M

由来

看到一篇帖子《vue实用组件——圆环百分比进度条》,让我想起了很多年前我在WinForm下仿制过的Chrome进度条。

▲ 原版进度条

那时候我经常半夜接着酒劲儿用我的小破电脑跟GDI+ 较真儿,一转眼都快10年了。这日子过得还真是让人唏嘘呢。本来想翻出来纪念一下,可是以前的东西早他妈不知扔哪儿了,有点儿遗憾。再看看上边儿那进度条是Vue的,我现在还没本事玩儿,可是又手痒痒,先用H5做一个凑合吧。反正也是打发时间,少打几圈儿麻将呗。

特性 & Demo

说实在的,单进度条非做一圆,别的屁功能没有,真的没意思,不如来点儿添头,把一堆进度条都给揉里边儿。我相信一定有人能用上,别客气。

  1. 可以堆叠任意数量子进度条
  2. 计算总进度
  3. 原生H5
▲ 新版进度条(静态演示)

最后的效果就上边儿那图的把式。如果你的浏览器支持H5,那么你应该可以看到下面这个动态演示。你可以点击按钮试试看用在网页上的实际效果。

准备中…亲手试试:  随机看看

▲ 新版进度条(实时演示,需要浏览器支持)

代码

全是基础的东西。

非常简单,略去了一些不重要的东西(我讨厌整页整页都是代码的文章)。最最基础的H5动画,没啥可说的,我写了点儿注释。

// ctx 为 canvas context
var ctx = g.getContext('2d');
// (x, y) 中心点
var x = g.width / 2, y = g.height / 2;
// p 保存所有子进度条,value 0-100%
var p = [{value: 0,color: 'orange'
},
...
{value: 0,color: 'blue'
}];// 演示专用(略):随机更新各个进度条 value,模拟走进度
function inc(a) {
...
}// 计算总进度
function getTotal(a) {var t = 0;for(var i = 0; i < a.length; i++) {t += a[i].value;}return t / a.length;
}// 画圆环。start、stop 起止点,以 scale 划分 360 度
function drawBand(start, stop, color = 'silver', scale = 100) {var div = Math.PI * 2 / scale;ctx.save();ctx.strokeStyle = color;ctx.lineWidth = 30;ctx.beginPath();ctx.arc(x, y, 100, start * div, stop * div, false);ctx.stroke();ctx.closePath();ctx.restore();
}// 画所有子进度条
function drawProg(a) {for (var i = 0; i < a.length; i++) {var s = 0;// 计算起点for (var j = 0; j < i; j++) {s += a[j].value;}s /= a.length;drawBand(s, s + a[i].value / a.length, a[i].color);s = s + a[i].value;}
}// 中心总进度文字
function drawLabel(n) {
...
}// 动画循环
(function drawFrame() {window.requestAnimationFrame(drawFrame);ctx.clearRect(0, 0, g.width, g.height); // 清空绘图区drawBand(0, 100); // 画底环(0-100 刻度,默认色)drawLabel(total(p)); // 画进度文字drawProg(p); // 画所有进度条inc(p); // 模拟更新,演示专用
}());

代码就这么简单。老实说,其实这挺无聊的,bootstrap自带的进度条就能堆叠(当然那个是直线型的);随便用个Chart.js、ECharts.js,也能轻轻松松实现这个效果,比这好上一万倍

▲ 一个ECharts的例子

まあ,就当练手了呗,反正我的H5连门儿都还没入,弄出来也算熟悉熟悉,挺好的。

The End. \(\Box\)


var c = ['Navy', 'Blue', 'Aqua', 'Teal', 'Green', 'Lime', 'Yellow', 'Orange', 'Red', 'Maroon', 'Fuchsia'];
var auto = true;
var g = document.getElementById('canvas1');
var ctx = g.getContext('2d');
var x = g.width / 2;
var y = g.height / 2;
var rad = Math.PI * 2 / 100;
var p = [{
speed: 0.2,
value: 0,
color: 'orange'
}, {
speed: 0.1,
value: 0,
color: 'blue'
}, {
speed: 0.2,
value: 0,
color: 'green'
}, {
speed: 0.4,
value: 0,
color: 'red'
}];
$('#add').click(function(e) {
e.preventDefault();
auto = true;
add();
});
$('#remove').click(function(e) {
e.preventDefault();
auto = true;
remove();
});
$('#shuffle').click(function(e) {
e.preventDefault();
auto = true;
shuffle();
});
function add() {
p.push({
speed: Math.random(),
value: 0,
color: c[Math.floor(Math.random() * (c.length))]
});
}
function remove() {
p.pop();
}
function shuffle() {
for (var i = 0; i < p.length; i++) {
p[i].value = Math.floor(Math.random() * 100);
p[i].speed = Math.random();
}
p=_.shuffle(p);
}
function inc(a) {
if (!auto) return false;
for (var i = 0; i < a.length; i++) {
if (a[i].value <= 100) a[i].value += a[i].speed;
}
if (total(a) >= 100) {
for (var i = 0; i < a.length; i++) {
a[i].value = 0;
}
}
}
function total(a) {
var t = 0;
for (var i = 0; i < a.length; i++) {
t += a[i].value;
}
return t / a.length;
}
function draw(s, l, p) {
ctx.save();
ctx.strokeStyle = p.color;
ctx.lineWidth = 30;
ctx.beginPath();
ctx.arc(x, y, 100, Math.PI / 2 + s * rad, Math.PI / 2 + (s + p.value / l) * rad, false);
ctx.stroke();
ctx.closePath();
ctx.restore();
}
function drawProg(a) {
for (var i = 0; i < a.length; i++) {
var s = 0;
for (var j = 0; j < i; j++) {
s += a[j].value;
}
s /= a.length;
draw(s, a.length, a[i]);
s = s + a[i].value;
}
}
function drawBand() {
ctx.save();
ctx.lineWidth = 30;
ctx.strokeStyle = "silver";
ctx.beginPath();
ctx.arc(x, y, 100, 0, Math.PI * 2, false);
ctx.stroke();
ctx.closePath();
ctx.restore();
}
function drawLabel(n) {
ctx.save();
ctx.strokeStyle = "silver";
ctx.font = "40px Arial";
ctx.textAlign = "center";
ctx.fillText(n ? numeral(n).format("0.0") + "%" : "N/A", x, y + 15);
ctx.stroke();
ctx.restore();
}(function drawFrame() {
window.requestAnimationFrame(drawFrame);
ctx.clearRect(0, 0, g.width, g.height);
drawBand();
inc(p);
drawLabel(total(p));
drawProg(p);
}());

转载于:https://www.cnblogs.com/conmajia/p/stackable-circular-progress-bar.html

H5 可堆叠的圆环进度条,支持任意数量子进度条相关推荐

  1. android绘制环形进度_Android使用Canvas绘制圆形进度条效果

    前言 Android自定义控件经常会用到Canvas绘制2D图形,在优化自己自定义控件技能之前,必须熟练掌握Canvas绘图机制.本文从以下三个方面对Canvas绘图机制进行讲解: 画布Canvas ...

  2. python3 进度条_详细介绍Python进度条tqdm的使用

    前言 有时候在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以便我们能够及时了解情况.这对于第三方库非常丰富的Python来说,想要实现 ...

  3. 记录《时间进度》(人生进度条)(包含自定义进度、小插件)的开发

    前言 开发的本意是想看到可视化的时间,让我们心存敬畏,珍惜时间,毕竟时间一去不复返! 最近灵感突突然袭来,想着做一个时间精度条:今天度过了多少,这周度过了多少,这个月度过了多少,今年度过了多少(以及这 ...

  4. html进度条实现原理,HTML5 progress进度条详解

    HTML5 progress 元素简介 progress是HTML5的一个新元素,表示定义一个进度条,用途很广泛,可以用在文件上传的进度显示,文件下载的进度显示,也可以作为一种loading的加载状态 ...

  5. html进度条实现原理,js实现进度条

    假如我有这样的一个代码: for(var i=0;i<100;i++) { for(var j=0;j<1 JS做的进度条,如何做的? js其实是没法计算到网页的加载进度的. 目前见到的打 ...

  6. 【天天外链】支持H5链接跳转到企业小程序任意页面!

    除了传统的固定外链模式,天天外链现在支持H5/链接跳转到企业小程序任意页面. 提前准备 在天天外链官网小程序/后台注册[天天外链],使用密钥版添加您的小程序(输入配置参数即可) 创建一条推广链接(简单 ...

  7. php上传进度条问题,php上传进度条

    分页:用于多条数据展示时可设置分页展示,每页展示固定数据条数. 高级 选项树:树形结构选择设置.适用于要展示的数据为树形结构. 步骤条:步骤进度条.可设置总步骤数和每一步的展示名称. 时间轴:一般绑定 ...

  8. 进度条上的起伏_进度条(ProgressBar)的功能与用法

    进度条也是UI界面中一种非常实用的组件,通常用于向用户显示某个耗时操作完成的的百分比.进度条可以动态的显示进度,因此避免长时间的执行某个耗时的操作,让用户感觉程序失去了响应,从而更好的提高用户界面的友 ...

  9. Java渐变进度条_Android ProgressBar自定义图片进度,自定义渐变色进度条

    java.lang.Object ↳android.view.View ↳android.widget.ProgressBar 直接子类 AbsSeekBar 间接子类 RatingBar, Seek ...

最新文章

  1. 点击按钮的时候,切换搜索框的显示与隐藏(动画)
  2. 不允许 ASSIGNMENT 语句中包含 FOR XML 子句。
  3. 犹太人的思维习惯 (转载)
  4. SDWebImage 在Swift中遇坑解决
  5. 大数据文字游戏_基于大数据的游戏化教学系统研究.docx
  6. 特征值 与特征向量(机器学习算法原理与实践)
  7. 神秘围棋AI“神之一手”:5秒一步令日本高手叹服
  8. ​EMNLP 2021 最新综述:语言模型中的关系性知识
  9. 同行不支持鸿蒙系统,鸿蒙系统虽好,但也需要国内同行支持
  10. 图嵌入综述 (arxiv 1709.07604) 译文五、六、七
  11. Druid的外网访问异常
  12. ASCII与unicode的转换
  13. html 脚本 gdi,基于gdi的简单画图
  14. 我们用transformer干啥?
  15. 软件测试面试题整理(三)之工作/项目流程篇
  16. Web3在新加坡,叩开世界的大门
  17. java compile方法_Java Pattern.compile函数的语法以及参数
  18. 计算机管理用户组不见了,win7系统计算机管理本地用户和组不见了的解决方法...
  19. Thinkphp5使用ZipArchive批量打包下载图片
  20. MOS管和IGBT有什么区别?别傻傻分不清了

热门文章

  1. html.actionlink 锚点,razor - 从@ Html.ActionLink MVC 4将参数传递给控制器
  2. group python 读hdf5_Python处理Excel模块的对比分析
  3. 如何设置电脑自动锁屏_Apple ID密码忘了怎么重置?丨如何让面容和指纹解锁立马失效?...
  4. mysql自动备份linux_Mysql for linux mysql自动备份脚本
  5. 斑马打印机怎么打印二维码_简单介绍斑马打印机---GX430t
  6. 局域网视频共享 php,window_Windows 7媒体库管理音视频文件实现局域网共享, 任务分析 多台电脑连接的家 - phpStudy...
  7. jqueryui手风琴_jQueryUI手风琴插件
  8. c语言 ++ --运算符_C / C ++中的按位运算符
  9. 使用ResultReceiver的Android IntentService
  10. primefaces教程_Primefaces AjaxBehavior和AjaxExceptionHandler组件示例教程