【vue系列】活动抽奖来一波

1,960 阅读3分钟

历史回顾:

背景

最近有个需求-活动抽奖,比较别扭的是奖品不是9个,12个,而是7个。正面展示所有奖品,其中一个奖品,第9次抽必得,其它的正常抽奖。这个需求本身不难,主要是这是第一次做抽奖,有些未知感。项目上线了,赶紧记录下,方便日后查看。

抽奖实现

第一步:7个奖品的布局

设计要求,第一排展示4个奖品,第二排展示3个奖品,如果给这七个奖品排序从0开始,如下: 0 1 2 3 4 5 6

第二步:抽奖动起来

但是抽奖效果,是顺时针的转动 0,1,2,3,6,5,4。如何保证抽奖的转动顺序呢,🤔? 嗯,这是个好问题。

先通过一个数组用来规定转动顺序 arrNum = [0, 1, 2, 3, 6, 5, 4],初始化转动指针 prizeIndex 默认从0开始。如果定义 prizes 为奖品数组,通过 setInterval 定时切换指针,来展现抽奖动效。需要注意的是当指针位于3时,下个指针需要指到6上,可以通过 prizes[arrNum[prizeIndex]]来保证抽奖的转动顺序。

动效采用 transition

.prize-item {
     // …
      transition: 0.3s;
      transform: scale(1);
      &::before {
	// …
	transition: 0.5s;
        opacity: 0;
      }
}

.chose {
    position: relative;
    &::before {
      transition: 0.1s;
      opacity: 1;
    }
    .prize-item {
      transform: scale(1.5);
    }
  }

第三步:抽中奖品

抽奖可以动起来了,指针如何指到中奖奖品上,突出中奖结果,并终止动画呢? 在抽奖动画开始前,我们先拿到抽奖结果,通过抽奖结果,我可以计算出中奖奖品的元素序列号。当抽奖移动函数,指针和中奖序列号一致时,就 clearInterval,展示抽奖结果。

第四步:抽奖动效优化(由快到慢)

产品不希望抽奖动效是匀速的,希望可以由快到慢,有个扫尾效果。🤔 将动效分为两部分来处理,先快速转,再慢速转。比较简单的解决方案。快速转固定圈数,最后一圈慢速转到中奖奖品上。

小节

本篇没有贴大量代码,主要记录编写活动抽奖的代码思路。提炼了一个DEMO,大家可以参考。

源码地址:https://github.com/habc0807/LuckyDraw/tree/main