手写环形进度条

2022-11-05  本文已影响0人  SA_Arthur
效果图

环形进度条由两个半圆环组成,根据圆环的角度调整,来表示进度。

Vue

<div class="circle-progress red">
  <div class="wrapper right">
    <div class="circle-progress-bar circle-right" :style="renderRightRate(80)"></div>
  </div>
  <div class="wrapper left">
    <div class="circle-progress-bar circle-left" :style="renderLeftRate(80)"></div>
  </div>
  <p>进度条</p>
</div>

Scss

 .circle-progress {
    position: relative;
    margin-right: auto;
    margin-left: auto;
    margin-bottom: 5px;
    width: 100px;
    height: 100px;

    & .circle-progress-bar {
        width: 200%;
        height: 100%;
        box-sizing: border-box;
        border: 12px solid rgba(245, 108, 108, 0.15);  // 底色 可自行修改
        border-radius: 50%;
        position: absolute;
        top: 0;
        transform: rotate(45deg);
    }

    & .circle-right {
        border-top: 12px solid rgba(245, 108, 108, 1);   // 圆环颜色 可自行修改
        border-right: 12px solid rgba(245, 108, 108, 1);   // 圆环颜色 可自行修改
        right: 0;
    }

    & .circle-left {
        border-bottom: 12px solid rgba(245, 108, 108, 1);
        border-left: 12px solid rgba(245, 108, 108, 1);
        left: 0;
    }
}

JS

    /**
     * 环形进度条 左
     * @param {String} rate 进度
     */
    renderLeftRate(rate) {
      const deg = Number(rate) * 3.6
      let reDeg = 0
      if (deg >= 180) {
        reDeg = deg - 315
        return 'transform: rotate(' + reDeg + 'deg);'
      } else {
        reDeg = deg - 135
        return 'transform: rotate(-135deg);'
      }
    },
    /**
     * 环形进度条 右边
     * @param {String} rate 进度
     */
    renderRightRate(rate) {
      const deg = Number(rate) * 3.6
      let reDeg = 0
      if (deg >= 180) {
        reDeg = deg - 315
        return 'transform: rotate(45deg);'
      } else {
        reDeg = deg - 135
        return 'transform: rotate(' + reDeg + 'deg);'
      }
    }
上一篇 下一篇

猜你喜欢

热点阅读