当前位置:首页 > JavaScript

js实现水波

2026-02-01 15:54:23JavaScript

实现水波效果的JavaScript方法

使用Canvas绘制水波效果是一种常见的实现方式。以下是一个基本的水波动画实现示例:

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

let time = 0;
const waveHeight = 20;
const waveLength = 0.01;
const speed = 0.05;

function animate() {
    ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    ctx.beginPath();
    ctx.moveTo(0, canvas.height/2);

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

    ctx.strokeStyle = 'hsl(' + Math.abs(200 * Math.sin(time)) + ', 100%, 50%)';
    ctx.stroke();

    time += speed;
    requestAnimationFrame(animate);
}

animate();

优化水波效果

为了创建更真实的水波效果,可以结合多个波形:

js实现水波

function animate() {
    ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    ctx.beginPath();
    ctx.moveTo(0, canvas.height/2);

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

    ctx.strokeStyle = 'rgba(100, 200, 255, 0.8)';
    ctx.stroke();

    time += 0.05;
    requestAnimationFrame(animate);
}

交互式水波效果

添加鼠标交互可以让水波效果更加生动:

js实现水波

let mouseX = 0;
let mouseY = 0;

canvas.addEventListener('mousemove', (e) => {
    mouseX = e.clientX;
    mouseY = e.clientY;
});

function animate() {
    ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    ctx.beginPath();
    ctx.moveTo(0, canvas.height/2);

    for(let x = 0; x < canvas.width; x++) {
        const distanceToMouse = Math.abs(x - mouseX);
        const waveEffect = 50 * Math.exp(-distanceToMouse * 0.01);

        const y = waveHeight * Math.sin(x * waveLength + time) 
                + waveEffect * Math.sin(time * 2) 
                + canvas.height/2;
        ctx.lineTo(x, y);
    }

    ctx.strokeStyle = 'rgba(100, 200, 255, 0.8)';
    ctx.stroke();

    time += speed;
    requestAnimationFrame(animate);
}

使用WebGL实现高性能水波

对于更复杂的水波效果,可以考虑使用WebGL:

// 简单的WebGL水波着色器示例
const vertexShader = `
    attribute vec2 position;
    void main() {
        gl_Position = vec4(position, 0.0, 1.0);
    }
`;

const fragmentShader = `
    precision highp float;
    uniform float time;

    void main() {
        vec2 uv = gl_FragCoord.xy / 500.0;
        float wave = sin(uv.x * 10.0 + time) * 0.1;
        gl_FragColor = vec4(0.0, wave + 0.5, 1.0, 1.0);
    }
`;

// WebGL初始化代码...

CSS实现简单水波效果

如果不需要复杂交互,纯CSS也能实现简单水波动画:

<div class="wave"></div>

<style>
.wave {
    width: 200px;
    height: 200px;
    background: radial-gradient(
        circle at 75% 50%,
        rgba(100, 200, 255, 0.8),
        transparent 70%
    );
    border-radius: 50%;
    animation: wave 2s infinite ease-in-out;
}

@keyframes wave {
    0% { transform: scale(1); opacity: 0.8; }
    50% { transform: scale(1.2); opacity: 0.5; }
    100% { transform: scale(1); opacity: 0.8; }
}
</style>

以上方法提供了从简单到复杂的水波效果实现方案,可以根据项目需求选择合适的实现方式。Canvas方案适合需要精细控制和交互的场景,而CSS方案则更适合简单的装饰性效果。

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

相关文章

js实现

js实现

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

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现自举

js实现自举

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

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js怎么实现异步

js怎么实现异步

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