当前位置:首页 > JavaScript

js实现大海

2026-02-01 18:29:08JavaScript

实现海洋动画效果

使用Canvas绘制动态波浪效果是模拟大海的常见方法。以下代码创建了一个带有波浪动画的海洋场景:

const canvas = document.getElementById('oceanCanvas');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = 200;

let time = 0;
function animateWave() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.fillStyle = '#1a73e8';
    ctx.beginPath();

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

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

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

添加3D海洋效果

使用Three.js可以创建更逼真的3D海洋场景。需要先引入Three.js库:

js实现大海

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 waterGeometry = new THREE.PlaneGeometry(100, 100, 128, 128);
const water = new THREE.Water(waterGeometry, {
    textureWidth: 512,
    textureHeight: 512,
    waterNormals: new THREE.TextureLoader().load('waternormals.jpg'),
    sunDirection: new THREE.Vector3(),
    sunColor: 0xffffff,
    waterColor: 0x0077be,
    distortionScale: 3.7
});
scene.add(water);

function animate() {
    requestAnimationFrame(animate);
    water.material.uniforms.time.value += 0.01;
    renderer.render(scene, camera);
}
animate();

使用CSS实现简单海浪

纯CSS也可以创建基础的波浪效果,适合性能要求不高的场景:

js实现大海

.ocean {
    position: relative;
    height: 100px;
    background: linear-gradient(to bottom, #0077be, #00a1ff);
    overflow: hidden;
}

.wave {
    position: absolute;
    bottom: 0;
    width: 200%;
    height: 100px;
    background-repeat: repeat no-repeat;
    background-position: 0 bottom;
    background-size: 50% 100px;
    animation: wave 7s linear infinite;
}

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

添加海洋生物元素

增强真实感可以添加游动的鱼类或其他海洋生物:

function createFish() {
    const fish = document.createElement('div');
    fish.className = 'fish';
    fish.style.left = `${Math.random() * 100}%`;
    fish.style.top = `${60 + Math.random() * 30}%`;
    fish.style.animationDuration = `${5 + Math.random() * 10}s`;
    document.querySelector('.ocean').appendChild(fish);
}

for(let i=0; i<10; i++) {
    createFish();
}

优化性能的技巧

大规模海洋动画可能消耗较多资源,可以采用以下优化方法:

  • 限制动画帧率到30fps
  • 使用离屏Canvas预渲染静态元素
  • 对3D场景使用适当的LOD(细节层次)控制
  • 在移动设备上降低波浪的顶点数量

这些方法可以根据具体需求组合使用,从简单CSS动画到复杂3D渲染都能实现不同细节程度的海洋效果。

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

相关文章

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

vue实现js休眠

vue实现js休眠

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

js实现同步

js实现同步

同步与异步的概念 在JavaScript中,同步代码会按照顺序执行,每一行代码必须等待上一行代码执行完成后才能运行。异步代码则允许在等待某些操作(如网络请求)完成的同时继续执行其他代码。 实现同步的…

js实现表单验证提交表单提交表单提交

js实现表单验证提交表单提交表单提交

表单验证与提交的实现 在JavaScript中实现表单验证并提交表单,可以通过监听表单的提交事件,进行验证后决定是否提交。以下是实现方法: 基础表单验证 通过监听表单的submit事件,阻止默认提交…

js实现vue模板

js实现vue模板

使用纯 JavaScript 实现 Vue 模板功能 要实现类似 Vue 的模板功能,可以通过以下步骤完成: 1. 数据绑定与响应式更新 通过 Object.defineProperty 或 Pr…