使用canvas实现带圆点的进度条

使用canvas实现如上图所示的进度条


<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Canvas实现圆点进度条</title>
    <style>
        .canvasArea{ margin:200px auto; height:400px; width:400px; position: relative; padding:10px; }
        .canvasArea p{ position:absolute; width:100%; height: 100%; line-height:400px; text-align:center; font-size:24px;}
        canvas{ position: absolute; width: 100%; height: 100%; top: 0; left: 0; }
        #perValue{ font-weight:bold; color:red; padding-right:10px;}
    </style>
</head>
<body>
<div class="canvasArea" style="">
    <p><span id="perValue">0</span></p>
    <canvas width="400" height="400" id="mask" style="z-index:9"></canvas>
    <canvas width="400" height="400" id="bg"></canvas>
    <canvas width="400" height="400" id="circle" style="z-index:10"></canvas>
</div>

<script type="text/javascript">
(function(){
    var progress = {
        bgid:null,
        maskid:null,
        circleid:null,
        x:0,
        y:0,
        radius:0,
        perV:0,
        load:0,
        bgctx:null,
        maskctx:null,
        circlectx:null,

        init:function(paramObj){
            this.bgid = paramObj.bgid;
            this.maskid = paramObj.maskid;
            this.circleid = paramObj.circleid;
            this.x = paramObj.x;
            this.y = paramObj.y;
            this.radius = paramObj.radius;
            this.perV = paramObj.perV;
            this.load = paramObj.initLoaded;

            bgctx = document.querySelector(this.bgid).getContext("2d");
            circlectx = document.querySelector(this.circleid).getContext("2d");
            maskctx = document.querySelector(this.maskid).getContext("2d");

        },

        drawBgLayer:function(){
            bgctx.beginPath();
            bgctx.lineWidth = 8;
            bgctx.strokeStyle = "#e5e5e5";
            bgctx.arc(this.x, this.y, this.radius, (5/6)*Math.PI, (1/6) * Math.PI, false);
            bgctx.stroke();
        },
        drawMaskLayer:function(){
            var draw = setInterval(function(){
                if (progress.load<=progress.perV) {
                    progress.drawCircle();
                    progress.load += 1;
                } else {
                    clearInterval(draw);
                    draw = null;
                }
            }, 10);
        },
        drawCircle:function(){
            document.querySelector("#perValue").innerHTML = this.load;
            var vv = this.load/100*(4/3)+(5/6);
            if(vv>2){
                vv = vv-2;
            }
            var loaded = vv*Math.PI;
            maskctx.clearRect (0,0,400,400);
            maskctx.beginPath();
            maskctx.lineWidth = 8;
            maskctx.strokeStyle = '#00acee';
            maskctx.arc(this.x, this.y, this.radius, (5/6)*Math.PI, loaded, false);
            maskctx.stroke();

            var para = vv*3.14;
            var px = this.x+this.radius*Math.cos(para-0.03);
            var py = this.y+this.radius*Math.sin(para-0.03);
            circlectx.clearRect (0,0,400,400);
            circlectx.beginPath();
            circlectx.arc(px,py,8,0,360,false);
            circlectx.fillStyle = '#00acee';
            circlectx.fill();
        }
    }

    var paramObj = {
        bgid:'#bg',
        maskid:'#mask',
        circleid:'#circle',
        x:200,
        y:200,
        radius:180,
        perV:80,
        initLoaded:0,
    }
    progress.init(paramObj);
    progress.drawBgLayer();
    progress.drawMaskLayer();
})();
</script>
</body>
</html>


主要的难点在于进度条上的那个圆点,要跟据圆心坐标和半径以及圆心角度计算出那个圆点的圆心坐标来;

另附上求圆上任意一点坐标的公式:

已知圆心坐标为:(x,y),半径为r,圆心角的角度为a;

则圆上点的坐标为:X = x +r*cos(a*3.14/180);  Y = y+r*sin(a*3.14/180);


其它关于canvas以及arc函数相关请参考w3cschool的说明文档: HTML5 canvas arc() 方法


复制代码保存为html打开即可看到效果




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值