在Angular6中实现环形百分比进度条

前言

提到百分比进度条,虽然之前没有用到过,但在闲暇之余看到过的Demo 有适配VUE的UI框架 Element-UI 和 Echarts 官网上的环形图。然而,UX 大哥丢过的图大概是这样的。。。。(颜色是我自己配的,概念图,将就看吧...)

而饿了么UI的图是酱事儿的

不太合适,好吧,先不去看这个效果的原生实现,看看echarts~
echart的环形图是酱事儿的

还有酱事儿的

OK,打底的实现已经有了,万一别的计划行不通,Plan B有了, 问题是一个页面不止一个环形图,有N个... echarts的使用方式在SPA里放多个,光是代入option 的代码就需要一大坨...先不考虑用这个。

思考

设计图中的这个环形图,大概分为 三层 ,一层为底部的 百分比圈,纯色的那个,即0%的显示效果, 一层为弧,即1%-100%的显示效果,一层为百分比文字显示,想了下不复杂,技术难点就是弧的实现,作为一个伪前端,实在想不出怎样css实现弧,还得让它转起来... 有问题,找百度~
以下一篇文章帮了很大的忙,感谢!
详解用CSS3制作圆形滚动进度条动画效果

实现

找到了弧的实现,接下来就好办了,因为项目前端使用的angular,可以直接在页面绑定样式,只需要把百分比值传入,计算出需要旋转的角度即可。
代码如下
html 代码

 <div class="percent_ring_demo">
  <div class="bottom_ring">
  </div>
  <div class="circleProgress_wrapper">
    <div class="wrapper right">
      <div class="circleProgress rightcircle" [ngStyle]="{transform: 'rotate('+getRightTranslate(percentData)+'deg)'}"></div>
    </div>
    <div class="wrapper left">
      <div class="circleProgress leftcircle" [ngStyle]="{transform: 'rotate('+getLeftTranslate(percentData)+'deg)'}"></div>
    </div>
  </div>
  <div class="percent_desc">
  {{percentData}}%
  </div>
</div>

css代码

*{
    margin: 0;
    padding: 0;
}
.percent_ring_demo{
    width: 100px;
    height: 100px;
    position: relative;
}
.bottom_ring{
    width: 100px;
    height: 100px;
    background-color: yellowgreen;
    border:10px solid  yellow;
    border-radius: 50%;
    box-sizing: border-box;
    position: absolute;
    z-index: 0;
}
.circleProgress_wrapper{
    width: 100px;
    height: 100px;
    position: relative;
    top: 0;
    z-index: 1;
    /* border:1px solid #ddd; */
}
.wrapper{
    width: 50px;
    height: 100px;
    position: absolute;
    top:0;
    overflow: hidden;
}
.right{
    right:0;
}
.left{
    left:0;
}
.circleProgress{
    width: 80px;/*和外层圆一样大*/
    height: 80px;
    border:10px solid transparent;
    border-radius: 50%;
    position: absolute;
    top:0;

}
.leftcircle{
    border-bottom:10px solid blueviolet;
    border-left:10px solid blueviolet;
    left:0;
}
.rightcircle{
    border-top:10px solid blueviolet;
    border-right:10px solid blueviolet;
    right:0;
}

.percent_desc{
    height: 70px;
    width: 70px;
    background-color:blue;
    position: absolute;
    z-index: 4;
    margin: 15px;
    border-radius: 50%;
    top: 0;
    text-align: center;
    line-height: 70px;
    color: aliceblue;
}

TS代码

percentData=10;//假数据
/*两个半圆都转45度是整圆(100%),都转-135度是0%,各自最多填充圆的一半面积,最少面积为0,由-135到45 旋转角度为180度,代表数值为50%,所以得出计算公式(18/5)*总面积百分比可以得到需要旋转的角度 */
getLeftTranslate(value?: number) {
    if (value < 50 || value === 50) {
        return -135;
    }
    if (value > 50) {
        return 45 + (18 / 5) * value;
    }
    if (value === 0 || value === null) {
        return -135;
    }
}
getRightTranslate(value?: number) {
    if (value < 50) {
        return - 135 + (18 / 5) * value;
    }
    if (value > 50 || value === 50) {
        return 45;
    }
    if (value === 0 || value === null) {
        return -135;
    }
}

实现效果(这里的配色是我自己配的...)

END

posted @ 2019-01-08 13:40  不酸不菜不多鱼  阅读(541)  评论(0编辑  收藏  举报