当前位置:首页 > JavaScript

js实现水波

2026-04-06 08:46:06JavaScript

水波动画实现方法

使用JavaScript实现水波动画可以通过Canvas绘制结合数学函数模拟波纹效果。以下是两种常见实现方式:

js实现水波

基于Canvas的波纹效果

const canvas = document.getElementById('waveCanvas');
const ctx = canvas.getContext('2d');
let time = 0;

function resizeCanvas() {
  canvas.width = window.innerWidth;
  canvas.height = 200;
}
resizeCanvas();

function drawWave() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.beginPath();

  for (let x = 0; x < canvas.width; x++) {
    const y = Math.sin(x * 0.02 + time) * 10 + canvas.height / 2;
    ctx.lineTo(x, y);
  }

  ctx.lineTo(canvas.width, canvas.height);
  ctx.lineTo(0, canvas.height);
  ctx.closePath();
  ctx.fillStyle = 'rgba(64, 158, 255, 0.5)';
  ctx.fill();

  time += 0.05;
  requestAnimationFrame(drawWave);
}
drawWave();

使用三角函数模拟复杂波纹

function complexWave() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.beginPath();

  for (let x = 0; x < canvas.width; x++) {
    const y1 = Math.sin(x * 0.01 + time) * 10;
    const y2 = Math.cos(x * 0.015 + time * 1.3) * 8;
    const y = (y1 + y2) + canvas.height / 2;
    ctx.lineTo(x, y);
  }

  ctx.lineTo(canvas.width, canvas.height);
  ctx.lineTo(0, canvas.height);
  ctx.closePath();
  ctx.fillStyle = 'rgba(100, 180, 255, 0.6)';
  ctx.fill();

  time += 0.04;
  requestAnimationFrame(complexWave);
}

添加交互效果的波纹

let points = [];
canvas.addEventListener('click', (e) => {
  points.push({
    x: e.clientX,
    y: e.clientY,
    size: 5,
    alpha: 1
  });
});

function interactiveWave() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 绘制基础波形
  ctx.beginPath();
  for (let x = 0; x < canvas.width; x++) {
    let y = canvas.height / 2;
    points.forEach(point => {
      const distance = Math.sqrt(Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2));
      y += Math.sin(distance * 0.1 - time * 3) * point.size * point.alpha;
    });
    ctx.lineTo(x, y);
  }

  ctx.lineTo(canvas.width, canvas.height);
  ctx.lineTo(0, canvas.height);
  ctx.closePath();
  ctx.fillStyle = 'rgba(70, 130, 180, 0.5)';
  ctx.fill();

  // 更新点击波纹
  points = points.filter(p => {
    p.alpha -= 0.01;
    p.size += 0.2;
    return p.alpha > 0;
  });

  time += 0.05;
  requestAnimationFrame(interactiveWave);
}

性能优化建议

使用requestAnimationFrame替代setInterval确保动画流畅 对于复杂场景可考虑使用WebGL实现 限制波纹数量避免过多计算影响性能 使用transform代替重绘整个画布

js实现水波

实现要点

通过组合不同频率和相位的正弦波可创建更自然的水波效果 添加衰减系数使波纹逐渐消失更符合物理规律 使用缓动函数改善动画视觉效果 通过颜色渐变增强立体感

以上代码需要配合HTML中的canvas元素使用:

<canvas id="waveCanvas"></canvas>

标签: 水波js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…

vue.js watch实现

vue.js watch实现

使用 watch 监听数据变化 在 Vue.js 中,watch 用于监听响应式数据的变化,并在数据变化时执行回调函数。 基本语法 export default { data() {…