详解利用canvas实现环形进度条的方法


Posted in HTML / CSS onJune 12, 2019

前提:有时候在项目中会有用到进度条的情况,使用css3也可以实现,但是对于性能不好的设备,或者网络不好的情况下,卡顿现象非常明显,避免出现不流畅的尴尬情况,所以记录一下,使用canvas来实现的方法。

效果图

详解利用canvas实现环形进度条的方法

DOM中,首先定义canvas画板元素:

<canvas id="canvas" width="500" height="500" style="background:#F7F7F7;">
    <p>you browser not support canvas!</p>
  </canvas>

对于不支持canvas的浏览器则会显示:you browser not support canvas!

接下来是js编写:

定义canvas.js并在页面引入

var canvas = document.getElementById('canvas'), //获取canvas元素
  context = canvas.getContext('2d'), //获取画图环境,指明为2d
  centerX = canvas.width / 2, //Canvas中心点x轴坐标
  centerY = canvas.height / 2, //Canvas中心点y轴坐标
  rad = Math.PI * 2 / 100, //将360度分成100份,那么每一份就是rad度
  speed = 0.1; //加载的快慢就靠它了

//绘制蓝色外圈
function blueCircle(n) {
  context.save();
  context.beginPath();
  context.strokeStyle = "#49f";
  context.lineWidth = 12;
  context.arc(centerX, centerY, 100, -Math.PI / 2, -Math.PI / 2 + n * rad, false);
  context.stroke();
  context.restore();
}

//绘制白色外圈
function whiteCircle() {
  context.save();
  context.beginPath();
  context.strokeStyle = "#A5DEF1";
  context.lineWidth = 12;
  context.arc(centerX, centerY, 100, 0, Math.PI * 2, false);
  context.stroke();
  context.closePath();
  context.restore();
}

//百分比文字绘制
function text(n) {
  context.save();
  context.fillStyle = "#F47C7C";
  context.font = "40px Arial";
  context.textAlign = "center";
  context.textBaseline = "middle";
  context.fillText(n.toFixed(0) + "%", centerX, centerY);
  context.restore();
}

//动画循环
(function drawFrame() {
  window.requestAnimationFrame(drawFrame, canvas);
  context.clearRect(0, 0, canvas.width, canvas.height);

  whiteCircle();
  text(speed);
  blueCircle(speed);

  if (speed > 100) speed = 0;
  speed += 0.1;
}());
window.requestAnimationFrame(drawFrame, canvas);

每行代码的注释标注非常清楚,如果还有不理解的可以去看canvas基础,应该就可以了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3 简写animation
May 10 HTML / CSS
详解如何在css3打包后自动追加前缀插件:autoprefixer
Dec 18 HTML / CSS
CSS3 对过渡(transition)进行调速以及延时
Oct 21 HTML / CSS
HTML5实现表单自动验证功能实例代码
Jan 11 HTML / CSS
video结合canvas实现视频在线截图功能
Jun 25 HTML / CSS
使用HTML5的File实现base64和图片的互转
Aug 01 HTML / CSS
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
Mar 21 HTML / CSS
实例讲解利用HTML5 Canvas API操作图形旋转的方法
Mar 22 HTML / CSS
详解html5页面 rem 布局适配方法
Jan 12 HTML / CSS
CSS3 实现的图片悬停的切换按钮
Apr 13 HTML / CSS
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
Apr 22 HTML / CSS
Html5 实现微信分享及自定义内容的流程
Aug 20 #HTML / CSS
前端canvas动画如何转成mp4视频的方法
Jun 17 #HTML / CSS
详解FireFox下Canvas使用图像合成绘制SVG的Bug
Jul 10 #HTML / CSS
canvas实现有递增动画的环形进度条的实现方法
Jul 10 #HTML / CSS
Html5新增标签与样式及让元素水平垂直居中
Jul 11 #HTML / CSS
解决H5的a标签的download属性下载service上的文件出现跨域问题
Jul 16 #HTML / CSS
html通过canvas转成base64的方法
Jul 18 #HTML / CSS
You might like
全国中波电台频率表
2020/03/11 无线电
人族 TERRAN 概述
2020/03/14 星际争霸
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
详解Nodejs 通过 fs.createWriteStream 保存文件
2017/10/10 NodeJs
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
Python类反射机制使用实例解析
2019/12/30 Python
python实现处理mysql结果输出方式
2020/04/09 Python
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
土木工程应届生自荐信
2013/09/24 职场文书
初三家长会邀请函
2014/01/18 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
工程技术员岗位职责
2014/03/02 职场文书
房产公证书样本
2015/01/23 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
负责培养人意见
2015/06/05 职场文书
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电