当前位置:首页 > JavaScript

js实现海浪

2026-04-05 05:06:43JavaScript

使用 Canvas 绘制动态海浪效果

通过 HTML5 Canvas 可以实现动态的海浪效果,核心是利用正弦函数模拟波浪起伏,并通过动画帧循环更新波浪位置。

HTML 结构

js实现海浪

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

JavaScript 实现

js实现海浪

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

function resizeCanvas() {
  canvas.width = window.innerWidth;
  canvas.height = 200;
}
resizeCanvas();
window.addEventListener('resize', resizeCanvas);

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

  ctx.fillStyle = '#1a8cff';
  ctx.beginPath();

  const waveHeight = 50;
  const waveLength = 0.01;
  const xOffset = 100;

  for (let x = 0; x < canvas.width; x++) {
    const y = waveHeight * Math.sin(x * waveLength + time) + xOffset;
    if (x === 0) {
      ctx.moveTo(x, y);
    } else {
      ctx.lineTo(x, y);
    }
  }

  ctx.lineTo(canvas.width, canvas.height);
  ctx.lineTo(0, canvas.height);
  ctx.closePath();
  ctx.fill();

  time += 0.05;
  requestAnimationFrame(drawWave);
}

drawWave();

使用 SVG 创建平滑海浪

SVG 的路径动画可以创建更平滑的海浪效果,适合需要矢量缩放的情况。

<svg viewBox="0 0 1200 200" xmlns="http://www.w3.org/2000/svg">
  <path id="wave" fill="#1a8cff" opacity="0.8">
    <animate attributeName="d" 
             dur="10s" 
             repeatCount="indefinite"
             values="
               M0,100 C150,200 350,0 500,100 S850,200 1000,100 S1350,0 1500,100;
               M0,100 C150,0 350,200 500,100 S850,0 1000,100 S1350,200 1500,100;
               M0,100 C150,200 350,0 500,100 S850,200 1000,100 S1350,0 1500,100"/>
  </path>
</svg>

使用 CSS 动画实现简单波浪

纯 CSS 方案适合简单的波浪装饰效果,通过伪元素和动画变换实现。

.wave {
  position: relative;
  height: 100px;
  overflow: hidden;
}

.wave::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 100px;
  background: url('data:image/svg+xml;utf8,<svg viewBox="0 0 1200 120" xmlns="http://www.w3.org/2000/svg"><path d="M0,0V46.29c47.79,22.2,103.59,32.17,158,28,70.36-5.37,136.33-33.31,206.8-37.5C438.64,32.43,512.34,53.67,583,72.05c69.27,18,138.3,24.88,209.4,13.08,36.15-6,69.85-17.84,104.45-29.34C989.49,25,1113-14.29,1200,52.47V0Z" fill="%231a8cff" opacity=".25"/></svg>');
  background-size: cover;
  animation: wave 8s linear infinite;
}

@keyframes wave {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

性能优化建议

  • 对于复杂场景,考虑使用 WebGL 实现高性能波浪效果
  • 限制 Canvas 绘制区域,避免全屏重绘
  • 使用 CSS transform 代替 top/left 动画
  • 对于移动设备,降低动画帧率或简化波浪复杂度

以上方法可以根据具体需求选择,Canvas 方案最适合动态交互效果,SVG 适合响应式设计,CSS 方案实现最简单。

标签: 海浪js
分享给朋友:

相关文章

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…