前言

网上统计图插件非常多,比如EchartsChart.js等,但是如果你要的是功能简单,单一的统计图,应用这些就会很浪费,也增加自身体积,如果你想要简单的扇形统计图,请看过来!

canvas-charts

HTML主体

<div class="box"> <ul> <li> <canvas id="one" width="200" height="200"></canvas> </li> <li> <canvas id="two" width="200" height="200"></canvas> </li> <li> <canvas id="three" width="200" height="200"></canvas> </li> </ul> </div>

JavaScript

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 为圆角 options.bgLine = options.bgLine || '#ccc'; 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; // 定义结束角度; // grd定义为描边渐变样式 var grd = ctx.createLinearGradient(0, 0, oBoxOne.width, 0); grd.addColorStop(0, '#49b1f5'); // 开始颜色 grd.addColorStop(0.5, '#10af7e'); // 50%时的颜色 grd.addColorStop(1, 'red'); // 结束时的颜色 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 = options.bgLine; // 设置背景颜色 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.01; } }, 20); } loadCanvas(options.angle); // 载入百度比角度 0-1 范围; timer = null; }

调用方法

// 示例一 drawCircle({ id: 'one', // dom元素 color: '#10af7e', // 颜色 bgLine: '#e4e4e4', // 背景颜色 angle: 0.5, // 所占比例 lineWidth: 15, // 宽度(像素) lineCap: 'round' // 描边的样式 }); // 示例二 drawCircle({ id: 'two', angle: 0.75, color: '#49b1f5', bgLine: '#f3766f', lineWidth: 20 }); // 示例三 drawCircle({ id: 'three', angle: 1, lineWidth: 25, color: 'grd' });

CSS

这里的css主要是用来示例页面布局的,可以直接忽略

.box ul, .box li { list-style: none; margin: 0; padding: 0; } .box ul li { float: left; width: 33%; text-align: center; }

演示程序:演示代码
下载源码:下载源码

公告

以后每月5、15、25号更新原创文章,内容不限,喜欢小编的可以点击关注,也可在下方评论留言,你喜欢什么内容,小编根据大家喜欢的内容尝试更新