「兔了个兔」——兔年抽大奖

1,441 阅读2分钟

我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛

开篇

今天是元宵节了,先祝大家元宵佳节,团团圆圆!左右逢"圆",广进财源!人缘福缘,"圆圆"不断!今天也是幸运抽奖满6000的时候,结果好巧不巧抽到了个口罩,淦,我这一个月的签到矿石就换了个口罩,人都麻了。于是乎,我准备复现一下这个抽奖,放点大奖,安慰一下自己。

首先,依然是放一下效果图。

num.gif

附上码上掘金的调试源码:

下面开始实现它

思路

先是得把布局给搞出来,一看这些小格子整整齐齐的,九宫格一样,当然得用flex了,顺便在上面加个标题,下面加个中奖栏。样式的话就看自己的个人喜好了,随便改。抽奖逻辑就是,先预先设置一个active类,然后设个定时器,间隔一定时间给格子加上这个属性,并给其他盒子去掉这个属性,最后删除定时器就好了。原理是这样,接下来就是实现了。

实现过程

HTML

这个很简单,就基本布局

<div id="info">V我5块,在线抽奖,童叟无欺</div>
    <div id="award">中奖栏:</div>
    <div class="ul">
      <li class="li1">兔飞猛进</li>
      <li class="li2">前兔似锦</li>
      <li class="li3">大展宏兔</li>
      <li class="li8">兔步青云</li>
      <li id="start">抽奖</li>
      <li class="li4">扬眉兔气</li>
      <li class="li7">兔出贡献</li>
      <li class="li6">谈兔不凡</li>
      <li class="li5">兔谋大业</li>
    </div>

CSS

布局的话也没啥好说的,就是常用的flex布局,相信大家一眼就知道了

.ul {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  width: 400px;
  height: 380px;
  position: relative;
  left: 50%;
  top: 50%;
  transform: translate(-50%, 50%);
}

.ul li.active {
  background: rgb(255, 153, 0);
  color: #ffffff;
}

JS

先设置好几个全局变量,然后随机数出来一个移动步数,然后设置定时器递归动画,当超过步数的时候暂停并清除定时器重置全局变量,把该li里得内容放到中奖栏里面。

let rollTime; 
let time = 0; 
let speed = 300; 
let times; 
let num = 0;

$("#start").on("click", function () {
  $("#award").text("中奖栏:"); 
  times = parseInt(Math.random() * (20 - 30 + 1) + 20, 10); 
  rolling();
});

function rolling() {
  time++; 
  num++;
  num > 8? num = 1: num;
  clearTimeout(rollTime);
  rollTime = setTimeout(() => {
    window.requestAnimationFrame(rolling); 
  }, speed);
  $('.li' + num).addClass('active').siblings().removeClass('active')
  if (time > times) {
    clearInterval(rollTime);
    $('#award').text('中奖栏:祝您' + $('.li' + num).text() + '~')
    num = 0;
    time = 0;
    return;
  }
}

到此,兔年抽大奖就基本完成了。

我也同步在码上掘金上发布了这个代码,喜欢的话可以去看看。code.juejin.cn/pen/7196506…

最后,一个小请求,麻烦各位看官动动手指点个赞吧!!!