js实现海浪
使用 Canvas 绘制动态海浪效果
通过 HTML5 Canvas 可以实现动态的海浪效果,核心是利用正弦函数模拟波浪起伏,并通过动画帧循环更新波浪位置。
HTML 结构

<canvas id="waveCanvas"></canvas>
JavaScript 实现

const canvas = document.getElementById('waveCanvas');
const ctx = canvas.getContext('2d');
let time = 0;
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = 200;
}
resizeCanvas();
window.addEventListener('resize', resizeCanvas);
function drawWave() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = '#1a8cff';
ctx.beginPath();
const waveHeight = 50;
const waveLength = 0.01;
const xOffset = 100;
for (let x = 0; x < canvas.width; x++) {
const y = waveHeight * Math.sin(x * waveLength + time) + xOffset;
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.05;
requestAnimationFrame(drawWave);
}
drawWave();
使用 SVG 创建平滑海浪
SVG 的路径动画可以创建更平滑的海浪效果,适合需要矢量缩放的情况。
<svg viewBox="0 0 1200 200" xmlns="http://www.w3.org/2000/svg">
<path id="wave" fill="#1a8cff" opacity="0.8">
<animate attributeName="d"
dur="10s"
repeatCount="indefinite"
values="
M0,100 C150,200 350,0 500,100 S850,200 1000,100 S1350,0 1500,100;
M0,100 C150,0 350,200 500,100 S850,0 1000,100 S1350,200 1500,100;
M0,100 C150,200 350,0 500,100 S850,200 1000,100 S1350,0 1500,100"/>
</path>
</svg>
使用 CSS 动画实现简单波浪
纯 CSS 方案适合简单的波浪装饰效果,通过伪元素和动画变换实现。
.wave {
position: relative;
height: 100px;
overflow: hidden;
}
.wave::before {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 100px;
background: url('data:image/svg+xml;utf8,<svg viewBox="0 0 1200 120" xmlns="http://www.w3.org/2000/svg"><path d="M0,0V46.29c47.79,22.2,103.59,32.17,158,28,70.36-5.37,136.33-33.31,206.8-37.5C438.64,32.43,512.34,53.67,583,72.05c69.27,18,138.3,24.88,209.4,13.08,36.15-6,69.85-17.84,104.45-29.34C989.49,25,1113-14.29,1200,52.47V0Z" fill="%231a8cff" opacity=".25"/></svg>');
background-size: cover;
animation: wave 8s linear infinite;
}
@keyframes wave {
from { transform: translateX(0); }
to { transform: translateX(-50%); }
}
性能优化建议
- 对于复杂场景,考虑使用 WebGL 实现高性能波浪效果
- 限制 Canvas 绘制区域,避免全屏重绘
- 使用 CSS transform 代替 top/left 动画
- 对于移动设备,降低动画帧率或简化波浪复杂度
以上方法可以根据具体需求选择,Canvas 方案最适合动态交互效果,SVG 适合响应式设计,CSS 方案实现最简单。






