vue3中进度条上加高亮圆点

实现效果

在这里插入图片描述

小圆点基于进度条定位(left)。

实现代码

<template>
	<!-- 
       这块代码实现的功能:
       progressData遍历的年份进度数组,展示每年完成的进度
   -->
    <ul>
        <li v-for="(item, index) in progressData" :key="item.year">
            <el-row :gutter="10">
              <el-col :span="21" class="progress-info-left"><span>{{ index + 1 }}</span>年完成进度</el-col>
              <el-col :span="3" style="text-align: right;">{{ handleNum(item.percentage) }}%</el-col>
            </el-row>
            <el-row>
              <el-col :span="24">
                <el-progress
                ref="progressRefs"
                :text-inside="true"
                :percentage="Number(item.percentage)"
              >
               <div class="progress-dot" :style="{ left: `${calculateDotPosition(index, item.percentage)}px` }"></div> 
              </el-progress>
              </el-col>
            </el-row>
        </li>
   </ul>
</template>

<script setup>
const progressWidths = ref([]); 

// index为当前年度索引
// percentage当前年度完成值
const calculateDotPosition = (index, percentage) => {
  // 非空判断
  if(percentage) {
    // progressRefs所有进度DOM
    progressRefs.value.forEach((ref, index) => {  
      if (ref) {
        // 当前进度条元素的布局宽度(包括padding和border,但不包括margin)
        progressWidths.value[index] = ref.$el.offsetWidth;  
      }  
    });

    if (progressWidths.value[index] > 0) {  
      // 计算点的位置。
      // 通过将元素的宽度乘以百分值(转换为数字),然后除以100获取百分比。
      // 结果减去4(这块为小圆点的半径),使其居中。
      return (progressWidths.value[index] * Number(percentage) / 100) - 4;  
    } 
  } else {
    return 0;  
  }
}
</script>

<style>
// 进度条
.el-progress {  
   position: relative; 
}
:deep(.el-progress-bar__outer) {
   overflow: visible;
}
        
.progress-dot {  
    position: absolute;  
    top: -1px; 
    width: 8px; 
    height: 8px;  
    background-color: #fff; 
    box-shadow: 0px 0px 7px 0 #98EEFF;
    border-radius: 50%;  
 }        
</style>

如果用的地方多的,可将其抽离为一个公共组件。

Vue2添加进度条上的高亮圆点,可以通过使用CSS和JavaScript来实现。基本思路是在进度条容器内部创建一个圆点元素,并通过JavaScript动态控制该圆点的位置,使其随进度条的进度移动。以下是实现这个功能的基本步骤: 1. 创建进度条圆点的HTML结构。 2. 使用CSS设置进度条圆点的样式,确保圆点的位置能够反映进度。 3. 使用JavaScript或者Vue的指令(如v-for, v-bind, v-on等)来动态更新圆点的位置。 这里是一个简化的例子: HTML部分: ```html <div id="progress-container"> <div class="progress-bar"> <div class="progress-dot" :style="{ left: progress + '%' }"></div> </div> </div> ``` CSS部分: ```css #progress-container { width: 100%; background-color: #e0e0e0; border-radius: 4px; overflow: hidden; position: relative; } .progress-bar { width: 0; height: 20px; background-color: #3f51b5; border-radius: 4px; } .progress-dot { width: 20px; height: 20px; border-radius: 50%; background-color: #3f51b5; position: absolute; top: -1px; transform: translateY(-50%); transition: left 0.2s ease-out; } ``` JavaScript/Vue部分: ```javascript new Vue({ el: '#app', data: { progress: 0 // 初始进度 }, methods: { // 假设这是一个更新进度的方法 updateProgress(newProgress) { this.progress = newProgress; } }, // 使用定时器模拟进度更新 mounted() { setInterval(() => { let newProgress = this.progress + 10; if (newProgress > 100) newProgress = 100; this.updateProgress(newProgress); }, 2000); } }); ``` 在这个例子,我们创建了一个进度条和一个圆点,并使用Vue的数据绑定来动态更新圆点的位置。通过CSS样式设置了进度条圆点的基本外观,并利用`left`属性来控制圆点的位置。JavaScript部分则使用了Vue实例的方法来模拟进度更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值