1 原生HTML标签
<meter>
:显示已知范围的标量值或者分数值<progress>
:显示一项任务的完成进度,通常情况下,该元素都显示为一个进度条
1.1 <meter>
<html>
<head>
<style>
meter{
width:200px;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<meter min="0" max="200" value="150"></meter>
</div>
</body>
</html>
min
、max
、value
分别表示最大值,最小值与当前值。
1.2 <progress>
<html>
<head>
<style>
progress{
width:200px;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<progress max="200" value="150"></progress>
</div>
</body>
</html>
max
描述 progress 元素所表示的任务一共需要完成多少工作量,value
属性用来指定该进度条已完成的工作量。
1.3 区别
主要是语义上的差别。
<meter>
:表示已知范围内的标量测量值或分数值<progress>
:表示任务的完成进度
比如,一个需求当前的完成度,应该使用 <progress>
,而如果要展示汽车仪表盘当前的速度值,应该使用 meter
。
1.4 存在问题
- 无法有效的修改
<meter>
和<progress>
标签的样式,比如背景色,进度前景色等。并且,默认样式在不同浏览器之间不一致。 - 无法添加动画效果、交互效果
<html>
<head>
<style>
meter{
width:200px;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<meter min="0" max="200" value="150"></meter>
</div>
</body>
</html>
chrome:
<html>
<head>
<style>
progress{
width:200px;
color:red;
background-color: blue;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<progress max="200" value="150"></progress>
</div>
</body>
</html>
chrome:
2 HTML标签+CSS
思路:使用背景色配合百分比
2.1 双标签
<html>
<head>
<style>
.wrapper {
width: 220px;
height: 30px;
border-radius: 30px;
background: #8d8d8d;
}
.progress {
width: 70%;
height: inherit;
border-radius: 30px 0 0 30px;
background: #e1e43a;
text-align: center;
line-height: 30px;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<div class="wrapper">
<div class="progress">70%</div>
</div>
</div>
</body>
</html>
优点:
- 进度具体数值可以直接传参给width属性
- 可以自定义样式,比如前景色,背景色,渐变
- 可以自定义动画和交互效果
2.2 单标签
使用渐变属性
<html>
<head>
<style>
.progress {
width: 200px;
height: 30px;
border-radius: 30px;
background: linear-gradient(90deg, #e1e43a, #00ff00 70%, transparent 0);
border: 1px solid #eee;
text-align: center;
line-height: 30px;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<div class="progress">70%</div>
</div>
</body>
</html>
如果不需要进度条渐变,只需要指定渐变颜色为同一颜色即可
<html>
<head>
<style>
.progress {
width: 200px;
height: 30px;
border-radius: 30px;
background: linear-gradient(90deg, #e1e43a, #e1e43a 70%, transparent 0);
border: 1px solid #eee;
text-align: center;
line-height: 30px;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<div class="progress">70%</div>
</div>
</body>
</html>
使用变量:
<html>
<head>
<style>
.progress {
width: 200px;
height: 30px;
border-radius: 30px;
background: linear-gradient(90deg, #e1e43a, #e1e43a var(--progress), transparent 0);
border: 1px solid #eee;
text-align: center;
line-height: 30px;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<div class="progress" `style=``"--progress: 70%"`>70%</div>
</div>
</body>
</html>
存在问题:CSS中,渐变(比如 linear-gradinet
、radial-gradient
、conic-gradient
)不支持过渡变换的,因此.progress增加transition
,不会有过渡动画效果。
解决方案:使用CSS@property
<html>
<head>
<style>
@property --progress {
syntax: '<percentage>';
inherits: false;
initial-value: 0%;
}
.progress {
width: 200px;
height: 30px;
border-radius: 30px;
background: linear-gradient(90deg, #e1e43a, #e1e43a var(--progress), transparent 0);
border: 1px solid #eee;
text-align: center;
line-height: 30px;
transition: 0.5s --progress;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<div class="progress" `style=``"--progress: 70%"`>70%</div>
</div>
</body>
</html>
优点:
- 进度具体数值可以直接传参给--progress变量
- 可以自定义样式,比如前景色,背景色,渐变
- 可以自定义动画和交互效果
2.3 圆弧进度条
思路:圆锥渐变 conic-gradient()
<html>
<head>
<style>
.progress {
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(#e1e43a 0, #e1e43a 25%, #83b596 25%, #83b596);
text-align: center;
line-height: 200px;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<div class="progress">70%</div>
</div>
</body>
</html>
中间增加mask: 方法一(仅适用纯色背景):
<html>
<head>
<style>
.progress {
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(#e1e43a 0, #e1e43a 25%, #83b596 25%, #83b596);
display:flex;
justify-content: center;
align-items: center;
}
.mask{
width:170px;
height: 170px;
border-radius: 50%;
background-color: #fff;
display:flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<div class="progress"><div class="mask">70%</div></div>
</div>
</body>
</html>
<html>
<head>
<style>
.progress {
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(#e1e43a 0, #e1e43a 25%, #83b596 25%, #83b596);
position:relative;
}
.progress::after{
content:'70%';
width: 170px;
height: 170px;
border-radius: 50%;
position:absolute;
bottom:15px;
left:15px;
background-color: #fff;
display:flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body>
<div>
<span>进度:</span>
<div class="progress"></div>
</div>
</body>
</html>
方法二(可适用渐变背景):
<html>
<head>
<style>
.box{
width:300px;
height: 300px;
display:flex;
justify-content: center;
align-items: center;
background: linear-gradient(90deg, #fff, #0400ff 100%);
}
.progress {
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(#e1e43a 0, #e1e43a 25%, #83b596 25%, #83b596);
mask: radial-gradient(transparent, transparent 50%, #000 50%);
-webkit-mask: radial-gradient(transparent, transparent 50%, #000 50%);
}
</style>
</head>
<body>
<div class="box">
<span>进度:</span>
<div class="progress"></div>
</div>
</body>
</html>
存在问题:
进度百分比不是类似于 0°、90°、180°、270°、360° 这类数字时,使用圆锥渐变时,不同颜色间的衔接处会有明显的锯齿。
解决办法:
在衔接处空余出一些距离让其应用渐变
<html>
<head>
<style>
.box{
width:300px;
height: 300px;
display:flex;
justify-content: center;
align-items: center;
background: linear-gradient(90deg, #fff, #0400ff 100%);
}
.progress {
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(#e1e43a 0, #e1e43a 25%, #83b596 25.3%, #83b596);
mask: radial-gradient(transparent, transparent 50%, #000 50%);
-webkit-mask: radial-gradient(transparent, transparent 50%, #000 50%);
}
</style>
</head>
<body>
<div class="box">
<span>进度:</span>
<div class="progress"></div>
</div>
</body>
</html>
注意对比内圈和上图的不同,颗粒感降低,可以根据需要继续调整