97 lines
2.0 KiB
Vue
97 lines
2.0 KiB
Vue
|
|
<template>
|
|||
|
|
<view class="circle-progress">
|
|||
|
|
<view class="circle-progress__content">
|
|||
|
|
<text class="circle-progress__text">{{ percentage }}%</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
export default {
|
|||
|
|
name: "CircleProgress",
|
|||
|
|
props: {
|
|||
|
|
// 圆环进度百分比值,0-100
|
|||
|
|
percentage: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 0,
|
|||
|
|
validator: (value) => value >= 0 && value <= 100,
|
|||
|
|
},
|
|||
|
|
// 进度条颜色
|
|||
|
|
color: {
|
|||
|
|
type: String,
|
|||
|
|
default: "#42b983", // 绿色主题色
|
|||
|
|
},
|
|||
|
|
// 背景颜色
|
|||
|
|
backgroundColor: {
|
|||
|
|
type: String,
|
|||
|
|
default: "#c8c8c8", // 灰色
|
|||
|
|
},
|
|||
|
|
// 尺寸
|
|||
|
|
size: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 100,
|
|||
|
|
},
|
|||
|
|
// 边框宽度
|
|||
|
|
borderWidth: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 5,
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
computed: {
|
|||
|
|
progressStyle() {
|
|||
|
|
const degrees = this.percentage * 3.6; // 将百分比转换为角度
|
|||
|
|
const style = {
|
|||
|
|
width: `${this.size}px`,
|
|||
|
|
height: `${this.size}px`,
|
|||
|
|
borderWidth: `${this.borderWidth}px`,
|
|||
|
|
borderColor: this.backgroundColor,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 根据进度设置不同的样式
|
|||
|
|
if (this.percentage <= 50) {
|
|||
|
|
style.background = `conic-gradient(
|
|||
|
|
${this.color} 0deg ${degrees}deg,
|
|||
|
|
${this.backgroundColor} ${degrees}deg 360deg
|
|||
|
|
)`;
|
|||
|
|
} else {
|
|||
|
|
style.background = `conic-gradient(
|
|||
|
|
${this.color} 0deg 180deg,
|
|||
|
|
${this.backgroundColor} 180deg 360deg
|
|||
|
|
)`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return style;
|
|||
|
|
},
|
|||
|
|
textStyle() {
|
|||
|
|
return {
|
|||
|
|
fontSize: `${this.size * 0.2}px`,
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.circle-progress {
|
|||
|
|
position: relative;
|
|||
|
|
display: inline-flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: center;
|
|||
|
|
|
|||
|
|
&__content {
|
|||
|
|
position: relative;
|
|||
|
|
border-radius: 50%;
|
|||
|
|
mask: radial-gradient(transparent 60%, black 61%);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
&__text {
|
|||
|
|
position: absolute;
|
|||
|
|
top: 50%;
|
|||
|
|
left: 50%;
|
|||
|
|
transform: translate(-50%, -50%);
|
|||
|
|
font-weight: bold;
|
|||
|
|
color: #333;
|
|||
|
|
z-index: 2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|