当前位置:首页 > 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实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式…

js实现百叶窗

js实现百叶窗

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

js实现防洪

js实现防洪

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

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的cur…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…