js实现水流
实现水流效果的方法
在JavaScript中实现水流效果通常涉及Canvas绘图或CSS动画。以下是几种常见的方法:
使用Canvas绘制水流
创建Canvas元素并设置基本属性:
<canvas id="waterCanvas" width="500" height="300"></canvas>
JavaScript代码实现波浪效果:
const canvas = document.getElementById('waterCanvas');
const ctx = canvas.getContext('2d');
let time = 0;
function drawWave() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'rgba(0, 150, 255, 0.5)';
ctx.beginPath();
for (let x = 0; x < canvas.width; x++) {
const y = 100 + 20 * Math.sin(x * 0.02 + time);
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();
ctx.fill();
time += 0.1;
requestAnimationFrame(drawWave);
}
drawWave();
使用CSS动画实现水流
创建HTML结构:
<div class="water-container">
<div class="water"></div>
</div>
添加CSS样式和动画:
.water-container {
width: 500px;
height: 300px;
position: relative;
overflow: hidden;
}
.water {
position: absolute;
bottom: 0;
width: 200%;
height: 100%;
background: linear-gradient(90deg, rgba(0,150,255,0.5) 0%, rgba(0,200,255,0.8) 50%, rgba(0,150,255,0.5) 100%);
animation: wave 4s linear infinite;
transform-origin: bottom center;
}
@keyframes wave {
0% { transform: translateX(0) skewY(2deg); }
100% { transform: translateX(-50%) skewY(2deg); }
}
使用WebGL实现更复杂的水流
对于更真实的水流效果,可以考虑使用WebGL库:
// 使用Three.js创建水面
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
// 创建水面几何体
const waterGeometry = new THREE.PlaneGeometry(10, 10, 256, 256);
const waterMaterial = new THREE.ShaderMaterial({
uniforms: {
time: { value: 0 }
},
vertexShader: `
uniform float time;
varying vec2 vUv;
void main() {
vUv = uv;
vec3 pos = position;
pos.y += sin(pos.x * 5.0 + time) * 0.1;
gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
}
`,
fragmentShader: `
varying vec2 vUv;
void main() {
gl_FragColor = vec4(0.0, 0.5, 1.0, 0.5);
}
`,
transparent: true
});
const water = new THREE.Mesh(waterGeometry, waterMaterial);
scene.add(water);
function animate() {
requestAnimationFrame(animate);
waterMaterial.uniforms.time.value += 0.01;
renderer.render(scene, camera);
}
animate();
使用物理引擎模拟水流
对于需要物理交互的水流效果,可以结合物理引擎:

// 使用Matter.js创建简单的水面
const engine = Matter.Engine.create();
const world = engine.world;
// 创建水面主体
const water = Matter.Bodies.rectangle(400, 300, 800, 50, {
isStatic: true,
render: {
fillStyle: 'rgba(0, 150, 255, 0.5)'
}
});
Matter.World.add(world, water);
// 添加浮动物体
const box = Matter.Bodies.rectangle(200, 100, 50, 50);
Matter.World.add(world, box);
// 更新渲染
Matter.Engine.update(engine);
这些方法提供了从简单到复杂的水流效果实现方案,可以根据项目需求选择合适的技术方案。






