当前位置:首页 > 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实现图片放大缩小

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

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现防洪

js实现防洪

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

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…