简易的可拖拽进度条el-progress

实现关键思路:

1. 点击移动时修改百分比

2. 按进度条的长度来控制灵敏度

3. 包含在元素内部,避免麻烦的位置计算

缺点:进度条有动画,精度操作不灵活

<template>
  <div class="draggable-progress" ref="refElProgress">
    <el-progress
      :percentage="percentage"
      :show-text="true"
      :stroke-width="20"
      :duration="0.1"
      :text-inside="true"
    >
      <template #default="{ percentage }">
        <el-tooltip :content="String(percentage)" placement="top">
          <div
            class="draggable-progress-handle"
            @mousedown="mouseDown"
            @mouseup="mouseUp"
            @mousemove="mouseMove"
            @mouseleave="mouseleave"
          ></div>
        </el-tooltip>
      </template>
    </el-progress>
  </div>
</template>
<script setup lang="tsx">
import { ref, onMounted, computed } from 'vue'
/**
 * 监听变化:
 * https://v4-11-2.vueuse.org/core/useresizeobserver/
 */
import { useResizeObserver } from '@vueuse/core'

const percentage = ref(90)
const moveingX = ref(0)

const moving = ref(false)
const widthProgress = ref(0)
const refElProgress = ref(null)

const mouseDown = (e) => {
  moving.value = true
  moveingX.value = 0
  console.log('mouseDown------------>')
}

const mouseleave = (e) => {
  moving.value = false
  moveingX.value = 0
}

const mouseUp = (e) => {
  moving.value = false
  moveingX.value = 0
  console.log('mouseUp------------>')
}

const mouseMove = (e) => {
  if (moving.value) {
    let speed = widthProgress.value / 100
    let tempT = (e.movementX * speed * 100) / widthProgress.value + percentage.value
    if (tempT < 0) {
      tempT = 0
    }
    if (tempT > 100) {
      tempT = 100
    }
    console.log("moving---->")
    console.log(e.movementX)
    console.log(tempT)
    percentage.value = Math.floor(tempT) 
  }
}

onMounted(() => {
  if (refElProgress.value) {
    const width = refElProgress.value.clientWidth
    widthProgress.value = width
    console.log('-->')
    console.log(width)
  }

  useResizeObserver(refElProgress, (entries) => {
    const entry = entries[0]
    const { width, height } = entry.contentRect
    console.log('heightL-->')
    console.log(height)
    console.log(width)
    widthProgress.value = width
  })
})
</script>
<style lang="scss" scoped>
.draggable-progress {
  position: relative;
  width: 100%;
  --gantt-draggable-progress-left: -8px;

  .draggable-progress-handle {
    // position: absolute;
    top: -4px;
    width: 16px;
    height: 16px;
    background-color: #fff;
    border: 3px solid red;
    border-radius: 50%;
    cursor: col-resize;
    z-index: 0;
    opacity: 1;
    transition: opacity 0.5s ease;
    &:hover {
      opacity: 0.5;
    }
  }
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值