JavaScript九宫格随机抽奖示例

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>九宫格抽奖</title><style>/* 全局样式重置 */* {margin: 0;padding: 0;}/* 抽奖容器样式 */.lottery-container {width: 300px;height: 300px;margin: 50px auto;border: 1px solid #ccc;display: grid;grid-template-columns: repeat(3, 1fr);grid-template-rows: repeat(3, 1fr);gap: 5px;background-color: lightgray;}/* 每个格子的样式 */.lottery-item {display: flex;justify-content: center;align-items: center;font-size: 18px;background-color: cadetblue;color: white;}/* 抽奖按钮样式 */.lottery-button {width: 100px;height: 40px;margin: 20px auto;display: block;border: none;border-radius: 5px;background-color: navajowhite;font-size: 16px;cursor: pointer;}</style>
</head><body><div class="lottery-container"><div class="lottery-item">奖品1</div><div class="lottery-item">奖品2</div><div class="lottery-item">奖品3</div><div class="lottery-item">奖品4</div><div class="lottery-item">奖品5</div><div class="lottery-item">奖品6</div><div class="lottery-item">奖品7</div><div class="lottery-item">奖品8</div><div class="lottery-item">奖品9</div></div><button class="lottery-button" id="lotteryButton">开始抽奖</button><script>// 获取抽奖按钮元素const lotteryButton = document.getElementById('lotteryButton');// 获取所有的抽奖格子元素,返回的是一个类数组对象const lotteryItems = document.querySelectorAll('.lottery-item');// 用于记录当前选中的格子索引,初始化为0let currentIndex = 0;// 用于记录抽奖转动的圈数let roundCount = 0;// 随机生成的中奖格子索引let winningIndex;// 本次抽奖目标转动圈数,这里设置为5 - 10圈之间,可根据需求调整let targetRoundCount;// 定时器的引用,用于控制抽奖转动的间隔和停止let timer;// 点击抽奖按钮时触发的函数lotteryButton.addEventListener('click', function () {// 随机生成中奖格子的索引,范围是0到8(对应九宫格的9个格子)winningIndex = Math.floor(Math.random() * lotteryItems.length);// 随机生成目标转动圈数,范围在5 - 10圈targetRoundCount = Math.floor(Math.random() * 6 + 5);// 启动抽奖转动逻辑,通过定时器来控制startLottery();});// 启动抽奖转动的函数function startLottery() {// 设置定时器,每200毫秒执行一次rotateLottery函数,来模拟抽奖转动效果timer = setInterval(rotateLottery, 200);}// 模拟抽奖转动的函数,实现格子的随机变色切换效果function rotateLottery() {// 随机选择下一个要变色显示的格子索引(不按照顺序)let nextIndex;do {nextIndex = Math.floor(Math.random() * lotteryItems.length);} while (nextIndex === currentIndex);// 将当前选中的格子恢复默认颜色(cadetblue)lotteryItems[currentIndex].style.backgroundColor = 'cadetblue';// 更新当前选中的格子索引为新选择的索引currentIndex = nextIndex;// 将新选中的格子设置为高亮颜色(这里设置为黄色,可根据喜好调整)lotteryItems[currentIndex].style.backgroundColor = 'yellow';// 判断是否转完一圈,九宫格转完一圈即每个格子都经过一次选中if (currentIndex === 0) {roundCount++;}// 判断是否达到目标转动圈数if (roundCount >= targetRoundCount) {// 达到目标圈数后,清除定时器,停止抽奖转动clearInterval(timer);// 判断当前选中的格子是否为中奖格子if (currentIndex === winningIndex) {// 如果是中奖格子,弹出提示框告知用户中奖信息alert('🎉恭喜你,中奖的是:' + lotteryItems[currentIndex].innerHTML);}return;}}</script>
</body></html>

代码总结注释

  1. HTML 结构部分

    • 页面的 head 标签内定义了页面的标题、字符编码以及样式相关的 CSS。样式部分主要对抽奖容器(.lottery-container)、抽奖格子(.lottery-item)和抽奖按钮(.lottery-button)进行了样式设置,使得页面呈现出九宫格抽奖的基本外观,抽奖容器使用 grid 布局来均匀划分九宫格,每个格子设置了背景色、文字颜色等样式,抽奖按钮设置了大小、颜色、圆角等外观样式。
    • 在 body 标签内,首先创建了一个包含九个 div(代表九宫格的格子)的抽奖容器,每个格子里显示了不同的奖品名称(这里简单写为奖品 1 - 奖品 9,实际应用中可替换为真实奖品信息),然后添加了一个 id 为 lotteryButton 的按钮用于触发抽奖操作。
  2. JavaScript 代码部分

    • 变量声明与初始化
      • 通过 document.getElementById 和 document.querySelectorAll 方法获取到抽奖按钮元素和所有抽奖格子元素,并分别存储在 lotteryButton 和 lotteryItems 变量中。
      • 声明了几个关键变量,currentIndex 用于记录当前选中的格子索引,初始值设为 0roundCount 用于记录抽奖转动的圈数,初始值为 0winningIndex 用来存储随机生成的中奖格子索引;targetRoundCount 用于设定本次抽奖目标转动的圈数,初始时会在 5 - 10 圈之间随机生成;timer 变量用于保存定时器的引用,方便后续控制定时器的启动、停止等操作。
    • 点击事件处理(lotteryButton.addEventListener('click', function () {...})
      • 当用户点击抽奖按钮时,首先会随机生成中奖格子的索引(通过 Math.floor(Math.random() * lotteryItems.length) 在 0 到格子总数减 1 的范围内生成一个随机整数),这个索引对应着九宫格中的某个格子,也就是中奖的目标格子。
      • 接着随机生成本次抽奖要转动的目标圈数(通过 Math.floor(Math.random() * 6 + 5) 生成一个 5 - 10 之间的随机整数作为圈数),然后调用 startLottery 函数启动抽奖转动逻辑,通过定时器来模拟抽奖过程中格子不断切换变色的效果。
    • 抽奖转动启动函数(startLottery
      • 此函数内部使用 setInterval 方法创建一个定时器,每隔 200 毫秒就会调用一次 rotateLottery 函数,以此来控制抽奖过程中格子的切换频率,实现类似转动的视觉效果,定时器的引用保存在 timer 变量中,方便后续对其进行操作。
    • 抽奖转动逻辑函数(rotateLottery
      • 首先通过一个 do-while 循环随机选择下一个要变色显示的格子索引(确保每次选择的索引与当前索引不同,实现随机切换效果),并将其赋值给 nextIndex 变量。
      • 接着将当前选中的格子(索引为 currentIndex)的背景颜色恢复为默认的 cadetblue(深蓝色),然后更新 currentIndex 为新选择的 nextIndex,并将新选中的格子背景色设置为高亮的 yellow(黄色),通过这种颜色切换来模拟抽奖转动时格子的闪烁效果。
      • 通过判断 currentIndex 是否等于 0 来确定是否转完一圈(因为九宫格是循环的,当回到第一个格子时可认为转完了一圈),如果等于 0,则将 roundCount(记录圈数的变量)自增 1
      • 最后判断 roundCount 是否达到了之前随机生成的 targetRoundCount(目标转动圈数),如果达到了目标圈数,就使用 clearInterval 方法清除定时器,停止抽奖转动,然后判断当前选中的格子(索引为 currentIndex)是否与之前随机生成的中奖格子索引(winningIndex)相等,如果相等,则弹出提示框告知用户中奖信息,显示的内容是对应格子里的奖品名称(通过 lotteryItems[currentIndex].innerHTML 获取格子内的文本内容)。

总的来说,这段代码实现了一个简单的九宫格抽奖功能,通过随机选择格子、模拟转动圈数以及判断中奖等逻辑,让用户点击按钮后能参与抽奖并在满足条件时得知中奖结果,同时可以根据实际需求对抽奖的各项参数(如目标圈数范围、格子样式、奖品信息等)进行调整和扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark-Streaming集成Kafka

Spark Streaming集成Kafka是生产上最多的方式&#xff0c;其中集成Kafka 0.10是较为简单的&#xff0c;即&#xff1a;Kafka分区和Spark分区之间是1:1的对应关系&#xff0c;以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整&#xff0c;下面我们…

启动报错java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus

报错信息图片 日志&#xff1a; Exception in thread "Quartz Scheduler [scheduler]" java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus先说我自己遇到的问题&#xff0c;我们项目在web设置了自定义的log输出路径&#xff0c;多了一个 / 去…

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块&#xff0c;旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项&#xff0c;企业可实现精细化管理&#xff0c;提升运营效…

数据增强的几大方式

1. 随机擦除(Random Erasing) 说明 随机在图像中选取一个矩形区域&#xff0c;将其像素值随机化或设为零&#xff0c;以增加模型对部分缺失信息的鲁棒性。 import numpy as np import cv2def random_erasing(image, sl0.02, sh0.2, r10.3):h, w, _ image.shapearea h * wta…

leecode416.分割等和子集

这道题目看了题解把题目转化为01背包问题才恍然大悟&#xff0c;sum为数组的总和&#xff0c;背包容量为sum/2&#xff0c;价值和背包重量都为nums[i]&#xff0c;由于价值和背包重量都为nums[i]&#xff0c;那么容量为sum/2的背包最多只能获得最大的价值是sum/2&#xff0c;所…

首次下载steam更新速度慢解决方法

下载免费的加速器&#xff0c;在加速器的steam商店加速页面→加速后页面上方的区服选择 &#xff08;香港移动&#xff09;→双箭头→改为登录异常专用→在下部的登录修复进入steam更新 就好了&#xff0c;亲测有效

芯片级IO (Pad) Ring IP Checklist

SoC top顶层数字后端实现都会涉及到IO Ring &#xff08;PAD Ring&#xff09;的设计。这里面包括VDD IO,VDDIO IO, Signal IO, Corner IO&#xff0c;Filler IO&#xff0c;IO power cut cell等等。 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字IC后端实现TOP F…

通过算法识别运行过程中产生的常见缺陷,及时处理,避免运行故障,影响正常作业的智慧快消开源了

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 基于多年的深度…

μC/OS-Ⅱ源码学习(7)---软件定时器

快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) μC/OS-Ⅱ源码学习(3)---事件模型 μC/OS-Ⅱ源码学习(4)---信号量 μC/OS-Ⅱ源码学习(5)---消息队列 μC/OS-Ⅱ源码学习(6)---事件标志组 本文进一…

CRYPTO密码学

加解密算法/编码 编码base家族unicodeASCII哈希算法MD5 Message Digest AlgorithmnSM3SHA-3GBGB18030GB2312GBKutf家族恺撒二进制分区法DSADSSCRC32校验对称非对称gbk编码h264SEA初探smc动态代码保护四方密码曼彻斯特编码剖析基本概念什么是编码?什么是加密与解密寻找银弹-有没…

【前端】深入探讨 JavaScript 的 reduce() 方法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是 reduce() 方法&#xff1f;定义与核心概念语法结构参数解析返回值 &#x1f4af;基础用法与示例示例 1&#xff1a;计算数组元素的和解析 示例 2&#xff1a;统计…

postman关联接口用于登录(验证码会变情况)

目录 一、介绍 二、操作步骤 (一)Fiddler抓取到登录信息 (二)postman发送请求 新建请求一&#xff1a;登录值请求 (三)易变值赋值固定住 新建请求二&#xff1a;易变值验证码(uuid)请求 切换到请求一里面进行赋值绑定 一、介绍 接口有两种形式&#xff0c;一种是单…

SSC338Q SigmaStar 摄像头主控芯片

SSC338Q 是一款由 SigmaStar&#xff08;星宸科技&#xff09;推出的高集成度多媒体系统级芯片&#xff08;SoC&#xff09;&#xff0c;广泛应用于高分辨率智能视频录制设备&#xff0c;如 IP 摄像机、车载摄像机和 USB 摄像机。 处理器&#xff1a; CPU&#xff1a;32 位双…

苹果将推出超薄和折叠款iPhone,2024年带来哪些变化?

苹果公司&#xff08;AAPL&#xff09;近日宣布&#xff0c;将对其iPhone系列进行重大升级&#xff0c;以应对当前市场中的销量压力。这一改变&#xff0c;或许会为苹果带来新的增长动力。那么&#xff0c;苹果的2024年新iPhone究竟有哪些亮点呢&#xff1f;下面我们来详细了解…

QML 粒子模拟

粒子模拟 粒子模拟 粒子模拟的核心是粒子系统&#xff08;ParticleSystem&#xff09;, 它控制共享时间线。一个粒子使用发射器元素&#xff08;Emitter&#xff09;发射&#xff0c; 使用粒子画笔&#xff08;ParticlePainter&#xff09;实现可视化&#xff0c; 它可以是一张…

Java中的Consumer接口应该如何使用(通俗易懂图解)

应用场景&#xff1a; 第一次程序员A写好了个基础的遍历方法&#xff1a; public class Demo1 {public static void main(String[] args) {//假设main方法为程序员B写的,此时需要去调用A写好的一个遍历方法//1.如果此时B突然发现想将字符串以小写的形式打印出来&#xff0c;则…

WPF+MVVM案例实战与特效(四十四)- WPF多语言支持全解析:轻松实现国际化应用

文章目录 1、引言2、案例效果3、准备工作1、创建项目结构2、代码实现1、语言资源2、资源引用3、页面功能4、实现效果3、总结1、引言 在当今全球化的背景下,开发一个多语言支持的应用程序变得越来越重要。WPF提供了强大的功能来实现应用程序的国际化和本地化。本文将详细介绍如…

Java爬虫大冒险:如何征服1688商品搜索之巅

在这个信息爆炸的时代&#xff0c;数据就是力量。对于电商平台而言&#xff0c;数据更是金矿。今天&#xff0c;我们要踏上一场Java爬虫的冒险之旅&#xff0c;目标是征服1688这个B2B电商巨头&#xff0c;获取按关键字搜索的商品信息。这不仅是技术的挑战&#xff0c;更是智慧的…

《Django 5 By Example》读后感

一、 为什么选择这本书&#xff1f; 本人的工作方向为Python Web方向&#xff0c;想了解下今年该方向有哪些新书出版&#xff0c;遂上packt出版社网站上看了看&#xff0c;发现这本书出版时间比较新(2024年9月)&#xff0c;那就它了。 从2024年11月11日至2024年12月18日期间&…

TouchGFX移植(3)增加SDRAM驱动

一&#xff09;SDRAM驱动增加到工程中 1&#xff09;加入驱动sdram.c文件&#xff0c;文件在上节课里有源代码。 2&#xff09;在fmc.c文件里指定位置增加代码 SDRAM_Init();另外需要包含文件&#xff1a;#include “sdram.h” /* USER CODE BEGIN 0 / #include “sdram.h” …