js+css实现红包雨

1.html部分

红包的样子,先写一个模版在页面上

<div class="hide">
      <div class="RedPackage__Box js-RedPackageBox" data-txt>
          <img src="./images/redPackage.png" alt="">
      </div>
</div>

显示红包的容器
<div class="RedPackage__Main js-RedPackage"></div>

2.js部分

const $redPackage = $('.js-RedPackage');
const $redPackageBox = $('.js-RedPackageBox');
const redPackageWidth = $redPackage.width();
const redPackageBoxWidth = $redPackageBox.width();
因为红包有角度旋转的问题,所以需要计算一下,避免旋转之后溢出屏幕
const basePadding = 30;
const maxLeftPx = redPackageWidth - redPackageBoxWidth - basePadding * 2;

每一个红包都是相对于父元素定位,通过z-index来设置层级
let zIndex = 1;

function bindEvent() {
  $redPackage.on('click', '.js-RedPackageBox', function() {
    //拿到每个红包的数据
    const data = $(this).data('txt');
  }
}

生成mix-max的随机数
function getRandom(min, max) {
  return Math.round(Math.random() * (max - min) + min);
}

红包的移动
function redPackageBoxSpeed($el, time) {
  $el.animate(
    {
      top: '130%',
    },
    time * 1000,
    function() {
      $el.remove();
    }
  );
}

生成红包
function createRedPackageNode() {
  const $newNode = $redPackageBox.clone(true);
  红包携带的数据
  const txt = keyList.shift();
  keyList.push(txt);
  $newNode.attr('data-txt', JSON.stringify(txt));
 
  红包随机旋转-30~30度
  $newNode.css({
    'z-index': zIndex++,
    left: getRandom(basePadding, maxLeftPx) + 'px',
    transform: 'rotate(' + getRandom(-30, 30) + 'deg)',
  });
  $redPackage.append($newNode);

  redPackageBoxSpeed($newNode, 4);
}

红包的动态创建
function createRedPackageRain() {
  setInterval(() => {
    createRedPackageNode();
  }, 300);
}

function ready() {
  bindEvent();
  createRedPackageRain();
}

ready();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值