当前位置:首页 > JavaScript

js实现海浪

2026-01-31 12:57:14JavaScript

使用Canvas绘制波浪动画

通过HTML5的Canvas API可以实现动态波浪效果。以下是一个基础实现示例:

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.beginPath();
  for (let x = 0; x < canvas.width; x++) {
    const y = Math.sin(x * 0.02 + time) * 20 + canvas.height/2;
    ctx.lineTo(x, y);
  }

  ctx.strokeStyle = '#3498db';
  ctx.lineWidth = 2;
  ctx.stroke();

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

添加渐变填充效果

增强视觉效果可以添加渐变填充:

js实现海浪

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

  ctx.beginPath();
  for (let x = 0; x <= canvas.width; x += 5) {
    const y = Math.sin(x * 0.01 + time) * 30 + canvas.height/2;
    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();

  const gradient = ctx.createLinearGradient(0, 0, 0, canvas.height);
  gradient.addColorStop(0, 'rgba(52, 152, 219, 0.8)');
  gradient.addColorStop(1, 'rgba(52, 152, 219, 0.2)');

  ctx.fillStyle = gradient;
  ctx.fill();

  time += 0.05;
  requestAnimationFrame(drawWaveWithFill);
}

多图层波浪效果

创建更复杂的波浪可以叠加多个正弦波:

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

  // 第一层波浪
  ctx.beginPath();
  for (let x = 0; x < canvas.width; x++) {
    const y = Math.sin(x * 0.01 + time) * 20 
            + Math.sin(x * 0.02 + time * 0.7) * 10 
            + canvas.height/2;
    ctx.lineTo(x, y);
  }

  ctx.strokeStyle = 'rgba(52, 152, 219, 0.7)';
  ctx.lineWidth = 2;
  ctx.stroke();

  // 第二层波浪
  ctx.beginPath();
  for (let x = 0; x < canvas.width; x++) {
    const y = Math.sin(x * 0.015 + time * 1.2) * 15 
            + Math.cos(x * 0.025 + time * 0.5) * 8 
            + canvas.height/2 + 30;
    ctx.lineTo(x, y);
  }

  ctx.strokeStyle = 'rgba(41, 128, 185, 0.5)';
  ctx.stroke();

  time += 0.03;
  requestAnimationFrame(drawMultiWave);
}

使用WebGL实现3D波浪

对于高性能需求,可以使用Three.js创建3D波浪:

import * as THREE from 'three';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

const geometry = new THREE.PlaneGeometry(20, 20, 100, 100);
const material = new THREE.MeshBasicMaterial({ 
  color: 0x3498db,
  wireframe: true,
  side: THREE.DoubleSide
});
const plane = new THREE.Mesh(geometry, material);
scene.add(plane);
camera.position.z = 15;

function animate() {
  requestAnimationFrame(animate);

  for (let i = 0; i < plane.geometry.attributes.position.count; i++) {
    const x = plane.geometry.attributes.position.getX(i);
    const y = plane.geometry.attributes.position.getY(i);
    const z = Math.sin(x + Date.now() * 0.001) * 0.5;
    plane.geometry.attributes.position.setZ(i, z);
  }
  plane.geometry.attributes.position.needsUpdate = true;

  renderer.render(scene, camera);
}
animate();

性能优化建议

  1. 对于复杂动画,使用requestAnimationFrame而非setInterval
  2. 避免在动画循环中创建新对象,尽量复用现有对象
  3. 对于静态背景元素,考虑使用CSS实现而非Canvas
  4. 在移动设备上适当降低动画帧率
  5. 使用Web Worker处理复杂计算

这些方法可以根据需求组合使用,创建从简单到复杂的各种波浪效果。实际应用中可以根据具体场景调整参数如振幅、频率和相位差来获得不同视觉效果。

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

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="sli…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式…