環形變色進度條

思路:
svg
兩個圓,一個爲進度條底色,一個爲進度條,使圓環內部填充顏色不可見,設置外部邊框線爲stroke-dasharray=‘0,xxx’和線寬; 即外邊框虛線,且初始時,實線爲0,虛線比實線大即可->傳入百分比進度即二位整數,動態增加實線的長度,虛線長度一定要比圓環長度長,否則會出現多段實線->在改變實現長度的過程中,通過
rgb的方式,將顏色的豎直和百分比綁定,字體顏色類似,實現進度條變色

精髓:通過圓形外邊框虛線的實線部分從0到有的過程,且空白初始佔滿圓環,且比圓環長度長

其中虛線的起始位置爲圓心水平向右的交點,可以通過transform="rotate(-90,圓心x,圓心y)"實現起點位置在頂部

代碼示例:

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>
    <style>
        .text{
            text-align: center;
            dominant-baseline:middle;
        }
        body{
            text-align: center;
        }
        .box{
            height: 700px;
            width: 700px;
            margin:0 auto;
        }
    </style>
    
</head>
<body>
    
    <div style="border:solid 1px orange;" class='box'>

        <svg  id='svg' width='100%' height='100%'
        xmlns="http://www.w3.org/2000/svg">

            <!-- 設置底色的圓環 -->
            <circle cx='350' cy='350' r='300' stroke='gray' fill='none' stroke-width='40' stroke-linecap='round'></circle>
           
            <!-- 設置進度條 -->
            <!-- 旋轉設置進度條從圓環上頂點開始,即按照圓心(350,350)逆時針旋轉90-->
            <!--strok-dasharray='0,10000' 只要虛線空白比實現長即可  -->
            <circle class='progress' 
                transform='rotate(-90,350,350)'
                cx='350' cy='350' r='300' fill='none' stroke='red'
                stroke-width='40' stroke-linecap='round' strok-dasharray='0,10000' 
            ></circle>  

            <!-- 設置文本 -->
            <text class='text' x='350' y='350' font-size='200' fill='red' text-anchor='middle'>0</text>
        </svg>
        
    </div>

    <script src='js/index.js'></script>
    <script>
window.onload=function(){

    //命名空間
    let svgNS="http://www.w3.org/2000/svg";

    //獲取父級元素
    var div=document.querySelector('.box');
    //獲取svg
    let svg=document.querySelector('#svg');


    //創建標籤
    function createTag(tag,obj){
        var oTag=document.createElementNS(svgNS,tag);
        for(var attr in obj){
            oTag.setAttribute(attr,obj[attr]);
        }

        return oTag;

    }




}


    </script>
</body>
</html>

js:

//獲取進度條
var progressDom = document.querySelector(".progress");
//獲取文本對象
var textDom=document.querySelector('.text');

//進度條變化
function rotateCircle(persent){
    //獲取svg圓環的總長,通過半徑長度算出總長
    var circleLength=Math.floor(2*Math.PI*parseFloat(progressDom.getAttribute('r')));

    //按照百分比算出進度環的長度
    var value=persent*circleLength/100;
    //根據百分比變換顏色
    // 紅色255,0,0 藍色0,191,255 即從紅色變換成藍色
    var red=255+parseInt((0-255)/100*persent);
    var green=0+parseInt((191-0)/100*persent);
    var blue=0+parseInt((255-0)/100*persent);

    //設置虛線的路徑和(實線)顏色,空白長度必須比圓環長度長
    progressDom.setAttribute('stroke-dasharray',value+",10000");
    progressDom.setAttribute('stroke',`rgb(${red},${green},${blue})`);

    //設置文本內容顏色
    textDom.innerHTML=persent+'%';
    textDom.setAttribute('fill',`rgb(${red},${green},${blue})`);

}

//定時器,每30毫秒百分比+1;百分比爲100時置0
let num=0;
setInterval(()=>{
    num++;
    if(num>100)
    {
        num=0;
    }
    rotateCircle(num);
},30)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章