【SSD】掘金的抽奖,“拆穿她“,然后实现一个,顺便封装一个库

简介: 常见表现形式常见的抽奖表现有两种,九宫格和转盘,转盘又有转动指针和转动转盘两种。 从实现难度上来说, 转盘大于九宫格。

4.JPG


前言


关于关于【SSD系列】


前端一些有意思的内容,旨在3-10分钟里, 500-1500字,有所获,又不为所累。


效果演示


PC端


1.JPG


模拟移动端


2.JPG


源码



luckDraw 源码

  1. 包含封装库
  2. 包含UI


抽奖简析


抽奖嘛,简单说就是障眼法。 前前后后的动画都是增强一些体验,寻求一点刺激罢了,幻想自己能成为那个大奖获得者。


常见表现形式


常见的抽奖表现有两种,九宫格转盘,转盘又有转动指针转动转盘两种。 从实现难度上来说, 转盘大于九宫格。


一般的实现方式


  1. 九宫格
    间隔的设置背景色或者蒙层,越往后间隔越大。


  1. 转盘
  1. 纯脚本控制:每个一段时间,转动转盘或者指针,越往后,转动越少。
  2. css动画: 提前计算旋转角度好,配合css3, 利用好贝塞尔函数,梭哈。


一般逻辑处理


  1. 动画先行
    就是先执行动画,期间去获取结果,然后决定定格在何处。


  1. 结果先行
    先获取结果,然后启动动画。


掘金站点技术浅析


这里就客串分析下掘金的技术栈,推荐一款 BuiltWith Technology Profiler的chrome创建,其能分析出网站的采用哪些技术构建。 我们一看看看掘金的。


1.JPG

看看DOm节点熟悉的__nuxtdata-v, 还真是那么回事。 3.JPG


掘金抽奖简析


掘金的抽奖属于典型的九宫格,中间是抽奖的按钮。


布局


典型的flex布局,九个格子,九个turntable-itemdiv,抽奖按钮采用单独的lottery样式标记。


5.JPG


动画先行还是结果先行?


抽奖接口是https://api.juejin.cn/growth_api/v1/lottery/draw,我们打开控制面板, Network板块,输入draw过滤请请求。

执行一次,然后block抽奖请求。

6.JPG


再次执行,可以明显的看到先执行了动画,所以我推断是动画先行,至于真相,他重要吗?不重要,反正我也抽不中!!!!!!


7.JPG


实现思路


我们采用动画先行方案,先启动动画,中途请求结果,得到结果后,执行命中动画。


基本思路


1. 编号


0-n个坑位,九宫格的话,就是0-7个坑位,坑位的东西可以重复。


8.JPG


2.启动动画


匀速的切换格子,同时请求服务接口。


3. 中奖动画


收到结果后,计算出命中奖品的编号,并执行减速逻辑。


分离逻辑


基本思路就是这样子的,为了通用性,我们需要多思考一些,抽奖重要的是逻辑,表面的形式重要吗? 其实并不太重要,所以我们这里把抽奖逻辑封装,提供可变性,并对外提供事件通知。


可变性


可变性一般是通过参数和对外暴露方法来实现的,我们也不例外。


  1. 格子数,不仅仅是九宫格,10宫格,12宫格都支持
  2. 起始位置,不一定是从0开始
  3. 起始的时间间隔,之后会越来越慢
  4. 至少转动的次数, 如果接口太快,可能感觉没开始就结束了。
  5. 得到结果后,我们的减速动画逻辑,应该是内置,同时可以被覆写。


事件通知


整个过程可能存在的事件:


  1. onStart: // 当开始
  2. onUpdate: // 旋转一次
  3. onEnded: // 结束
  4. onError: // 异常


我们把这些整个起来, 大概就是这个样子了,都很简单。


var defaultOption = {
        startIndex: 0, // 初始位置
        pits: 8,  // 格子数
        interval: 100, // 初始间隔
        rate: 2.5,  // 系数
        cycle: 5,  //转动基本次数:即至少需要转动多少次再进入抽奖环节
        getInterval: null // 自定义旋转间隔函数
        //onStart: null, // 当开始
        //onUpdate: null, // 旋转一次
        //onEnded: null,  // 结束
        //onError: null  // 异常, 比如转动次数已经达到设定值, 但是没有设置奖项
    };
复制代码


使用代码



工具方法


先封装两个添加方法,一个添加选中的class,一个删除选中的class。


function removeChosenClass() {
    var el = lotteryEl.querySelector('.turntable-item.chosen');
    if (el) {
        el.classList.remove('chosen');
    }
}
function addChosenClass(index){
    lotteryEl.querySelector('.turntable-item.turntable-item-' + index).classList.add('chosen');
}
复制代码


实例化


Lottery是我们封装的逻辑类。


var options = {
};
var lottery = new Lottery(options);
复制代码


注册启动事件和模拟中奖


4号坑位是大奖


var btnStart = document.querySelector(".turntable-box .turntable-item.lottery");
btnStart.addEventListener('click', function () {
    lottery.start();
    setTimeout(() => {
        setPrize();
    }, 800)
})
function setPrize() {
    lottery.setPrize([4]) // 4号坑位是大奖
}
复制代码


监听抽奖事件


lottery.onUpdate = function (ins, index, times) {
    removeChosenClass();
    addChosenClass(index);
}
lottery.onEnded = function (ins, index, prizeIndexes) {
    removeChosenClass();
    addChosenClass(index);
    setTimeout(function () {
        dialogEl.classList.remove("hide");
    }, 500)
}
复制代码


到此为止,使用代码完毕,与框架无关。


逻辑库封装


逻辑库的完整代码位于 抽奖逻辑Lottery.js , 我就不全贴出来,不然违背我500-1500字的原则了,就贴一张简单的属性图吧。


1.JPG


小结


是不是很简单,一切都看起来没那么难。


写在最后


不忘初衷,【SSD系列】,3-5分钟,500-1000字,有所得,而不为所累,如果你觉得不错,你的一赞一评就是我前行的最大动力。


相关文章
|
SQL Perl
PL/SQL Developer 注册机+汉化包+用户指南
PL/SQL Developer 注册机+汉化包+用户指南
238 0
|
消息中间件 NoSQL Java
300+页!卷王级别Java面试宝典-阿里服务端开发与面试知识手册!
金九银十,市场火热,但是大家就业压力却没有缓解多少。 我自己也有实感,多年身处一线互联网公司,虽没有直面过求职跳槽的残酷,但经常担任技术面试考官,对程序员招聘市场的现状很清楚。
348 0
|
5月前
|
区块链
小试牛刀-区块链Solana多签账户
在 Solana 区块链中,多签账户(Multisig Account)是一种智能合约账户,允许多个签名者共同管理和控制账户上的资产或操作。这种机制增强了账户的安全性和灵活性,特别适用于需要多个权限共同批准的操作场景,如资产管理、资金转移、或项目治理。
239 1
|
4月前
|
消息中间件 缓存 Java
医院信息系统(HIS)的开发架构解析,代码示例
医院信息系统(HIS)是现代医院的核心,其架构设计直接影响系统稳定性、扩展性与用户体验。本文解析HIS架构演进历程,从单机、C/S、B/S到微服务与云原生架构,结合代码示例,深入讲解现代HIS系统的分层架构、核心模块与关键技术实践。
1071 1
|
6月前
|
Oracle 关系型数据库 数据库
Activiti 7建表语句及注释
本文提供了Activiti工作流引擎的数据库表结构,适用于Oracle和DM数据库。包含运行时与历史数据表的设计及字段注释,涵盖流程定义、实例、任务、变量、事件监听、附件、意见等核心功能模块。通过这些表结构,可以全面管理流程生命周期中的各类数据。
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
机器学习/深度学习 人工智能 自然语言处理
PVG:用小模型验证大模型输出,解决“黑盒”难题
【8月更文挑战第4天】随AI技术的发展,机器学习系统广泛应用,但在高风险领域如医疗和金融中,其决策需可验证与解释。为此,提出了“Prover-Verifier Games”(PVG)框架,通过两个学习者——证明者与验证者的博弈,前者提供决策及证据,后者评估证据真伪并做决策,以此提升决策透明度。实验显示,在图像分类和自然语言推理任务中,验证者能有效区分真假证据,即便证明者提供虚假信息。不过,PVG也面临计算成本高和适用范围有限等问题。
423 1
|
存储 算法 数据挖掘
向量数据库技术分享
向量数据库主要用于支持高效的向量检索场景(以图搜图、以文搜图等),通过本次培训可以掌握向量数据库的核心理论以及两种向量索引技术的特点、场景与算法原理,并通过实战案例掌握向量数据库的应用与性能优化策略。
1659 3
|
C++ Windows
C++ --- Dll文件的生成与调用(二)之动态库注入技术
C++ --- Dll文件的生成与调用(二)之动态库注入技术
359 0
|
SQL 关系型数据库 MySQL
必知的 MySQL 索引失效场景【包括实践验证】,别再踩坑了!(上)
必知的 MySQL 索引失效场景【包括实践验证】,别再踩坑了!
1667 2