当前位置:首页 > JavaScript

js实现水柱

2026-03-02 08:31:55JavaScript

实现水柱效果的JavaScript方法

使用Canvas绘制动态水柱效果,结合流体力学公式模拟水的波动。以下为关键代码示例:

js实现水柱

const canvas = document.getElementById('waterCanvas');
const ctx = canvas.getContext('2d');
let width = canvas.width;
let height = canvas.height;

// 水柱参数
let waveHeight = 50;
let waveSpeed = 0.05;
let waveLength = 100;
let time = 0;

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

    // 绘制水面
    ctx.beginPath();
    ctx.moveTo(0, height/2);

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

    ctx.lineTo(width, height);
    ctx.lineTo(0, height);
    ctx.closePath();
    ctx.fillStyle = 'rgba(64, 164, 223, 0.7)';
    ctx.fill();

    time += waveSpeed;
    requestAnimationFrame(animate);
}

animate();

物理模拟优化

添加流体动力学参数提升真实感,使用波动方程增强交互性:

js实现水柱

// 改进的波动方程参数
const damping = 0.996;
const spread = 0.5;
let surface = Array(width).fill(height/2);
let velocity = Array(width).fill(0);

function updateSurface() {
    for(let i = 1; i < width-1; i++) {
        // 波动传播计算
        velocity[i] += (surface[i-1] + surface[i+1])/2 - surface[i];
        velocity[i] *= damping;
    }

    for(let i = 1; i < width-1; i++) {
        surface[i] += velocity[i] * spread;
    }
}

交互功能实现

添加鼠标交互产生涟漪效果:

canvas.addEventListener('click', (e) => {
    const posX = e.clientX - canvas.offsetLeft;
    velocity[posX] = -20; // 点击位置产生扰动
});

性能优化建议

使用WebGL的Three.js库处理复杂水效果:

import * as THREE from 'three';

// 创建水面几何体
const waterGeometry = new THREE.PlaneGeometry(10, 10, 128, 128);
const waterMaterial = new THREE.ShaderMaterial({
    uniforms: {
        time: { value: 0 }
    },
    vertexShader: `
        uniform float time;
        void main() {
            vec3 pos = position;
            pos.y += sin(pos.x * 5.0 + time) * 0.2;
            gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
        }
    `,
    fragmentShader: `
        void main() {
            gl_FragColor = vec4(0.0, 0.5, 1.0, 0.8);
        }
    `
});

以上方法可根据需求选择实现方案,Canvas方案适合轻量级应用,WebGL方案适合高性能要求的场景。

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

相关文章

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…