You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

113 lines
2.7 KiB

<template>
<div class="vote-results">
<div v-for="opt in options" :key="opt.id" class="progressContainer">
<!-- 居中显示的状态 -->
<el-progress
v-if="voteStatus"
class="centered-progress"
:percentage="100"
:format="() => opt.content"
:stroke-width="30"
:text-inside="true"
:color="colors[opt.id]"
style="width: 300px;"
@click="clickBtn(opt.id)"
/>
<!-- 显示 count 于灰条最右侧的状态 -->
<div v-else class="progressWrapper">
<el-progress
class="left-progress"
:percentage="opt.count"
:format="() => opt.content + ' √'"
:stroke-width="30"
:text-inside="true"
:color="colors[opt.id]"
/>
<!-- 绝对定位在灰色轨道的最右边 -->
<span class="count-right">{{ opt.count }}</span>
</div>
</div>
<el-button @click="totalStatus">确认</el-button>
</div>
</template>
<script setup>
import { ref } from 'vue'
const voteStatus = ref(true)
const totalStatus = () => {
voteStatus.value = !voteStatus.value
}
const options = ref([
{ id: 1, content: '选择1', count: 20 },
{ id: 2, content: '选择2', count: 30 },
{ id: 3, content: '选择3', count: 40 },
])
const colors = ref({})
function genUniqueColors() {
const used = new Set()
options.value.forEach(opt => {
let c
do {
c = '#' + Math.floor(Math.random() * 0x1000000)
.toString(16)
.padStart(6, '0')
} while (used.has(c))
used.add(c)
colors.value[opt.id] = c
})
}
genUniqueColors()
const clickBtn = idx => {
console.log('点击了:', idx)
}
</script>
<style scoped>
.progressContainer {
width: 300px;
margin-bottom: 20px;
}
/* 包含进度条的相对定位容器 */
.progressWrapper {
position: relative;
width: 300px; /* 同进度条宽度 */
}
/* count 数字,绝对定位到右端,中间垂直对齐 */
.count-right {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
margin-right: 4px; /* 根据需要微调,让数字在灰条内稍留空隙 */
font-weight: bold;
z-index: 1;
}
/* 居中状态 */
.centered-progress :deep(.el-progress-bar__inner) {
display: flex !important;
align-items: center !important;
justify-content: center !important;
}
.centered-progress :deep(.el-progress-bar__inner-text) {
margin: 0 !important;
width: auto !important;
}
/* 左对齐文本状态 */
.left-progress :deep(.el-progress-bar__inner) {
display: flex !important;
align-items: center !important;
justify-content: flex-start !important;
padding-left: 8px !important;
}
.left-progress :deep(.el-progress-bar__inner-text) {
margin: 0 !important;
}
</style>