项目中UI给出了一种进度条按钮,进度百分比居中显示,颜色为蓝色,被进度覆盖过的颜色是白色,该如何实现呢?
<template>
<div id="app">
<div class="progress-wrapper" @click="process">
<div class="progress-outer">
<div class="progress-inner" :style="{width: `${percentage}%`}">
<span class="progress-text" v-if="!percentage">点击开始</span>
<span class="progress-text" v-else>
<span class="num">{{percentage}}</span>%
</span>
</div>
<span class="progress-text" v-if="!percentage">点击开始</span>
<span class="progress-text" v-else>
<span class="num">{{percentage}}</span>%
</span>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
percentage: 0
};
},
methods: {
process() {
var intervalFn = setInterval(()=>{
if(this.percentage >= 100){
this.percentage = 100;
clearInterval(intervalFn)
}else{
this.percentage += 1;
}
},100)
}
}
};
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
.progress-wrapper{
width: 110px;
height: 36px;
padding: 4px;
line-height:36px;
box-sizing: border-box;
border: 1px solid #4781ff;
border-radius: 22px;
cursor: pointer;
}
.progress-outer{
width:100%;
height:100%;
border-radius: 22px;
background:white;
position: relative;
overflow:hidden;
color:#4781FF;
}
.progress-inner{
position: absolute;
width:0;
height:100%;
background: #4781FF;
color: white;
z-index:1;
overflow: hidden;
}
.progress-text{
position: absolute;
top: 50%;
left: 50px;
transform: translate(-50%, -50%);
white-space: nowrap;
}
</style>
- 利用absolute定位,同时设置inner的width为百分比,用来模拟进度。
- 设置两个重叠的text,一个与inner平级,一个在inner内部,文字颜色分别继承他们父级设置的颜色。
- 进度条走过的地方显示的其实是inner里面的text,没走过的地方显示的是与inner平级的text
- 当进度到100%之后,inner的width也为100%,此时与inner同级的progress-text被inner覆盖。
注意,progress-text的left值 不能设置成50%,因为他的位置同时也受progress-inner的宽度影响,我们需要的是文字始终居中。 所以需要写死宽度为progress-outer的总宽度px的一半,再利用transform: translate(-50%,-50%)偏移自身宽高的一半,实现上下左右居中。