返回

水波潋滟 | Vue 项目中实现圆柱状水波效果,打造迷人视觉盛宴

前端

打造圆柱形水波效果:在 Vue 中让水波律动

认识 Canvas:开启水波之旅

在踏上水波之旅之前,让我们先认识一下 Canvas。这是一个 HTML5 元素,允许您使用 JavaScript 绘制图形和动画。它是实现水波效果的关键所在。

铺垫数据:为水波赋予生命

在 data() 方法中,我们定义了一个 waterData 数组来存储每个水波的数据,包括其起始位置、颜色和速度。此外,我们还定义了 cylinderSize 对象来指定圆柱体的尺寸。

data() {
  return {
    waterData: [],
    cylinderSize: {
      radius: 100,
      height: 200
    }
  };
}

请求接口:获取数据源泉

为了让水波具有实际意义,我们需要从外部获取数据。我们使用 getMarks() 方法来请求数据接口,获取水波数据。

import { getMarks } from '@/api/businessOperation';

getMarks().then((res) => {
  this.waterData = res.data;
});

水波渲染:绘出律动之美

接下来,我们进入到水波渲染环节。我们首先定义了一个 canvas 元素,然后通过 getContext('2d') 方法获取它的 2D 上下文。接下来,我们循环遍历水波数据,使用 canvas API 绘制每个水波。

<canvas ref="canvas"></canvas>

mounted() {
  const canvas = this.$refs.canvas;
  const ctx = canvas.getContext('2d');

  for (let i = 0; i < this.waterData.length; i++) {
    const water = this.waterData[i];

    // 绘制水波
    ctx.beginPath();
    ctx.arc(water.x, water.y, water.radius, 0, 2 * Math.PI);
    ctx.fillStyle = water.color;
    ctx.fill();
  }
}

水波律动:增添灵动之感

为了让水波动起来,我们需要在每帧中更新水波的位置。我们使用 requestAnimationFrame() 方法来实现这一目的。在每一帧中,我们计算每个水波的新位置,并重新渲染 canvas。

animate() {
  requestAnimationFrame(this.animate);

  for (let i = 0; i < this.waterData.length; i++) {
    const water = this.waterData[i];

    // 更新水波位置
    water.x += water.speedX;
    water.y += water.speedY;

    // 水波触壁反弹
    if (water.x < 0 || water.x > this.cylinderSize.radius) {
      water.speedX = -water.speedX;
    }
    if (water.y < 0 || water.y > this.cylinderSize.height) {
      water.speedY = -water.speedY;
    }
  }

  // 重新渲染 canvas
  this.render();
}

触摸互动:让水波随心所欲

最后,为了让用户能够与水波互动,我们添加了一个触摸事件监听器。当用户触摸屏幕时,我们将水波的位置更新到触摸点的位置。

touchstart(event) {
  const rect = this.$refs.canvas.getBoundingClientRect();
  const x = event.touches[0].clientX - rect.left;
  const y = event.touches[0].clientY - rect.top;

  for (let i = 0; i < this.waterData.length; i++) {
    const water = this.waterData[i];

    // 水波位置更新到触摸点位置
    water.x = x;
    water.y = y;
  }

  // 重新渲染 canvas
  this.render();
}

结语

通过以上步骤,您已经成功地实现了圆柱状的水波效果。水波随着时间流动而律动,用户还可以通过触摸屏幕来与水波互动。希望这篇博文能够帮助您在 Vue 项目中打造出令人惊艳的水波效果。

常见问题解答

  • 问:如何调整水波的速度和大小?
    答:您可以在 data() 方法中修改 cylinderSize 和 waterData 中的属性值,以调整水波的尺寸和速度。

  • 问:我可以将不同的颜色应用于不同的水波吗?
    答:当然可以。您可以在 waterData 数组中为每个水波指定不同的颜色值。

  • 问:如何限制水波在圆柱体区域内移动?
    答:我们在 animate() 方法中添加了触壁反弹逻辑,以确保水波在触及圆柱体壁时反弹回来。

  • 问:如何让水波产生溅射效果?
    答:这需要更高级的技术,例如使用粒子系统或物理引擎。

  • 问:我可以将水波效果添加到任何 Vue 组件吗?
    答:是的,您可以将水波效果作为可重用的组件添加到任何 Vue 组件中。