H5 抽奖页面

news2024/11/28 0:52:11

好久之前就想去写一个这样的示例了,然后就忘了…😵

😀效果

🖇在线链接

https://linyisonger.github.io/H5.Examples/?name=./34.%E6%8A%BD%E5%A5%96%E9%A1%B5%E9%9D%A2.html

🚧 图片可能会丢失,都是在网上随便搜的。

img

📕逻辑

这里使用到了贝塞尔函数,如果不懂可以看看。

💎三钻老师的 https://blog.csdn.net/TriDiamond6/article/details/115438950

这种数学对于我来说太难了,看不是很懂😂。

首先先引用@3r/tool这个包

⚠生产可不要这样去写哦!这种写法可能会导致一些适配问题,我这里是演示,就很随便。

<script type="module">
import { Maths, Randoms, Animation } from "https://gcore.jsdelivr.net/npm/@3r/tool@0.1.0/index.js"
</script>

书写元素位置,这个位置顺序影响着效果中黄框转动的方向,当然你可以使用javascript去循环出来,我比较赖,哈哈哈哈。

<div class="prize-container">
    <div class="prize-item" style="left: 0;top: 0;"></div>
    <div class="prize-item" style="left: 200px;top: 0;"></div>
    <div class="prize-item" style="left: 400px;top: 0;"></div>
    <div class="prize-item" style="left: 400px;top: 200px;"></div>
    <div class="prize-item" style="left: 400px;top: 400px;"></div>
    <div class="prize-item" style="left: 200px;top: 400px;"></div>
    <div class="prize-item" style="left: 0;top: 400px;"></div>
    <div class="prize-item" style="left: 0;top: 200px;"></div>
    <div class="prize-turn" style="left: 200px;top: 200px;">开始转动</div>
</div>

将奖品渲染到页面盒子中去

let prizes = [
    {
        name: '苹果13',
        weight: 1,
        imgSrc: 'https://img10.360buyimg.com/n1/s450x450_jfs/t1/122791/34/35195/31712/63e4d4f8Fc242eca8/e8b37a3c1c707551.jpg'
    },
    {
        name: '兰博基尼5元优惠券',
        weight: 1000,
        imgSrc: 'https://youjia-image.cdn.bcebos.com/modelImage/5567ba4dd1ac4a059511ce1968cf8e31/16233074995453266694.jpg@!watermark_1'
    },
    {
        name: '香港一日游满5000-5券',
        weight: 200,
        imgSrc: 'https://wx4.sinaimg.cn/mw690/0076qYpPgy1hb22ws8hjdj30nw0fydp9.jpg'
    },
    {
        name: '王者荣耀绝美皮肤一套',
        weight: 200,
        imgSrc: 'https://img2.40407.com/upload/202111/09/091448320eecb8dV5D4vrsertjn.jpg'
    },
    {
        name: '鼠标垫',
        weight: 200,
        imgSrc: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2F2020%2F940%2F595%2F17542595049_1110060834.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1678946052&t=f6b6664f8bfb36eee1bfa142f74e6dc5'
    },
    {
        name: '再来一次',
        weight: 100,
        imgSrc: 'https://q.qqbiaoqing.com/q/2017/03/04/33a5791469c29d97fea7e7a96debdf4c.gif'
    },
    {
        name: '吹风机',
        weight: 20,
        imgSrc: 'https://img2.baidu.com/it/u=4244035486,2082281147&fm=253&fmt=auto&app=138&f=JPEG?w=777&h=500'
    },
    {
        name: '扫地机器人',
        weight: 10,
        imgSrc: 'https://img0.baidu.com/it/u=305646170,4023681037&fm=253&fmt=auto&app=120&f=JPEG?w=600&h=433'
    },
]

// 展示效果
for (let i = 0; i < prizeDomList.length; i++) {
    const prizeItem = prizeDomList[i];
    const prizeText = document.createElement('div')
    const prizeImage = document.createElement('img')


    prizeText.textContent = prizes[i].name
    prizeImage.setAttribute("src", prizes[i].imgSrc)

    prizeItem.appendChild(prizeImage)
    prizeItem.appendChild(prizeText)
}

这里通过awaitsetTimeout进行等待,通过循环次数的easeIn的值延迟时间的比例来更改延迟时间*,从而达到从快到慢的过程。

通过奖品权重值的大小来随机出现占比程度,越大越容易出现。

曲线值大于0.9开始索引取余于数组长度是否与结束索引相等的时候,判断是否可以结束。

关于曲线值大于0.9这点儿写的感觉有点随便了,一般写应该是从开始就算好到哪里停的,这点儿我不知道怎么去算,会的可以跟我讲讲,谢谢~

// 等待时间
let waitTime = function (time) {
    return {
        then: function (resolve) {
            setTimeout(resolve, time)
        }
    }
}
// 转动
let turn = async function () {
    let offset = 1 / (prizes.length * 10) // 执行次数
    let interval = 200; // 延迟
    let minInterval = 50; // 最小延迟
    let endIndex = Randoms.getRandomIndexByWeight(prizes) // 随机结束奖品
    let lastDom = null
    for (let i = 0; i <= 1; i += offset) {
        // 延迟时间
        await waitTime(Math.max(Animation.easeIn(i) * interval, minInterval))
        lastDom?.classList?.remove('active');
        lastDom = prizeDomList.item(startIndex % prizeDomList.length)
        lastDom.classList.add('active')
        if (i > .9 && (startIndex % prizeDomList.length === endIndex)) break;
        startIndex++;
    }
    let name = prizes[endIndex].name

    setTimeout(() => {
        if (name == "再来一次")
            alert(`${name}吧~`)
        else
            alert(`您获得了${name}`)
    }, interval);
}

🐎源码

https://github.com/linyisonger/H5.Examples

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大尺度衰落与小尺度衰落

一. 大尺度衰落 无线电磁波信号在收发天线长距离&#xff08;远大于传输波长&#xff09;或长时间范围发生的功率变化&#xff0c;称为大尺度衰落&#xff0c;一般可以用路径损耗模型来描述&#xff0c;路径损耗是由发射功率在空间中的辐射扩散造成的&#xff0c;根据功率传输…

Hadoop开启Yarn的日志监控功能

1.开启JobManager日志 &#xff08;1&#xff09;编辑NameNode配置文件${hadoop_home}/etc/hadoop/yarn-site.xml和mapred-site.xml 编辑yarn-site.xml <!-- Site specific YARN configuration properties --> <configuration><property><name>yarn.…

如何排查网页在哪里发生了内存泄漏?

今天我们来学习用 devtool 的 Performance 和 Memory 工具来找出网页哪里发生了内存泄漏。 Performace 面板 首先我们打开浏览器的 devtool&#xff0c;选择 Performance&#xff08;性能&#xff09;面板&#xff0c;然后将 Memory 选项勾选上。不勾选的话&#xff0c;就不会…

火爆全网的ChatGPT,可以自己上手搭建了。

没有人不知道ChatGPT了吧&#xff1f; ChatGPT&#xff0c;发布于2022年11月30日&#xff0c;来自人工智能研究实验室OpenAI&#xff0c;是一款全新聊天机器人模型&#xff0c;一款人工智能技术驱动的自然语言处理工具。 5天用户破百万&#xff0c;2个月活跃用户破亿。ChatGP…

大学生常用python变量和简单的数据类型、可迭代对象、for循环的3用法

文章目录变量和简单的数据类型下划线开头的对象删除内存中的对象列表与元组debug三酷猫钓鱼记录实际POS机小条打印使用循环找乌龟可迭代对象&#x1f4d7;理解一&#x1f4d8;理解二2️⃣什么是迭代器✔️注意3️⃣迭代器对象4️⃣有关迭代的函数for循环的3用法&#x1f338;I …

C++ 算法主题系列之贪心算法的贪心之术

1. 前言 贪心算法是一种常见算法。是以人性之念的算法&#xff0c;面对众多选择时&#xff0c;总是趋利而行。 因贪心算法以眼前利益为先&#xff0c;故总能保证当前的选择是最好的&#xff0c;但无法时时保证最终的选择是最好的。当然&#xff0c;在局部利益最大化的同时&am…

Seata-Server分布式事务原理加源码 (五) - Seata配置Nacos注册中心和配置中心

Seata配置Nacos注册中心和配置中心 Seata支持注册服务到Nacos&#xff0c;以及支持Seata所有配置放到Nacos配置中心&#xff0c;在Nacos中统一维护&#xff1b; 高可用模式下就需要配合Nacos来完成 具体配置如下 注册中心 Seata-server端配置注册中心&#xff0c;在registr…

【Android学习】下载jar慢和gradle慢的情况

目录 问题出现的原因 解决方法 解决Gradle下载问题&#xff1a;手动安装 解决jar包下载慢问题&#xff1a;更改下载源 问题出现的原因 国内访问谷歌被墙导致访问速度慢或者干脆无法下载 解决方法 解决Gradle下载问题&#xff1a;手动安装 访问官网Gradle | Release Candi…

配置可视化-基于form-render的无代码配置服务(一)

背景 有些业务场景需要产品或运营去配置JSON数据提供给开发去使用&#xff08;后面有实际业务场景的说明&#xff09;&#xff0c;原有的业务流程&#xff0c;非开发人员&#xff08;后面直接以产品指代&#xff09;把数据交给开发&#xff0c;再由开发去更新JSON数据。对于产…

【LeetCode】打家劫舍 III [M](递归)

337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 一、题目 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识…

山东大学2022操作系统期末

接力&#xff1a;山东大学2021操作系统期末 2022—2023山东大学计算机操作系统期末考试回忆版 简答题(4 10 points) &#xff08;1&#xff09;用户态&#xff0c;核心态是什么 &#xff08;2&#xff09;这种区分对现代操作系统的意义 &#xff08;3&#xff09;printf(“…

基于RK3399+STM32+PID的四轴飞行器跟踪与控制系统设计

系统硬件的总体方案设计 要设计一款具有跟踪功能且飞行稳定的四轴飞行器跟踪系统&#xff0c;首先要保证系 统硬件平台的功能稳定。系统各模块具有不同功能&#xff0c;所以需要根据各模块功能与 性能&#xff0c;进行芯片的选取与硬件电路设计&#xff0c;使系统在经济性、生产…

优维低代码:Legacy Templates 构件模板

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 连载…

镜像恒流源电路分析

在改进型差动放大器中&#xff0c;用恒流源取代射极电阻RE&#xff0c;既为差动放大电路设置了合适的静态工作电流&#xff0c;又大大增强了共模负反馈作用&#xff0c;使电路具有了更强的抑制共模信号的能力&#xff0c;且不需要很高的电源电压&#xff0c;所以&#xff0c;恒…

Chatgpt取代客服?取代客服的其实另有其人

近来&#xff0c;一款聊天机器人ChatGPT刷爆全网&#xff0c;这也让不少人发出疑问&#xff1a;人工智能真的能大规模取代人类吗&#xff1f;其实&#xff0c;人工智能在很多行业比如电商、金融、医疗教育和制造业等领域已经有许多尝试和应用&#xff0c;最常见的就是大家在生活…

研报精选230214

目录 【行业230214艾瑞股份】中国增强现实&#xff08;AR&#xff09;行业研究报告【行业230214国信证券】信息安全深度剖析5&#xff1a;密评和信创双催化&#xff0c;密码产业开启从1到N【行业230214民生证券】磁性元器件深度报告&#xff1a;乘新能源之风&#xff0c;磁性元…

【数据结构】基础:图的遍历实现(附C++源代码)

【数据结构】基础&#xff1a;图的遍历实现&#xff08;附C源代码&#xff09; 摘要&#xff1a;将会在数据结构专题中开展关于图论的内容介绍&#xff0c;其中包括四部分&#xff0c;分别为图的概念与实现、图的遍历、图的最小生成树以及图的最短路径问题。本文将介绍图的遍历…

Python实现视频自动打码功能,避免看到羞羞的画面

前言 嗨呀嗨呀&#xff0c;最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就会看到一堆马赛克&#xff0c;由于太好奇了就找了一下原因&#xff0c;结果是因为某艺人塌房了…虽然但是 看综艺的时候满影响美观的 咳咳&#xff0c;这里我可不是来教你们如何解…

卡诺图化简

1.相关概念 最小项&#xff1a;函数的某个乘积项包含了函数的全部变量&#xff08;原变量或反变量的形式&#xff09;&#xff0c;且每个变量仅出现一次&#xff0c;则这个乘积项为该函数的一个标准积项。 最小项中的原变量记为1&#xff0c;反变量记为0&#xff0c;当变量顺序…

C++STL剖析(九)—— unordered_map和unordered_multimap的概念和使用

文章目录1. unordered_map的介绍和使用&#x1f351; unordered_map的构造&#x1f351; unordered_map的使用&#x1f345; insert&#x1f345; operator[ ]&#x1f345; find&#x1f345; erase&#x1f345; size&#x1f345; empty&#x1f345; clear&#x1f345; sw…