css实现圆形进度条

能用现成组件就用,实现不行再自己写,因为牵扯到上传文件,进度实时出不来,所以只能使用dom元素操作;

1.实现

效果:

css实现圆形进度条_第1张图片

上图是100%,如果需要根据百分比显示,我们需要看下代码里面left和right的旋转角度,这个圆实现上,以垂直直径切割,是左右两部分,调整css transform即可。

代码如下:

html

percentHtml.innerHTML = `
`

css

* {
        box-sizing: border-box;
        padding: 0;
        margin: 0;
    }
    .progress {
      width: 20px;
      height: 20px;
      color: #fff;
      border-radius: 50%;
      overflow: hidden;
      position: relative;
      background: #dcdcdc;
      text-align: center;
      line-height: 200px;
      box-shadow: 2px 2px 2px 2px white;
      mask: radial-gradient(transparent 7px, #000 8px);
      -webkit-mask: radial-gradient(transparent 7px, #000 8px)
    }
    .progress .overlay {
      width: 50%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
      z-index: 1;
      background-color: #dcdcdc;
    }
    .progress .left,
    .progress .right {
      width: 50%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
      border: 10px solid #29b6f6;
      border-radius: 100px 0px 0px 100px;
      border-right: 0;
      transform-origin: right;
    }

 2.原理及函数

可以用这个原理实现百分比:

1)0%,left为0deg(z-index为0,因为right在左边,所以需要index为0至在灰色下面),right为0deg;

2)当百分比小于50%且不为0的时候,左边不需要百分比:继续为0度,右边180度是50%,计算出1%是多少度:180 / 50% = 3.6度(度/1%),乘以百分比即可;

3)大于50%,right为180deg,left对应:100%是0deg,z-Index = 10,75%对应-90deg,以此为例,那么计算规律是,75% - 50% = 25%,25 * 3.6 = 90,因为left是逆时针计算,所以需要用180 - 90 = 90,再添加一个符号即可(数学上直接减180结果一样),就是-90deg。

4)100%,left为0deg(z-index=10,覆盖左侧overlay),right为180deg;

如下函数:

const get_deg = (percent: number) => {
  let left_deg=0, right_deg=0, zIndex_left = 0;
  const one_percent_deg = 180 / 50; // (3.6度/1%)
  if (percent) {
      if (percent <=50 && percent > 0) {
        console.log('小于50大于0');
        left_deg = 0;
        right_deg = percent * one_percent_deg;
      } else if (percent > 50 && percent < 100) {
        console.log('50到100');
         left_deg = (percent - 50) * one_percent_deg - 180;
         zIndex_left = 10;
         right_deg = 180;
      } else if (percent === 100) {
        console.log('等于100');
          left_deg = 0;
          zIndex_left = 10;
          right_deg = 180;
      }
  }
  return {
      left_deg,
      right_deg,
      zIndex_left
  } 
}

特别注意一点,在 左侧半圆环,大于50%的时候,需要给左侧添加z-index=100,因为:其实他们左右的颜色大小都是不变的,只是在旋转,给我们视觉上的效果,就像是百分比一样。

我们给左侧限制了-180度的最小值,就是不让他旋转到右侧,而右侧0度的最小限制也是一个意思。

在大于50%的时候右侧为180度,我们看如果75%的时候,也是就左侧25%,且设置右侧小于180度会发生什么:

css实现圆形进度条_第2张图片

这里设置的左侧旋转-90度,右侧为80度,我们清晰的看到左侧的环形会来到右侧,中间会有缝隙,当然我们大于50%的时候,右侧会占满,同时使用z-index灵活去遮挡,就给我们视觉上看到正确的百分比,这里需要理解并实践。

注:代码参考自网络,有改变,仅做记录、参考使用

你可能感兴趣的:(css,css3,前端)