当前位置:首页 > VUE

vue实现水波球进度条

2026-03-27 06:31:01VUE

Vue 实现水波球进度条

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

使用 SVG 和动画

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

<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

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 的计算方式实现。例如,增加振幅:

vue实现水波球进度条

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 实现平滑动画,避免性能问题。

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

相关文章

css制作网格进度条

css制作网格进度条

使用 CSS Grid 制作网格进度条 CSS Grid 是一种强大的布局工具,可以用来创建网格进度条。以下是实现方法: HTML 结构 <div class="progress-grid"…

php实现进度条

php实现进度条

PHP 实现进度条的方法 使用 HTML 和 CSS 结合 PHP 实现进度条 在 PHP 中,进度条通常通过 HTML 和 CSS 实现,PHP 负责计算进度并更新前端显示。 <div st…

vue实现进度条

vue实现进度条

Vue 实现进度条的方法 使用原生 HTML 和 CSS 结合 Vue 数据绑定 创建一个简单的进度条,通过 Vue 的数据绑定动态控制进度值。 <template> <div…

js实现录音进度条回放

js实现录音进度条回放

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

js实现水波

js实现水波

实现水波效果的JavaScript方法 使用Canvas绘制水波效果是一种常见的实现方式。以下是一个基本的水波动画实现示例: const canvas = document.getElementBy…

jquery进度条插件

jquery进度条插件

jQuery进度条插件推荐 ProgressBar.js 一个灵活且轻量级的进度条库,支持圆形、直线和自定义形状。通过SVG渲染,动画效果流畅,支持动态更新进度。适合需要可视化进度展示的场景。 jQ…