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

= 100) {
for (var i = 0; i

H5 可堆叠的圆环进度条,支持任意数量子进度条的更多相关文章

  1. Android 进度条(ProgressBar)和拖动条(Seekbar)补充“自定义组件”(总结)

    这周结束了,我也码了一周的字,感觉还是很有种脚踏实地的感觉的,有时间就可以看看自己的总结再查漏补缺,一步一个脚印,做出自己最理想的项目. 今天我们讲两点: 1.ProgressBar: 其实前面也稍微 ...

  2. Progress.js – 为页面上的任意对象创建进度条效果

    Progress.js 是一个 JavaScript 和 CSS3 的库,它帮助开发人员为网页上的每个对象创建和管理进度条效果.你可以设计自己的模板,进度条或者干脆定制. 您可以使用 Progress ...

  3. HTML5 CSS3 诱人的实例 : 网页载入进度条的实现,下载进度条等

    今天给大家带来一个比較炫的进度条,进度条在一耗时操作上给用户一个比較好的体验,不会让用户认为在盲目等待,对于没有进度条的长时间等待,用户会任务死机了,毫不犹豫的关掉应用:一般用于下载任务,删除大量任务 ...

  4. HTML5 CSS3 诱人的实例 : 网页加载进度条的实现,下载进度条等

    今天给大家带来一个比较炫的进度条,进度条在一耗时操作上给用户一个比较好的体验,不会让用户觉得在盲目等待,对于没有进度条的长时间等待,用户会任务死机了,毫不犹豫的关掉应用:一般用于下载任务,删除大量任务 ...

  5. Devrama Slider - 支持任意 HTML 的内容滑块

    Devrama Slider 是一个图片滑块,支持很多特色功能.除了支持图片滑动,其它的 HTML 内容也支持.主要特色:响应式.图片预加载.图片延迟加载.进度条.自定义导航栏和控制按钮等等. 在线演 ...

  6. 如何在MQ中实现支持任意延迟的消息?

    什么是定时消息和延迟消息? 定时消息:Producer 将消息发送到 MQ 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到 Consumer 进行消费,该消息即定时消 ...

  7. 【OpenGL(SharpGL)】支持任意相机可平移缩放的轨迹球实现

    [OpenGL(SharpGL)]支持任意相机可平移缩放的轨迹球 (本文PDF版在这里.) 在3D程序中,轨迹球(ArcBall)可以让你只用鼠标来控制模型(旋转),便于观察.在这里(http://w ...

  8. 一条insert语句批量插入多条记录

    一条insert语句批量插入多条记录 常见的insert语句,向数据库中,一条语句只能插入一条数据: insert into persons (id_p, lastname , firstName,  ...

  9. 4位或者5位led数码显示,485通信modbus,支持任意小数点写入,工业标准设置,可和plc,dcs,组态完美对接,支持定制修改

    MRD-5030具有4位8段数码管,支持通过工业标注协议Modbus(Modbus-RTU)控制显示,支持任意小数点的显示.数据以半双工方式通信.电源端口和通信端口都具有防浪涌,防雷600W保护,能够 ...

随机推荐

  1. monkey------模块组合测试

    由于项目基本功能和预置APK都很多,单个模块跑消耗机器数量很大,效果也不佳.而且monkey测试经常要过夜测试,所以组合模块试用较多,而且发现问题量也更大.组合模块就是按照测试标准要求和模块特性,按照 ...

  2. 【Maven篇】---解决Maven线上部署java.lang.ClassNotFoundException和no main manifest attribute解决方法

    一.前述 maven 线上部署的话会出现一些问题比如java.lang.ClassNotFoundException或者no main manifest attribute的话,是因为maven 配置 ...

  3. Vue学习小结(一)安装依赖与数据来源

    不多说啥了,生活中都是各种阵痛与惊喜.最近在学习vue框架,刚写完一个小型的后台管理系统(https://github.com/michaelzhengzm/info-manager-systerm_ ...

  4. 一线互联网企业常见的14个Java面试题,Java面试题集大全等你拿,颤抖吧程序员!

    本文由尚学堂学员们根据自己参加过的面试回忆.总结而成,一线互联网企业常见的14个Java面试题,包括各大互联网企业.创业小公司,互联网企业.传统软件公司.对于刚毕业和想要跳槽的宝宝们,再适用不过啦,赶 ...

  5. java 理解如何实现图片验证码 傻瓜都能看懂。

    先代码后解释: 只要把代码复制到你的项目中就可以了. 代码: 验证码工具类: package cn.happy.util.imagesVerTion; /** * Author: SamGroves ...

  6. SpringBoot框架与MyBatis集成,连接Mysql数据库

    SpringBoot是一种用来简化新Spring应用初始搭建及开发过程的框架,它使用特定方式来进行配置,使得开发人员不再需要定义样板化的配置.MyBatis是一个支持普通SQL查询.存储和高级映射的持 ...

  7. 【java线程】的wait、sleep、join、yied

    1.概述 使用Thread相对来说比较简单,没有什么成本,但是通常来说,我们使用线程基本就是覆写run方法,然后调用线程对象的start函数启动线程. 对于面试人员来说,这些都不是面试官会问到的问题, ...

  8. 关于ES5的indexof()和ES7的includes()的区别

    早es5的时候就有了查找数组中是否包含某个值的API  indexOf(); 使用方法很简单,比如有个数组是: var arr=[2,3,4,"php"] 如果我们想知道数组中有没 ...

  9. JenKins使用pm2部署.net core网站

    登录事先准备好的 Jenkins 1 新建任务 2 源码管理 git 输入正确地址 3 构建环境:Delete workspace before build startsAbort the build ...

  10. 第一册:lesson1-2.

    原文: lesson 1 Excuse me! Excuse me! Yes? Is this your handbag? Pardon? Is this your handbag? Yes it i ...