当前位置:首页 > JavaScript

js实现海浪

2026-04-05 05:06:43JavaScript

使用 Canvas 绘制动态海浪效果

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

HTML 结构

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

JavaScript 实现

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 方案适合简单的波浪装饰效果,通过伪元素和动画变换实现。

js实现海浪

.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实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现图片上传

js实现图片上传

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

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js防抖和节流实现

js防抖和节流实现

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

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…