当前位置:首页 > JavaScript

js实现水柱

2026-01-31 17:23:28JavaScript

实现水柱效果的JavaScript方法

使用Canvas绘制动态水柱效果是一种常见的实现方式。以下是基于Canvas和JavaScript的详细实现步骤:

创建Canvas基础结构

<canvas id="waterCanvas" width="400" height="200"></canvas>
const canvas = document.getElementById('waterCanvas');
const ctx = canvas.getContext('2d');

定义水柱参数

const wave = {
  y: canvas.height / 2,
  length: 0.01,
  amplitude: 20,
  frequency: 0.01
};

let time = 0;

绘制水柱动画

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);

  for (let i = 0; i < canvas.width; i++) {
    const y = wave.y + 
              Math.sin(i * wave.length + time) * wave.amplitude * 
              Math.sin(time * wave.frequency);
    ctx.lineTo(i, y);
  }

  ctx.lineTo(canvas.width, canvas.height);
  ctx.fillStyle = '#00a1ff';
  ctx.fill();

  time += 0.05;
  requestAnimationFrame(animate);
}

animate();

增强水柱效果

添加水花飞溅效果可提升真实感:

js实现水柱

const drops = [];

function createDrop(x, y) {
  drops.push({
    x,
    y,
    size: Math.random() * 3 + 1,
    speedY: Math.random() * -3 - 2,
    speedX: Math.random() * 2 - 1,
    opacity: Math.random() * 0.5 + 0.5
  });
}

function updateDrops() {
  for (let i = 0; i < drops.length; i++) {
    const drop = drops[i];
    drop.y += drop.speedY;
    drop.x += drop.speedX;
    drop.opacity -= 0.01;

    if (drop.opacity <= 0) {
      drops.splice(i, 1);
      i--;
    }
  }

  if (Math.random() < 0.1) {
    createDrop(
      Math.random() * canvas.width,
      wave.y + wave.amplitude
    );
  }
}

function drawDrops() {
  drops.forEach(drop => {
    ctx.beginPath();
    ctx.arc(drop.x, drop.y, drop.size, 0, Math.PI * 2);
    ctx.fillStyle = `rgba(100, 200, 255, ${drop.opacity})`;
    ctx.fill();
  });
}

整合动画循环

修改后的动画函数:

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);
  for (let i = 0; i < canvas.width; i++) {
    const y = wave.y + 
              Math.sin(i * wave.length + time) * wave.amplitude * 
              Math.sin(time * wave.frequency);
    ctx.lineTo(i, y);
  }
  ctx.lineTo(canvas.width, canvas.height);
  ctx.fillStyle = '#00a1ff';
  ctx.fill();

  // 处理水滴
  updateDrops();
  drawDrops();

  time += 0.05;
  requestAnimationFrame(animate);
}

交互式控制

添加鼠标交互控制水柱高度:

canvas.addEventListener('mousemove', (e) => {
  wave.y = e.clientY - canvas.offsetTop;
});

性能优化建议

对于复杂场景,可采用以下优化措施:

  • 使用离屏Canvas进行预渲染
  • 限制重绘区域
  • 减少不必要的图形操作
  • 适当降低帧率

这种实现方式可以创建流畅的水柱动画效果,通过调整参数可获得不同风格的水柱表现。

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

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

节流js实现

节流js实现

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