圆形进度条实现

项目中需要实现圆形进度条:找到了两种方法(动态需要配合js实现)

  1. 利用css3中的tranform属性
  2. 利用svg实现(可以实现炫酷的效果)

方法1: css transform

  <style>
    .circle {
      width: 100px;
      height: 100px;
      background-color: #eee;
      margin: 100px auto;
      position: relative;
      border-radius: 50%;
    }

    .left,
    .right {
      overflow: hidden;
      width: 50px;
      height: 100px;
      position: absolute;
      opacity: 0.5;
    }

    .left .left-circle,
    .right .right-circle {
      width: 50px;
      height: 100px;
      background: red;
    }

    .left .left-circle {
      border-top-left-radius: 100px;
      border-bottom-left-radius: 100px;
      /* 修改旋转的中心点 */
      transform-origin: right center;
      transform: rotate(180deg);

      /* animation: progress1 2s linear forwards; */
      animation-delay: 2s;

    }

    .right .right-circle {
      background: red;
      border-top-right-radius: 100px;
      border-bottom-right-radius: 100px;
      transform-origin: left center;
      transform: rotate(-180deg);
    }

    .right {
      right: 0;
    }

    .inner {
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      color: #999;
      font-size: 20px;
      background-color: white;
      width: 80px;
      height: 80px;
      border-radius: 50%;
      text-align: center;
      line-height: 80px;
    }
  </style>
  <body>
  <div class="circle">
    <div class="left">
      <div class="left-circle"></div>
    </div>
    <div class="right">
      <div class="right-circle"></div>
    </div>
    <div class="inner">100%</div>

  </div>
  <script type="text/javascript">
    let innerDom = document.querySelector('.inner');
    let leftCircle = document.querySelector('.left-circle');
    let rightCircle = document.querySelector('.right-circle');
    let timer = null;
    let loader = 0; // 当前数据
    let total = 1500;
    let limit = 40;


// 通过设置定时器模拟请求,动态获取数据
    setInterval(() => {
      let num = Number((loader / total) * 100).toFixed(1);
      let deg = Number((loader / total) * 360).toFixed(0);
      if (num > limit) {
        clearInterval(timer)
      } else {
        loader++;
        innerDom.textContent = num + '%';
        if (deg > 180) {
          leftCircle.style.transform = `rotate(${deg}deg)`
        } else {
          rightCircle.style.transform = `rotate(-${180 - deg}deg)`
        }
      }
    }, 1);


  </script>

</body>

方法2: svg

<style>
    .text {
      text-anchor: middle;
      dominant-baseline: middle
    }

    body {
      text-align: center;
    }
  </style>
<body>
  <svg xmln="http://www.w3.org/200/svg" height="700" width="700">
    <!-- 设置底色的圆环 -->
    <circle cx="350" cy="350" r="300" fill="none" stroke="gray" stroke-width="60" stroke-linecap="round"></circle>

    <!-- 设置进度条 -->
    <circle class="progress" transform="rotate(-90, 350, 350)" cx="350" cy="350" r="300" fill="none" stroke="red"
      stroke-width="60" stroke-linecap="round"></circle>
    <!-- 文本 -->
    <text class="text" x="350" y="350" font-size="180" fill="red">36</text>
  </svg>
  <script type="text/javascript">
    var progressDom = document.querySelector('.progress');
    var textDom = document.querySelector('.text');
    function rotateCircle(persent) {
      var circleLength = Math.floor(2 * Math.PI * parseFloat(progressDom.getAttribute('r')));
      var value = persent * circleLength / 100;
      // red: rgb(255, 0, 0) , blue: rgb(0, 191, 255)
      var red = 255 + parseInt((0 - 255) / 100 * persent);
      var green = 0 + parseInt((191 - 0) / 100 * persent);
      var blue = 0 + parseInt((255 - 0) / 100 * persent);

      progressDom.setAttribute('stroke-dasharray', value + ",10000");
      progressDom.setAttribute('stroke', `rgb(${red}, ${green}, ${blue})`);
      textDom.innerHTML = persent + '%';
      textDom.setAttribute('fill', `rgb(${red}, ${green}, ${blue})`)
    }

    let limit = 50;

    let num = 0;
    setInterval(() => {
      num++;
      if (num > limit) {
        return;
      }
      rotateCircle(num)
    }, 30);
  </script>
</body>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个圆形进度条的动态效果,可以使用CSS中的@keyframes动画和transform属性。 首先,创建一个包含圆形进度条的div元素,并设定其宽高和边框样式,使它呈现为圆形。 然后,使用CSS的@keyframes创建一个动画序列,在序列中设置进度条的旋转角度。例如,可以从0°开始旋转,到360°结束,表示进度条的完整程度。 接下来,在CSS中,为进度条的div元素添加animation属性,将刚才创建的动画序列应用于进度条上,并设定动画的持续时间、重复次数等。 最后,通过设置transform-origin属性,将进度条的旋转中心设置为圆心,使得进度条动画在圆形元素中心点进行旋转,形成动态效果。 例如,下面是一个实现50%进度的圆形进度条CSS代码示例: ```css .circle { width: 100px; height: 100px; border: 5px solid #ccc; border-radius: 50%; animation: progress 2s linear infinite; transform-origin: center center; } @keyframes progress { 0% { transform: rotate(0deg); } 100% { transform: rotate(180deg); } } ``` 这个示例中,圆形进度条的宽高为100px,边框为5px粗的灰色线条。动画序列progress中,进度条从0°开始旋转到180°,持续2秒,线性变化,并无限循环播放。进度条的旋转中心被设置为圆心。 这样,通过CSS实现了一个圆形进度条的动态效果。可以根据需要修改代码中的数值,实现不同的进度和动画效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值