如何用JavaScript canvas制作环形渐变进度条?

2026-04-02 22:331阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计933个文字,预计阅读时间需要4分钟。

如何用JavaScript canvas制作环形渐变进度条?

最近有个需求要做环形渐变进度条,网上找了半天没找到合适的,大部分渐变色条都是径向渐变的。所以自己用canvas写了个环形渐变的图:这个渐变其实就是将圆形分成许多小块分别绘制。

最近有个需求要做环形渐变色进度条,去网上找了半天没找到合适的,大多数渐变色都是径向渐变,所以自己用canvas写了个环形渐变的图:

如何用JavaScript canvas制作环形渐变进度条?

这个渐变其实就是把圆环分成许多小块分别绘制的,所以小块分的越多,渐变色越均匀,但是当圆环尺寸比较小的时候,边缘特别毛糙,需要适当减少份数,代码里是用unit 这个变量手动控制的,算是一个缺陷吧。

代码在此:

<!DOCTYPE html> <html>     <head>         <style>             html,body,canvas{                 width:100%;                 height:100%;                 margin:0;             }         </style>     </head>     <body>         <canvas id="canvas"></canvas>     </body>     <script>         const canvas = document.getElementById('canvas');         const W = document.body.offsetWidth;         const H = document.body.offsetHeight;         canvas.width = W;         canvas.height = H;         const ctx = canvas.getContext("2d");         /*         // percent:圆环展示的百分比(0~1)         // startColor:开始颜色         // endColor:结束颜色         */         function paint(percent,startColor,endColor){             // 圆环起始位置,正下方             let startAngle = Math.PI/2;             // 圆环结束位置,一个整圆(Math.PI*2)乘以比例 + 起始位置             let endAngle = ((Math.PI*2)*percent + startAngle);             // 每次绘制的弧度单位,越小颜色分布越均匀,但图形较小时边缘越糙             const unit = 0.2;             // 根据最小弧度单位计算整个圆弧可以切成多少小份             let division = parseInt((endAngle-startAngle)/unit,10);             // 生成渐变色数组             let gradient = new gradientColor(startColor,endColor,division);                          let start = startAngle;             let end = start;             for(let i=0; i<division; i++){                 ctx.beginPath();                 ctx.lineCap = "round";                 end = start+unit;                 ctx.lineWidth = 20;                 ctx.strokeStyle = gradient[i];                 ctx.arc(W/2,H/2,90,start,end);                 ctx.stroke();                 start+=unit;             }         }         /*         // startColor:开始颜色hex         // endColor:结束颜色hex         // step:几个阶级(几步)         */         function gradientColor(startColor,endColor,step){             startRGB = this.colorRgb(startColor);//转换为rgb数组模式             startR = startRGB[0];             startG = startRGB[1];             startB = startRGB[2];             endRGB = this.colorRgb(endColor);             endR = endRGB[0];             endG = endRGB[1];             endB = endRGB[2];             sR = (endR-startR)/step;//总差值             sG = (endG-startG)/step;             sB = (endB-startB)/step;             var colorArr = [];             for(var i=0;i<step;i++){                 //计算每一步的hex值                 var hex = this.colorHex('rgb('+parseInt((sR*i+startR))+','+parseInt((sG*i+startG))+','+parseInt((sB*i+startB))+')');                 colorArr.push(hex);             }             return colorArr;         }         // 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)         gradientColor.prototype.colorRgb = function(sColor){             var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;             var sColor = sColor.toLowerCase();             if(sColor && reg.test(sColor)){                 if(sColor.length === 4){                     var sColorNew = "#";                     for(var i=1; i<4; i+=1){                         sColorNew += sColor.slice(i,i+1).concat(sColor.slice(i,i+1));                     }                     sColor = sColorNew;                 }                 //处理六位的颜色值                 var sColorChange = [];                 for(var i=1; i<7; i+=2){                     sColorChange.push(parseInt("0x"+sColor.slice(i,i+2)));                 }                 return sColorChange;             }else{                 return sColor;             }         };         // 将rgb表示方式转换为hex表示方式         gradientColor.prototype.colorHex = function(rgb){             var _this = rgb;             var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;             if(/^(rgb|RGB)/.test(_this)){                 var aColor = _this.replace(/(?:(|)|rgb|RGB)*/g,"").split(",");                 var strHex = "#";                 for(var i=0; i<aColor.length; i++){                     var hex = Number(aColor[i]).toString(16);                     hex = hex<10 ? 0+''+hex :hex;// 保证每个rgb的值为2位                     if(hex === "0"){                         hex += hex;                     }                     strHex += hex;                 }                 if(strHex.length !== 7){                     strHex = _this;                 }                 return strHex;             }else if(reg.test(_this)){                 var aNum = _this.replace(/#/,"").split("");                 if(aNum.length === 6){                     return _this;                 }else if(aNum.length === 3){                     var numHex = "#";                     for(var i=0; i<aNum.length; i+=1){                         numHex += (aNum[i]+aNum[i]);                     }                     return numHex;                 }             }else{                 return _this;             }         }                  paint(0.9,'#ff6464','#3586ff');     </script> </html>

生成渐变色的代码是网上找的,由于那个代码好多地方都能找到,也弄不清谁是原创,这里就不贴地址了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

本文共计933个文字,预计阅读时间需要4分钟。

如何用JavaScript canvas制作环形渐变进度条?

最近有个需求要做环形渐变进度条,网上找了半天没找到合适的,大部分渐变色条都是径向渐变的。所以自己用canvas写了个环形渐变的图:这个渐变其实就是将圆形分成许多小块分别绘制。

最近有个需求要做环形渐变色进度条,去网上找了半天没找到合适的,大多数渐变色都是径向渐变,所以自己用canvas写了个环形渐变的图:

如何用JavaScript canvas制作环形渐变进度条?

这个渐变其实就是把圆环分成许多小块分别绘制的,所以小块分的越多,渐变色越均匀,但是当圆环尺寸比较小的时候,边缘特别毛糙,需要适当减少份数,代码里是用unit 这个变量手动控制的,算是一个缺陷吧。

代码在此:

<!DOCTYPE html> <html>     <head>         <style>             html,body,canvas{                 width:100%;                 height:100%;                 margin:0;             }         </style>     </head>     <body>         <canvas id="canvas"></canvas>     </body>     <script>         const canvas = document.getElementById('canvas');         const W = document.body.offsetWidth;         const H = document.body.offsetHeight;         canvas.width = W;         canvas.height = H;         const ctx = canvas.getContext("2d");         /*         // percent:圆环展示的百分比(0~1)         // startColor:开始颜色         // endColor:结束颜色         */         function paint(percent,startColor,endColor){             // 圆环起始位置,正下方             let startAngle = Math.PI/2;             // 圆环结束位置,一个整圆(Math.PI*2)乘以比例 + 起始位置             let endAngle = ((Math.PI*2)*percent + startAngle);             // 每次绘制的弧度单位,越小颜色分布越均匀,但图形较小时边缘越糙             const unit = 0.2;             // 根据最小弧度单位计算整个圆弧可以切成多少小份             let division = parseInt((endAngle-startAngle)/unit,10);             // 生成渐变色数组             let gradient = new gradientColor(startColor,endColor,division);                          let start = startAngle;             let end = start;             for(let i=0; i<division; i++){                 ctx.beginPath();                 ctx.lineCap = "round";                 end = start+unit;                 ctx.lineWidth = 20;                 ctx.strokeStyle = gradient[i];                 ctx.arc(W/2,H/2,90,start,end);                 ctx.stroke();                 start+=unit;             }         }         /*         // startColor:开始颜色hex         // endColor:结束颜色hex         // step:几个阶级(几步)         */         function gradientColor(startColor,endColor,step){             startRGB = this.colorRgb(startColor);//转换为rgb数组模式             startR = startRGB[0];             startG = startRGB[1];             startB = startRGB[2];             endRGB = this.colorRgb(endColor);             endR = endRGB[0];             endG = endRGB[1];             endB = endRGB[2];             sR = (endR-startR)/step;//总差值             sG = (endG-startG)/step;             sB = (endB-startB)/step;             var colorArr = [];             for(var i=0;i<step;i++){                 //计算每一步的hex值                 var hex = this.colorHex('rgb('+parseInt((sR*i+startR))+','+parseInt((sG*i+startG))+','+parseInt((sB*i+startB))+')');                 colorArr.push(hex);             }             return colorArr;         }         // 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)         gradientColor.prototype.colorRgb = function(sColor){             var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;             var sColor = sColor.toLowerCase();             if(sColor && reg.test(sColor)){                 if(sColor.length === 4){                     var sColorNew = "#";                     for(var i=1; i<4; i+=1){                         sColorNew += sColor.slice(i,i+1).concat(sColor.slice(i,i+1));                     }                     sColor = sColorNew;                 }                 //处理六位的颜色值                 var sColorChange = [];                 for(var i=1; i<7; i+=2){                     sColorChange.push(parseInt("0x"+sColor.slice(i,i+2)));                 }                 return sColorChange;             }else{                 return sColor;             }         };         // 将rgb表示方式转换为hex表示方式         gradientColor.prototype.colorHex = function(rgb){             var _this = rgb;             var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;             if(/^(rgb|RGB)/.test(_this)){                 var aColor = _this.replace(/(?:(|)|rgb|RGB)*/g,"").split(",");                 var strHex = "#";                 for(var i=0; i<aColor.length; i++){                     var hex = Number(aColor[i]).toString(16);                     hex = hex<10 ? 0+''+hex :hex;// 保证每个rgb的值为2位                     if(hex === "0"){                         hex += hex;                     }                     strHex += hex;                 }                 if(strHex.length !== 7){                     strHex = _this;                 }                 return strHex;             }else if(reg.test(_this)){                 var aNum = _this.replace(/#/,"").split("");                 if(aNum.length === 6){                     return _this;                 }else if(aNum.length === 3){                     var numHex = "#";                     for(var i=0; i<aNum.length; i+=1){                         numHex += (aNum[i]+aNum[i]);                     }                     return numHex;                 }             }else{                 return _this;             }         }                  paint(0.9,'#ff6464','#3586ff');     </script> </html>

生成渐变色的代码是网上找的,由于那个代码好多地方都能找到,也弄不清谁是原创,这里就不贴地址了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。