js css 实现进度条,css+js实现圆形进度条

首先实现一个静态的圆形进度条

他的实现其实就是两个半圆,然后通过旋转半圆的度数来达到整个圆形的效果

先来看看如何实现一个半圆

.circleProgress{

width: 160px;

height: 160px;

border:20px solid transparent;

border-radius: 50%;

position: absolute;

top:0;

-webkit-transform: rotate(45deg);

}

1f9e57a0f1f7

image.png

为什么要旋转45°,可以自己去审查元素并且改变度数看看效果。

第一个半圆实现了。接下来实现左边的半圆

代码和右边的相反即可

.leftcircle{

border-bottom:20px solid green;

border-left:20px solid green;

left:0;

}

1f9e57a0f1f7

image.png

接下来就要实现动画效果了。

先让右半圆弧旋转180度,再让左半圆弧旋转180度,这样,两个半圆弧由于先后都全部溢出而消失了

.rightcircle{

border-top:20px solid green;

border-right:20px solid green;

right:0;

-webkit-animation: circleProgressLoad_right 5s linear infinite;

}

.leftcircle{

border-bottom:20px solid green;

border-left:20px solid green;

left:0;

-webkit-animation: circleProgressLoad_left 5s linear infinite;

}

@-webkit-keyframes circleProgressLoad_right{

0%{

-webkit-transform: rotate(45deg);

}

50%,100%{

-webkit-transform: rotate(225deg);

}

}

@-webkit-keyframes circleProgressLoad_left{

0%,50%{

-webkit-transform: rotate(45deg);

}

100%{

-webkit-transform: rotate(225deg);

}

}

这样就完成了。 要想实现计时的效果只需要修改一下两个半圆的起始度数,和动画里的度数即可。

接下来试着用js来实现动态的计时。

function action() {

//先拿到两个半圆

let left = document.getElementById('left')

let right = document.getElementById('right')

let time = 5000 进度条的总时间,可以是一个变量。

let sj = 20 拟定一个运动间隔时间,就是多久动一次

let dushu = 360 / (time / sj) 通过总度数除以(总时间除以时间间隔)得到每次运动多少度数

let rightchushudushu = -135 右半圆的初始度数,这个度数刚好被隐藏掉

let leftchushidushu = -135 同上

let cc = setInterval(() => {

console.log(new Date)

if (rightchushudushu >= 45) {

if (leftchushidushu >= 45) {

clearInterval(cc)

} else {

leftchushidushu += dushu

if (leftchushidushu > 45) {

leftchushidushu = 45

right.style.cssText = `-webkit-transform: rotate(${leftchushidushu}deg);`

}

right.style.cssText = `-webkit-transform: rotate(${leftchushidushu}deg);`

}

} else {

rightchushudushu += dushu

if (rightchushudushu > 45) {

rightchushudushu = 45

} else {

left.style.cssText = `-webkit-transform: rotate(${rightchushudushu}deg);`

}

}

}, sj)

}

总时间需要换算成定时器的时间格式,比如60s 就是60000. 千万不要直接用总度数去除以总时间。这样算出来的距离,这样计算出来的结果。进度条动起来就会一顿一顿,没有那么丝滑了。自己去拟定一个运动间隔时间。然后通过这个时间去计算每次运动的距离。这样实现的效果就会很顺畅,不会一顿一顿。

定时器中的代码有点冗余了,可以自行更改。这里投一下懒,就不改了。说一下里面需要注意的点。

在每次累加度数时,需要去判断一下当前度数是不是大于或等于45度了。如果是,那就直接将度数设置成45度。因为在累加的过程中。计算出来的度数不是整数,有可能会超过45度。这样半圆就会多移动一点距离。整个进度条就会有瑕疵。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的实现方法: HTML代码: ```html <div class="progress"> <div class="progress__bar"></div> <div class="progress__value"></div> </div> ``` CSS代码: ```css .progress { position: relative; width: 200px; height: 200px; border-radius: 50%; border: 10px solid #ddd; background-color: #f7f7f7; overflow: hidden; } .progress__bar { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 50%; background-color: #00c853; clip: rect(0, 100px, 200px, 0); transform-origin: center center; transform: rotate(-90deg); animation: progress 5s linear forwards; } .progress__value { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 48px; font-weight: bold; color: #333; } @keyframes progress { 0% { transform: rotate(-90deg); clip: rect(0, 100px, 200px, 0); } 50% { transform: rotate(90deg); clip: rect(0, 200px, 200px, 100px); } 100% { transform: rotate(270deg); clip: rect(0, 200px, 200px, 0); } } ``` JavaScript代码: ```javascript var progressValue = 25; // 进度值,范围为0-100 var progressBar = document.querySelector('.progress__bar'); var progressValueElem = document.querySelector('.progress__value'); progressBar.style.animationDuration = progressValue / 100 * 5 + 's'; progressValueElem.textContent = progressValue + '%'; ``` 在这个实现中,我们使用了CSS3的clip属性来实现圆形进度条的效果,同时使用了JavaScript动态设置进度条的动画时长和进度值文本。你可以根据自己的需求修改代码来实现不同的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值