当前位置:首页 > JavaScript

js实现红包雨怎么实现

2026-04-07 06:43:58JavaScript

实现思路

红包雨的核心逻辑包括随机生成红包位置、控制下落动画、点击交互及碰撞检测。通过动态创建DOM元素、CSS动画和事件监听实现。

基本结构

HTML部分只需一个容器用于承载红包元素:

<div id="redpacket-container"></div>

CSS基础样式:

#redpacket-container {
  position: relative;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
}

.redpacket {
  position: absolute;
  width: 60px;
  height: 80px;
  background-image: url('redpacket.png');
  background-size: contain;
  cursor: pointer;
  z-index: 10;
  animation: fall linear;
}

动画关键帧

@keyframes fall {
  to {
    transform: translateY(100vh);
  }
}

JavaScript实现

初始化参数配置:

const config = {
  duration: 3000,  // 动画持续时间(ms)
  spawnInterval: 200,  // 生成间隔(ms)
  maxCount: 50  // 最大同时存在数量
};

红包生成函数:

function createRedPacket() {
  const packet = document.createElement('div');
  packet.className = 'redpacket';
  packet.style.left = `${Math.random() * 100}vw`;
  packet.style.animationDuration = `${config.duration}ms`;

  // 点击事件
  packet.addEventListener('click', () => {
    packet.remove();
    showReward();
  });

  document.getElementById('redpacket-container').appendChild(packet);

  // 动画结束后移除
  packet.addEventListener('animationend', () => {
    packet.remove();
  });
}

奖励展示函数:

function showReward() {
  const rewards = ['1元', '5元', '10元', '谢谢参与'];
  alert(rewards[Math.floor(Math.random() * rewards.length)]);
}

控制生成频率:

let activeCount = 0;

function startRedPacketRain() {
  const timer = setInterval(() => {
    if (activeCount < config.maxCount) {
      createRedPacket();
      activeCount++;
    }
  }, config.spawnInterval);

  // 5秒后停止
  setTimeout(() => {
    clearInterval(timer);
  }, 5000);
}

优化建议

  1. 使用requestAnimationFrame替代CSS动画实现更流畅的效果
  2. 添加碰撞检测避免红包重叠
  3. 实现红包旋转效果增强视觉体验
  4. 使用对象池管理DOM元素提升性能

完整示例可通过监听窗口加载事件启动:

js实现红包雨怎么实现

window.addEventListener('load', startRedPacketRain);

标签: 红包js
分享给朋友:

相关文章

js实现全屏

js实现全屏

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

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…