示例效果图如下:

1、先来制作简单HTML代码结构:

2、再是CSS样式代码:

body {

margin: 0;

padding: 50px 0;

background-color: #444;

}

ul,li {

list-style: none;

margin: 0;

padding: 0;

}

ul li {

float: left;

width: 33%;

text-align: center;

}

3、具体JS代码实现+注释如下:

function drawCircle(_options){

var options = _options || {}; //获取或定义options对象;

options.angle = options.angle || 1; //定义默认角度1为360度(角度范围 0-1);

options.color = options.color || '#fff'; //定义默认颜色(包括字体和边框颜色);

options.lineWidth = options.lineWidth || 10; //定义默认圆描边的宽度;

options.lineCap = options.lineCap || 'square'; //定义描边的样式,默认为直角边,round 为圆角

var oBoxOne = document.getElementById(options.id);

var sCenter = oBoxOne.width / 2; //获取canvas元素的中心点;

var ctx = oBoxOne.getContext('2d');

var nBegin = Math.PI / 2; //定义起始角度;

var nEnd = Math.PI * 2; //定义结束角度;

var grd = ctx.createLinearGradient(0, 0, oBoxOne.width, 0); //grd定义为描边渐变样式;

grd.addColorStop(0, 'red');

grd.addColorStop(0.5, 'yellow');

grd.addColorStop(1, 'green');

ctx.textAlign = 'center'; //定义字体居中;

ctx.font = 'normal normal bold 20px Arial'; //定义字体加粗大小字体样式;

ctx.fillStyle = options.color == 'grd' ? grd : options.color; //判断文字填充样式为颜色,还是渐变色;

ctx.fillText((options.angle * 100) + '%', sCenter, sCenter); //设置填充文字;

/*ctx.strokeStyle = grd; //设置描边样式为渐变色;

ctx.strokeText((options.angle * 100) + '%', sCenter, sCenter); //设置描边文字(即镂空文字);*/

ctx.lineCap = options.lineCap;

ctx.strokeStyle = options.color == 'grd' ? grd : options.color;

ctx.lineWidth = options.lineWidth;

ctx.beginPath(); //设置起始路径,这段绘制360度背景;

ctx.strokeStyle = '#D8D8D8';

ctx.arc(sCenter, sCenter, (sCenter - options.lineWidth), -nBegin, nEnd, false);

ctx.stroke();

var imd = ctx.getImageData(0, 0, 240, 240);

function draw(current) { //该函数实现角度绘制;

ctx.putImageData(imd, 0, 0);

ctx.beginPath();

ctx.strokeStyle = options.color == 'grd' ? grd : options.color;

ctx.arc(sCenter, sCenter, (sCenter - options.lineWidth), -nBegin, (nEnd * current) - nBegin, false);

ctx.stroke();

}

var t = 0;

var timer = null;

function loadCanvas(angle) { //该函数循环绘制指定角度,实现加载动画;

timer = setInterval(function(){

if (t > angle) {

draw(options.angle);

clearInterval(timer);

}else{

draw(t);

t += 0.02;

}

}, 20);

}

loadCanvas(options.angle); //载入百度比角度 0-1 范围;

timer = null;

}

4、代码已封装成函数,除了ID是必填选项,其它都可不填,使用默认值,展示三种调用方法如下:

drawCircle({

id:'one',

color:'#0000ff',

angle:0.5,

lineWidth:5});

drawCircle({

id:'two',

angle:0.75,

color:'#ff0000',

lineWidth:12});

drawCircle({

id:'three',

angle:1,

lineWidth:15,

color:'grd'});

注:还可以在此基础上加强扩展功能,如:设定宽高,多种展示样式等!

前端 环形统计_用Canvas+js 实现简单圆形百分比统计图表相关推荐

  1. canvas+js实现简单的数字华容道小游戏

    数字华容道是个很简单的小游戏,今天就尝试使用canvas+js做个简单的数字华容道小游戏.有关于游戏的具体规则请上网查阅. 一如既往先写个html页面,这里我把游戏的界面水平居中了,这里预留了一个动画 ...

  2. 前端 环形统计_10款jQuery实现的环形百分比图表插件

    1.jQuery实现的环形百分比图表插件 这是一款非常富有创意的jQuery图表插件特效源码,这款jQuery环形百分比图表插件有以下特点:1.图表外观是环形的,因此也十分特别.2.图表数据有百分比显 ...

  3. vue实现搜索框搜索新增_基于Vue.js实现简单搜索框

    主要用到的知识很简单,简单的vuejs2.0的知识就够了.源码用了.vue构建和ES6,用了webpack打包等等.我资历还浅,先用一个简单的.js的写. 先看效果 这里有两个组件,一个组件是logo ...

  4. canvas+js实现简单的双人坦克对战小游戏

    相信有很多人对坦克大战的游戏模仿很有兴趣,在实现经典的坦克大战之前,我先写了个双人的坦克对战,实现了基本的对战功能.下面就开始介绍游戏的编写. 首先创建一个基本的html文件,添加canvas标签以实 ...

  5. canvas+js实现简单的坦克大战小游戏

    使用canvas和js实现经典的坦克大战并不难,坦克和炮弹的绘制可以使用canvas的里API画出,而坦克的移动和炮弹的发射可以依赖于键盘事件和定时器来实现. 在这里我要实现的坦克大战是双人模式,有木 ...

  6. new 实例化对象是啥意思_前端经典面试题解密:JS的new关键字都干了什么?

    写在前面: new关键字在实例化获取对象时都做了什么?是一道经常出现在前端面试时的问题.如果只是简单的了解new关键字是实例化构造函数获取对象,是万万不能够的.更深入的层级发生了什么呢?同时面试官想从 ...

  7. 前端图片压缩上传(纯js的质量压缩,非长宽压缩)

    前端图片压缩上传(纯js的质量压缩,非长宽压缩) 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> ...

  8. 【前端】【cornerstone】cornerstone.js如何编辑图像/加载已有图像数据(以画直线为例)

    [前端][cornerstone]cornerstone.js如何编辑图像/加载已有图像数据(以画直线为例) 首次加载图像 加载已有图像 部分参考博客:<cornerstone.js 使用总结& ...

  9. 2020前端最新面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)(3年前端菜鸟级开发师含泪总结)

    2020前端最新面试题总结(js.html.小程序.React.ES6.Vue.算法.全栈热门视频资源) 文档描述 (今年确实挺难 3年前端菜鸟级开发师含泪总结 希望能帮助大家) 本文是关注微信小程序 ...

  10. 前端HTML5视频_谷粒音乐实战-张晓飞-专题视频课程

    前端HTML5视频_谷粒音乐实战-385人已学习 课程介绍         谷粒音乐是使用WEB技术(HTML.JavaScript.CSS)直接构建的移动端APP.本套视频深入移动端开发的核心部分. ...

最新文章

  1. 【JavaSE】day03_Date、SimpleDateFormat、Calendar、Collection
  2. 机器学习基础知识详解!
  3. JAVA大文件上传断点续传解决方案
  4. POJ3264 【RMQ基础题—ST-线段树】
  5. b站电脑客户端_B站(哔哩哔哩) 视频批量下载工具#电脑版##更新
  6. 走迷宫问题 算法竞赛入门经典
  7. 律师总结二手房买卖中的八大陷阱
  8. 毕向东的Java基础视频教程的学习,作为java基础的基础学习视频
  9. 性能监视器 Performance Monitor-对SQLSERVER进行性能监控
  10. Diamond软件的使用--(1)软件安装及配置
  11. 使用 Golang 实现简易的令牌桶算法
  12. 使用Visual Studio编译Geos
  13. 萌新扫盲2—双绞线的“一百米诅咒”
  14. 诗歌十 寒窑赋(破窑赋)天有不测风云,人有旦夕祸福
  15. linux wifi 8192移植 及部分wifi工具的使用
  16. MyBatisCodeHelper-Pro插件
  17. 十个Mac端设计软件
  18. 安卓8.0 android系统,谷歌安卓8.0重磅来袭!国产定制系统有必要马上适配吗?
  19. 安装centOS 7双系统(四)——解决Broadcom博通BCM 43xx无线网卡驱动问题
  20. 浏览器查看cookie过期时间

热门文章

  1. 计算机组成原理答案 耿,计算机组成理习题课2.ppt
  2. 微型计算机原理DL,微机原理试题
  3. 腾讯云TVP——隐于市,惠于民
  4. 教你分割视频,几分钟快速分割多个视频
  5. Codeforces1194C
  6. laydate限定某天不可选
  7. js获取某年某月某天是第几周
  8. html的div背景,html div背景到底是什么颜色呢?
  9. 标准化建站开拓者王征,教你搭建一个有用的品牌官网
  10. 十行以内,你写过哪些比较酷的 Matlab 代码?