弧形进度条,弧形百分比

要帮助同事写一个弧度的进度条,进度条顶部有一个小圆,具体如下

需要指出的是,我们canvas的绘制是需要弧度,所以我们代码中使用角度,等待绘制的时候再砖话为弧度值

<!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>
    <div>
        <input type="range" id="cowbell" name="cowbell" min="0" max="100" value="50" step="1">
        <label for="cowbell">拖拽角度变化</label>
    </div>
    <canvas id="canvas"></canvas>

    <script>
       
        const cowbell = document.getElementById("cowbell");
        cowbell.addEventListener("input", (a, c) => {
            console.log(cowbell.value)
            draw(cowbell.value)
        });


        let canvas = document.getElementById('canvas');
        let ctx = canvas.getContext('2d');
        canvas.width = 500;
        canvas.height = 500;
        let conterw = canvas.width / 2;//弧度的中心坐标
        let conterh = canvas.height / 2;//弧度的中心坐标
        let sAngle = 150;//其实角度
        let eAngle = 390;//结束角度
        let nAngle = 100;//以sAngle为基准的角度
        let leng = 100;//半径

        draw(50)

        //绘制百分比进度
        function draw(percentage) {
            //清空画布
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            //结束角度 - 起始角度 = 中间区域的范围值  
            //中间区域的范围值 / 100 *当前进度百分比
            //得到百分比下的角度值
            nAngle = (eAngle - sAngle) / 100 * percentage;
            //绘制一个弧度进度条底色
            drawArc(sAngle, eAngle, eAngle, conterw, conterh, '#e1e8ee')
            //绘制一个弧度有进度的
            drawArc(sAngle, eAngle, nAngle, conterw, conterh, '#6f78cc')
            //绘制圆的坐标
            let { x, y } = getArcFillXY(sAngle, eAngle, leng, conterw, conterh, nAngle)
            //绘制圆
            drawArcFill(x, y);
        }
 
        //绘制弧度
        function drawArc(sAngle, eAngle, nAngle, conterw, conterh, strokeStyle = '#e1e8ee') {
            ctx.beginPath();
            //在基础sAngle上加上差量的角度  
            nAngle += sAngle;
            //控制最小的角度
            if (sAngle > nAngle) {
                nAngle = sAngle;
            }
            //  控制最大的角度
            if (eAngle < nAngle) {
                nAngle = eAngle;
            }
            //绘制角度
            ctx.arc(conterw, conterh, leng, rad(sAngle), rad(nAngle), false);
            ctx.strokeStyle = strokeStyle;
            ctx.lineWidth = 5;
            ctx.stroke();
            ctx.closePath();
        }
        function drawArcFill(x, y) {
            //绘制一个半径为5得红色圆形
            ctx.beginPath();
            ctx.arc(x, y, 5, 0, 2 * Math.PI, false);
            ctx.fillStyle = 'red';
            ctx.fill();
            ctx.closePath();
        }
        //将上述的圆形放在进度条的头部,随着弧形的角度一起变化 
        /**
         * 
         */
        function getArcFillXY(sAngle, eAngle, leng, conterw, conterh, nAngle) {
            //半径是
            let x = conterw - leng;
            let y = conterh;
            //在基础sAngle上加上差量的角度
            nAngle += sAngle
            //控制最小的角度
            if (sAngle > nAngle) {
                nAngle = sAngle;
            }
            //  控制最大的角度
            if (eAngle < nAngle) {
                nAngle = eAngle;
            }
            //差值角度
            let cAngle = nAngle - sAngle;
            x = Math.cos(rad(nAngle)) * leng + conterw;
            y = Math.sin(rad(nAngle)) * leng + conterh;
            return {
                x, y
            }
        }
        //度数转化为弧度得方法
        function rad(sAngle) {
            return sAngle * Math.PI / 180;
        }


    </script>
</body>

</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值