当前位置:首页 > VUE

vue实现水波球进度条

2026-03-27 06:31:01VUE

Vue 实现水波球进度条

水波球进度条是一种动态展示进度效果的 UI 组件,结合 SVG 和动画可以实现水波起伏的效果。以下是实现方法:

使用 SVG 和动画

创建一个 Vue 组件,利用 SVG 绘制圆形路径,并通过动画模拟水波效果。

vue实现水波球进度条

<template>
  <div class="water-ball">
    <svg class="water-ball-svg" viewBox="0 0 100 100">
      <defs>
        <clipPath id="water-clip">
          <path id="water-path" :d="waterPath" />
        </clipPath>
      </defs>
      <circle cx="50" cy="50" r="45" fill="#e0e0e0" />
      <circle cx="50" cy="50" r="45" fill="#4a90e2" clip-path="url(#water-clip)" />
      <text x="50" y="55" text-anchor="middle" font-size="16" fill="#333">{{ progress }}%</text>
    </svg>
  </div>
</template>

<script>
export default {
  props: {
    progress: {
      type: Number,
      default: 50,
      validator: value => value >= 0 && value <= 100
    }
  },
  data() {
    return {
      waveOffset: 0
    };
  },
  computed: {
    waterPath() {
      const amplitude = 5;
      const y = 50 - (this.progress * 0.9);
      let path = `M 0 ${y} `;
      for (let i = 0; i <= 100; i += 10) {
        const waveY = y + amplitude * Math.sin((i + this.waveOffset) * 0.1);
        path += `L ${i} ${waveY} `;
      }
      path += `L 100 100 L 0 100 Z`;
      return path;
    }
  },
  mounted() {
    this.animateWave();
  },
  methods: {
    animateWave() {
      const animate = () => {
        this.waveOffset += 1;
        requestAnimationFrame(animate);
      };
      animate();
    }
  }
};
</script>

<style>
.water-ball {
  width: 200px;
  height: 200px;
  margin: 0 auto;
}
.water-ball-svg {
  width: 100%;
  height: 100%;
}
</style>

使用第三方库

如果需要更复杂的效果,可以使用第三方库如 vue-wavesurfervue-liquidfill

安装 vue-liquidfill

vue实现水波球进度条

npm install vue-liquidfill

示例代码:

<template>
  <div>
    <liquid-fill :percent="progress" :wave-animation="true" />
  </div>
</template>

<script>
import LiquidFill from 'vue-liquidfill';

export default {
  components: { LiquidFill },
  data() {
    return {
      progress: 50
    };
  }
};
</script>

自定义动画效果

调整水波的振幅、频率和动画速度,可以通过修改 amplitudewaveOffset 的计算方式实现。例如,增加振幅:

computed: {
  waterPath() {
    const amplitude = 8; // 增大振幅
    const y = 50 - (this.progress * 0.9);
    let path = `M 0 ${y} `;
    for (let i = 0; i <= 100; i += 10) {
      const waveY = y + amplitude * Math.sin((i + this.waveOffset) * 0.05); // 调整频率
      path += `L ${i} ${waveY} `;
    }
    path += `L 100 100 L 0 100 Z`;
    return path;
  }
}

注意事项

  • 确保 progress 的值在 0 到 100 之间。
  • 调整 SVG 的 viewBox 和尺寸以适应不同容器。
  • 使用 requestAnimationFrame 实现平滑动画,避免性能问题。

标签: 水波进度条
分享给朋友:

相关文章

vue请求实现进度条

vue请求实现进度条

实现请求进度条的方法 在Vue中实现请求进度条可以通过多种方式完成,常见的有使用第三方库如axios结合nprogress或自定义进度条组件。以下是几种实现方法: 使用axios和nprogress…

css制作网格进度条

css制作网格进度条

使用CSS Grid布局制作网格进度条 通过CSS Grid布局可以轻松创建网格进度条。定义一个容器元素作为网格,子元素表示进度块。 <div class="grid-progress">…

js实现录音进度条回放

js实现录音进度条回放

实现录音进度条回放的方法 使用Web Audio API和MediaRecorder API Web Audio API提供了音频处理的底层能力,MediaRecorder API用于录制音频流。结合…

vue请求实现进度条

vue请求实现进度条

实现请求进度条的方法 在Vue中实现请求进度条可以通过多种方式完成,以下是几种常见的方法: 使用axios拦截器 axios拦截器可以在请求发出前和响应返回后执行特定逻辑,适合用于进度条控制。…

vue实现进度条

vue实现进度条

Vue 实现进度条的几种方法 使用原生 HTML5 <progress> 标签 Vue 可以结合 HTML5 的 <progress> 标签快速实现基础进度条: <te…

vue进度条实现

vue进度条实现

使用原生HTML5 <progress> 标签 在Vue中可以直接使用HTML5的<progress>标签实现简单的进度条。 <template> <…