SVG环形进度条

SVG(Scalabe Vetor Graphics)可缩放矢量图作技术,发源自XML家族。其优秀方便的图形表现形式,让其被当下各大浏览器所支持。由于其中可内嵌于html,表现出像dom自身元素一样的性质,而被广泛的用于html中的图形表现。

今天我作为一个小白,根据最近的项目经验和大家分享一个用SVG制作的环形进度条案例。该进度条可动态设置进度值。

首先来看一个完成的demo效果:

下面是页面代码:

<svg  width=160px height=160px version="1.1" >
          <path id="defPath1" fill="transparent" stroke="#CCCCCC" stroke-width="6" d="M42.5,146 A75,75 0 1,1 117.5,146" ></path>
          <path id="circle1" fill="transparent" stroke="#7EC51D" stroke-width="6" d="M42.5,146 A75,75 0 1,1 42.5,146" stroke-dasharray="0">
              <animate id="animate1" attributeName="stroke-dashoffset" from="0" to="0" dur="1s" fill="freeze" />
          </path>
          <rect width="98" height="9" x="32" y="145"style="fill:white;stroke-width:1;"/>
          <circle id="ball1" cx="0" cy="0" r="5" fill="red">
              <animateMotion id="motion1" begin="0s" dur="1s" path="M42.5,146" fill="freeze" />
          </circle>
      </svg>

注:这里的页面代码其实是初始值状态。

后台代码(js/angularjs):

var PrepareDrawingCircle1 = function(value)
    {
        var circle1 = document.getElementById('circle1');

        //缺口60度
        //这里根据实际情况,将300度分成100份,那么每一份就是rad度
        var rad = Math.PI*(2-1/3)/100;
        var r = 75;//圆环的半径
        var n = Math.floor(value);
        $scope.percentage = 100 - n;
        //目前大小根据界面写死
        var cx = 80;//这里的cx,cy就是svg大小的中心点坐标
        var cy = 80;//
        var cxball = cx + r * Math.sin(Math.PI*(2/3 + 1/2)+n*rad);
        var cyball = cx - r * Math.cos(Math.PI*(2/3 +1/2)+n*rad) + 1;
        var clength = 2 * Math.PI * r * (1-1/6) * n / 100;
        
        
        //非常重要
        var dflag = 0;
        if(Math.PI < n*rad)
        {
            dflag = 1;
        }
        
        var dpath = 'M42.5,146 A75,75 0 ' + dflag + ',1 ' + cxball + ',' + cyball;
        circle1.setAttribute("d",dpath);
        circle1.setAttribute("stroke-dasharray",clength);
        
        var animate1 = document.getElementById('animate1');
        animate1.setAttribute("from",clength);
        
        var motion1 = document.getElementById('motion1');
        motion1.setAttribute("path",dpath);
        
    };

注:

1、只需在需要的地方调用该函数设置进度值就ok了,设置完成后会有一个动画效果,每次进入页面也会触发。

2、本demo中使用的环形半径是75,svg大小设置160X160,四周各自预留了5

3、本demo中下方的开口是60°,你可用根据自己的需要不要开口或者改变开口大小,不过在改变时,你可能会使用到一些和圆相关的数学知识,如圆周长、圆的参数方程等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值