当前位置:首页 > JavaScript

js实现雨滴

2026-03-14 09:40:10JavaScript

实现雨滴效果的JavaScript代码

以下是一个使用HTML5 Canvas和JavaScript实现雨滴效果的完整示例代码:

// 获取Canvas元素和上下文
const canvas = document.getElementById('rainCanvas');
const ctx = canvas.getContext('2d');

// 设置Canvas尺寸为窗口大小
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

// 雨滴对象数组
const drops = [];

// 雨滴构造函数
function Drop() {
  this.x = Math.random() * canvas.width;
  this.y = Math.random() * canvas.height - canvas.height;
  this.z = Math.random() * 0.5 + 0.5;
  this.len = 10 * this.z;
  this.speed = 5 * this.z;
  this.opacity = Math.random() * 0.6 + 0.2;
}

// 初始化雨滴
for (let i = 0; i < 100; i++) {
  drops.push(new Drop());
}

// 绘制雨滴
function draw() {
  // 半透明背景实现拖尾效果
  ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  // 绘制每个雨滴
  drops.forEach(drop => {
    ctx.beginPath();
    ctx.moveTo(drop.x, drop.y);
    ctx.lineTo(drop.x, drop.y + drop.len);
    ctx.strokeStyle = `rgba(174, 194, 224, ${drop.opacity})`;
    ctx.lineWidth = 1 * drop.z;
    ctx.stroke();

    // 更新雨滴位置
    drop.y += drop.speed;
    drop.x += 0.5 * drop.z; // 轻微倾斜效果

    // 雨滴超出屏幕时重置
    if (drop.y > canvas.height) {
      drop.y = Math.random() * -100;
      drop.x = Math.random() * canvas.width;
    }
  });

  requestAnimationFrame(draw);
}

// 处理窗口大小变化
window.addEventListener('resize', () => {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
});

// 开始动画
draw();

HTML结构

<!DOCTYPE html>
<html>
<head>
  <title>雨滴效果</title>
  <style>
    body {
      margin: 0;
      overflow: hidden;
      background: #000;
    }
    canvas {
      display: block;
    }
  </style>
</head>
<body>
  <canvas id="rainCanvas"></canvas>
  <script src="raindrops.js"></script>
</body>
</html>

效果增强选项

  1. 添加溅起效果
    当雨滴到达底部时可以添加小圆圈模拟溅起效果:

    js实现雨滴

    if (drop.y > canvas.height) {
    ctx.beginPath();
    ctx.arc(drop.x, canvas.height, 2 * drop.z, 0, Math.PI * 2);
    ctx.fillStyle = `rgba(174, 194, 224, ${drop.opacity})`;
    ctx.fill();
    drop.y = Math.random() * -100;
    drop.x = Math.random() * canvas.width;
    }
  2. 调整雨滴密度
    修改初始化时的雨滴数量(100)可以控制雨势大小。

  3. 添加闪电效果
    可以随机触发白色闪光模拟闪电:

    js实现雨滴

    
    let lightning = false;

function draw() { if (Math.random() < 0.0005) { lightning = true; setTimeout(() => lightning = false, 100); }

ctx.fillStyle = lightning ? 'rgba(255, 255, 255, 0.9)' : 'rgba(0, 0, 0, 0.05)'; ctx.fillRect(0, 0, canvas.width, canvas.height); // ...其余绘制代码 }



4. 性能优化  
对于大量雨滴(>1000),可以考虑使用WebGL或粒子系统库如three.js来提高性能。

标签: 雨滴js
分享给朋友:

相关文章

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现验证

js实现验证

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

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…