css+js 实现圆圈进度条

实现思路: 设置两个圆,用overflow:hidden各隐藏一半,使用绝对定位让一个位于左边半圆,一个位于右边半圆。然后使用transform:rotate 来旋转使得半圆动起来。
使用js函数传入两个参数,一个启始百分比和一个结束百分比,来控制进度的开始和停止。

HTML代码

<body>
  <div class="contain">
    <div class="left">
      <div class="left-circle"></div>
    </div>
    <div class="right">
      <div class="right-circle"></div>
    </div>
    <div class="mask">
      <div class="number"></div>
    </div>
  </div>
</body>

CSS样式

<style>
    .contain {
      width: 200px;
      height: 200px;
      margin: 200px auto;
      /* background-color: pink; */
      position: relative;
    }

    .left {
      position: absolute;
      top: 0;
      left: 0;
      width: 50%;
      height: 100%;
      overflow: hidden;
    }

    .left-circle {
      position: absolute;
      left: 0;
      width: 200%;
      height: 100%;
      border: 10px solid orange;
      border-radius: 50%;
      box-sizing: border-box;
      border-top-color: transparent;
      border-left-color: transparent;
      transform: rotate(-45deg);
      box-sizing: border-box;
      /* animation: circleRotate 2s linear forwards 2s; */
    }

    .right {
      position: absolute;
      top: 0;
      right: 0;
      width: 50%;
      height: 100%;
      overflow: hidden;
      /* background-color: rgb(22, 133, 70); */
    }

    .right-circle {
      position: absolute;
      right: 0;
      width: 200%;
      height: 100%;
      border: 10px solid orange;
      border-radius: 50%;
      box-sizing: border-box;
      border-bottom-color: transparent;
      border-right-color: transparent;
      transform: rotate(-45deg);
      /* animation: circleRotate 2s linear forwards; */
    }

    /* @keyframes circleRotate {
      from {
        transform: rotate(-45deg);
      }

      to {
        transform: rotate(105deg);
      }
    } */

    .mask {
      width: 30%;
      height: 40%;
      color: #fff;
      position: absolute;
      top: 50%;
      transform: translate(-50%, -50%);
      left: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
    }

    .number {
      color: red;
      font-size: 30px;
    }
  </style>

JS代码:

function go (start, end) {
    const circleLeft = document.querySelector('.left-circle')
    const circleRight = document.querySelector('.right-circle')
    const number = document.querySelector('.number')
    function formatDegreeLeft (percent) {
      // 封装左边圆角度
      return `rotate(${-225 + (360 / 100 * percent)}deg)`  // 旋转角度要与定时器相对应,我这使用的是6s转动360度
    }
    function formatDegreeRight (percent) {
      // 封装右边圆角度
      return `rotate(${-45 + (360 / 100 * percent)}deg)`
    }
    function setRotateLeft (node, percent) {
      // 设置旋转左圆的角度
      node.style.transform = formatDegreeLeft(percent)
    }
    function setRotateRight (node, percent) {
      // 设置旋转右圆的角度
      node.style.transform = formatDegreeRight(percent)
    }
    let percent = start  //百分比
    let t = setInterval(() => {
      percent++
      if (percent >= 0 && percent <= 50) { //如果百分比在50以内旋转右边圆
        setRotateRight(circleRight, percent)
      } else if (percent > 50 && percent <= 100) { //如果百分比在50以上,固定右半边圆和旋转左半边圆
        circleRight.style.transform = 'rotate(135deg)'
        setRotateLeft(circleLeft, percent)
      }
      number.textContent = percent + '%'
      if (percent >= end) {
        clearInterval(t)
        if(percent>=100){
        number.textContent = '加载完成'
        }
      }
    }, 60)

  }

  go(60, 90)  // 进度60 到进度90

在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用CSSJavaScript实现环形进度条。下面是一个简单的实现方式: HTML代码: ``` <div class="progress-ring"> <div class="progress-bar"></div> <div class="percent"></div> </div> ``` CSS代码: ``` .progress-ring { position: relative; width: 100px; height: 100px; } .progress-bar { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 50%; clip: rect(0, 50px, 100px, 0); background-color: #fff; transform: rotate(-90deg); } .percent { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 24px; font-weight: bold; } /* 设置进度条颜色 */ .progress-bar:before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 50%; clip: rect(0, 50px, 100px, 0); background-color: #2196f3; transform: rotate(-90deg); } /* 设置进度条动画 */ @keyframes progress-animation { from { transform: rotate(-90deg); } to { transform: rotate(270deg); } } .progress-bar:before { animation: progress-animation 2s ease-in-out forwards; } /* 设置百分比样式 */ .percent:before { content: attr(data-percent) "%"; } ``` JavaScript代码: ``` // 获取进度条元素 var progressRing = document.querySelector(".progress-ring"); // 获取进度条百分比元素 var percent = progressRing.querySelector(".percent"); // 设置进度条百分比 percent.setAttribute("data-percent", "50"); ``` 使用这份代码,你会得到一个带有50%进度的环形进度条。你可以通过JavaScript来动态地改变进度条百分比,例如: ``` percent.setAttribute("data-percent", "80"); ``` 这会将进度条百分比改为80%。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值