今天做一个圆环进度条,html加css,原理很简单,看下面这段代码就知道了
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div{
display: inline-block;
}
*{
box-sizing: border-box;
}
.circle-progress{
position: relative;
display: flex;
width: 150px;
height: 150px;
border: 1px solid #000;
}
.circle-progress .annulus{
position: absolute;
left: 0;
top: 0;
border: 20px solid #f00;
width: 50%;
height: 100%;
border-right: none;
border-top-left-radius: 100px;
border-bottom-left-radius: 100px;
transform-origin: right 50%;
}
.left-circle{
animation: rotate_1 3s linear forwards;
}
.right-circle{
animation: rotate_2 6s linear forwards;
}
.left-shade{
position: absolute;
background-color: #fff;
left: 0;
top: 0;
width: 50%;
height: 100%;
animation: hidden_1 0s 3s forwards;
}
@keyframes rotate_1 {
from{
transform: rotate(0);
}
to{
transform: rotate(180deg);
}
}
@keyframes rotate_2 {
from{
transform: rotate(0);
}
to{
transform: rotate(360deg);
}
}
@keyframes hidden_1 {
from{
background-color: #fff;
}
to{
background-color: transparent;
}
}
</style>
</head>
<body>
<div class="circle-progress">
<div class="annulus left-circle"></div>
<div class="annulus right-circle"></div>
<div class="left-shade"></div>
</div>
</body>
</html>
为了之后使用方便,下面要做的是将它封装起来,使用时调用一个函数,传入参数就能够实现快慢,是否显示百分比等!!!
下面这段代码包含了圆形进度条的html,css,js可以直接改变css改变样式,也可以直接调用封装好的js方法改变样式,需要的还可以加,当前这个代码不带虚线的进度条,需要虚线进度条可以看我另一篇博客https://blog.csdn.net/qq_40285497/article/details/84100682
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div{
display: inline-block;
}
*{
box-sizing: border-box;
}
.circle-progress{
position: relative;
display: flex;
width: 150px;
height: 150px;
}
.circle-progress .annulus{
position: absolute;
left: 0;
top: 0;
border: 20px solid #f00;
width: 50%;
height: 100%;
border-right: none;
border-top-left-radius: 100px;
border-bottom-left-radius: 100px;
transform-origin: right 50%;
}
.circle-progress .left-circle{
animation: rotate_1 3s linear forwards;
}
.circle-progress .right-circle{
animation: rotate_2 6s linear forwards;
}
.circle-progress .left-shade{
position: absolute;
background-color: #fff;
left: 0;
top: 0;
width: 50%;
height: 100%;
animation: hidden_1 0s 3s forwards;
}
.circle-progress .percent{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
@keyframes rotate_1 {
from{
transform: rotate(0);
}
to{
transform: rotate(180deg);
}
}
@keyframes rotate_2 {
from{
transform: rotate(0);
}
to{
transform: rotate(360deg);
}
}
@keyframes hidden_1 {
from{
background-color: #fff;
}
to{
background-color: transparent;
}
}
</style>
</head>
<body>
<div id="circleProgress"></div>
<script>
function circleProgress(opt) {
var speed = opt.speed;
var size = opt.size;
var borderWidth = opt.borderWidth;
var needPercent = opt.needPercent;
var borderColor = opt.borderColor;
var fontSize = opt.fontSize;
var fontWeight = opt.fontWeight;
var fontColor = opt.fontColor;
//生成图
var html = '<div class="circle-progress">\n' +
' <div class="annulus left-circle"></div>\n' +
' <div class="annulus right-circle"></div>\n' +
' <div class="left-shade"></div>\n' +
' <div class="percent"></div>\n' +
'</div>';
var box = document.querySelector('#circleProgress');
box.innerHTML = html;
//改变速度
if(speed){
document.querySelector('#circleProgress .left-circle').style.animation = 'rotate_1 '+speed+'s linear forwards';
document.querySelector('#circleProgress .right-circle').style.animation = 'rotate_2 '+speed*2+'s linear forwards';
document.querySelector('#circleProgress .left-shade').style.animation = 'hidden_1 0s '+speed+'s forwards';
}
//改变大小
if(size){
document.querySelector('#circleProgress .circle-progress').style.width = size+'px';
document.querySelector('#circleProgress .circle-progress').style.height = size+'px';
document.querySelectorAll('#circleProgress .annulus')[0].style.borderWidth = size/5+'px';
document.querySelectorAll('#circleProgress .annulus')[0].style.borderTopLeftRadius = size+'px';
document.querySelectorAll('#circleProgress .annulus')[0].style.borderBottomLeftRadius = size+'px';
document.querySelectorAll('#circleProgress .annulus')[1].style.borderWidth = size/5+'px';
document.querySelectorAll('#circleProgress .annulus')[1].style.borderTopLeftRadius = size+'px';
document.querySelectorAll('#circleProgress .annulus')[1].style.borderBottomLeftRadius = size+'px';
}
//改变边宽
if(borderWidth){
document.querySelectorAll('#circleProgress .annulus')[0].style.borderWidth = borderWidth+'px';
document.querySelectorAll('#circleProgress .annulus')[1].style.borderWidth = borderWidth+'px';
}
//改变颜色
if(borderColor){
document.querySelectorAll('#circleProgress .annulus')[0].style.borderColor = borderColor;
document.querySelectorAll('#circleProgress .annulus')[1].style.borderColor = borderColor;
}
//显示百分比
if(needPercent){
var percent = 0;
var time = speed*2000/100;
var percentBox = document.querySelector('#circleProgress .percent');
var timer = setInterval(function () {
percent++;
percentBox.innerText = percent+'%';
if(percent == 100){
clearInterval(timer);
}
},time)
//字体大小
if(fontSize){
percentBox.style.fontSize = fontSize + 'px';
}
//字体加粗
if(fontWeight){
percentBox.style.fontWeight = fontWeight;
}
//字体颜色
if(fontColor){
percentBox.style.color = fontColor;
}
}
}
circleProgress({
speed:1,
needPercent:true,
size:200,
borderWidth:20,
borderColor:'#0f0',
fontSize:20,
fontWeight:600,
fontColor:'#f00'
})
</script>
</body>
</html>