成果如如下:
源码如下,间接复制保留为 html 文件即可预览:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head><body><canvas id="canvas" width="300" height="300"> <p>道歉,您的浏览器不反对canvas</p> </canvas> <script> /** * 生成环形进度条 */ function toCanvas(id, color, progress) { //canvas进度条 var canvas = document.getElementById(id), ctx = canvas.getContext("2d"), percent = progress, //最终百分比 circleX = canvas.width / 2, //核心x坐标 circleY = canvas.height / 2, //核心y坐标 radius = 80, //圆环半径 cradius = 75, // canvas半径 lineWidth = 6, //圆形线条的宽度 fontSize = 20; //字体大小 //两端圆点 // function smallcircle1(cx, cy, r) { // ctx.beginPath(); // //ctx.moveTo(cx + r, cy); // ctx.lineWidth = 1; // ctx.fillStyle = '#06a8f3'; // ctx.arc(cx, cy, r, 0, Math.PI * 2); // ctx.fill(); // } // function smallcircle2(cx, cy, r) { // ctx.beginPath(); // //ctx.moveTo(cx + r, cy); // ctx.lineWidth = 1; // ctx.fillStyle = '#fff'; // ctx.arc(cx, cy, r, 0, Math.PI * 2); // ctx.fill(); // } //画圆 function circle(cx, cy, r, sAngle, eAngle, bColor = '#eee') { ctx.beginPath(); //ctx.moveTo(cx + r, cy); ctx.lineWidth = lineWidth; ctx.strokeStyle = bColor; // ctx.lineCap = 'round'; // ctx.arc(cx, cy, r, Math.PI * 1, Math.PI * 2); ctx.arc(cx, cy, r, sAngle, eAngle); ctx.stroke(); } //画弧线 function sector(cx, cy, r, startAngle, endAngle, _lineWidth) { ctx.beginPath(); //ctx.moveTo(cx, cy + r); // 从圆形底部开始画 ctx.lineWidth = _lineWidth; // 渐变色 - 可自定义 // var linGrad = ctx.createLinearGradient( // circleX-radius-lineWidth, circleY, circleX+radius+lineWidth, circleY // ); // linGrad.addColorStop(0.0, '#06a8f3'); // //linGrad.addColorStop(0.5, '#9bc4eb'); // linGrad.addColorStop(1.0, '#00f8bb'); // ctx.strokeStyle = linGrad; // 进度条色彩 ctx.strokeStyle = color; //圆弧两端的款式 // ctx.lineCap = 'round'; //圆弧 ctx.arc( cx, cy, r, startAngle, (Math.PI * (1.5 - ((1.5 / 100) * process))), true ); ctx.stroke(); } //刷新 function loading() { if (process >= percent) { clearInterval(circleLoading); } //革除canvas内容 ctx.clearRect(0, 0, circleX * 2, circleY * 2); //两头的字 ctx.font = fontSize + 'px April'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillStyle = '#999'; ctx.fillText(parseFloat(process).toFixed(0) + '%', circleX, circleY - 10); ctx.font = (fontSize - 4) + 'px April'; ctx.fillStyle = '##a7a7a7'; ctx.fillText('平安', circleX, circleY + 20); circle(circleX, circleY, radius + 14, 0, Math.PI * 2, '#e1f7f3'); //圆形 circle(circleX, circleY, radius, 0, Math.PI * 1.5, '#6bd8b3'); //圆弧 sector(circleX, circleY, radius-8, Math.PI * 1.5, 0, lineWidth * 2); //两端圆点 // smallcircle1(cradius + Math.cos(2 * Math.PI / 360 * 120) * radius, cradius + Math.sin(2 * Math.PI / 360 * 120) * // radius, 0); // smallcircle2(cradius + Math.cos(2 * Math.PI / 360 * (120 + process * 3)) * radius, cradius + Math.sin(2 * Math.PI / // 360 * (120 + process * 3)) * radius, 2); //管制完结时动画的速度 if (process / percent > 0.90) { process += 0.30; } else if (process / percent > 0.80) { process += 0.55; } else if (process / percent > 0.70) { process += 0.75; } else { process += 1.0; } } var process = 0.0; //进度 var circleLoading = window.setInterval(function() { loading(); console.log(11) }, 20); // loading(); } toCanvas('canvas','#6bd8b3', 32); </script></body></html>