html5 canvas實現多重顏色圓環進度條


如題,使用canvas實現如圖效果,該效果用於手機端,也可以用於支持canvas的PC瀏覽器

實現思想:在畫布上畫多重扇圓進行顏色疊加,最后在頂層加上一個白色並且半徑最小的圓覆蓋,使視覺上形成一個圓環。
     第一層是一個灰色的全圓
     第二層是從12點鍾方向時針開始畫的紅色扇圓,當角度=360度時整個圓環都是紅色的。
     第三層是從12點鍾方向時針開始畫的橙色扇圓

當紅色圓角度==橙色圓角度==0度時,圓環是灰色的(最底層的顏色)

當紅色圓角度==360度,橙色圓角度==0度時,圓環是紅色的(第二層顏色)

當紅色圓角度==360度,橙色圓角度>0度時,圓環出現兩種顏色(紅色、橙色)

 

實現的源代碼如下:點擊這里下載源代碼

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type"  content="text/html; charset=utf-8" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
<meta name="MobileOptimized" content="320"/>
<title>多色圓環進度</title>
</head>
<body>
    <canvas id="procanvas" class="procanvas" value="100%"></canvas><!--value代表紅色-->
<script>
    function process(canvasid,op,stylewidth,styleheight){
            var canvas = document.getElementById(canvasid);
            var canvasvalue = canvas.getAttribute("value");
            var process = canvasvalue.substring(0, canvasvalue.length-1);
            var oProcess = op;
            var context = canvas.getContext('2d');
            var scale = window.devicePixelRatio;
            var center = [stylewidth/2*scale,styleheight/2*scale];
            canvas.style.width = stylewidth + "px";
            canvas.style.height = styleheight + "px";
            canvas.width = stylewidth*scale;
            canvas.height = styleheight*scale;
            
         //開始畫一個灰色的圓
            context.beginPath();
            context.moveTo(center[0], center[1]);
            context.arc(center[0], center[1], center[0], 0, Math.PI * 2, false);
            context.closePath();
            context.fillStyle = '#e6e5e5';
            context.fill();
            
            // 畫進度(紅色)
            if(process != 0 && process != 100){
                context.beginPath();
                context.moveTo(center[0], center[1]);
                if(process <25){
                    context.arc(center[0], center[1], center[0], Math.PI*1.5, Math.PI*(1.5+0.5*(process/25)), false);//設置圓弧的起始於終止點
                }
                else{
                    context.arc(center[0], center[1], center[0], Math.PI*1.5, Math.PI*2* ((process / 100)-0.25), false);//設置圓弧的起始於終止點
                }
                context.closePath();
                context.fillStyle = '#db3030';
                context.fill();
            }
            else if(process == 100){
                context.beginPath();
                context.moveTo(center[0], center[1]);
                context.arc(center[0], center[1], center[0], 0, Math.PI*2, false);//設置圓弧的起始於終止點
                context.closePath();
                context.fillStyle = '#db3030';
                context.fill();
            }

            //畫進度(橙色)
            if(oProcess != 0 && oProcess !=100){
                context.beginPath();
                context.moveTo(center[0], center[1]);
                context.arc(center[0], center[1], center[0], Math.PI*1.5,Math.PI*1.5-(oProcess/25)*Math.PI*0.5, true);//設置圓弧的起始於終止點
                context.closePath();
                context.fillStyle = '#fb7d32';
                context.fill();
                //Math.PI*1.5-((oProcess+25)/100*Math.PI)
            }
            else if(oProcess == 100){
                context.beginPath();
                context.moveTo(center[0], center[1]);
                context.arc(center[0], center[1], center[0], 0,Math.PI*2, true);//設置圓弧的起始於終止點
                context.closePath();
                context.fillStyle = '#fb7d32';
                context.fill();
            }

            // 畫內部空白
            context.beginPath();
            context.moveTo(center[0], center[1]);
            context.arc(center[0], center[1], 21*scale, 0, Math.PI * 2, true);
            context.closePath();
            context.fillStyle = 'rgba(255,255,255,1)';
            context.fill();
}
    process("procanvas",40,52,52);//10是橙色
</script>
</body>
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM