<!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');
// 用于记录当前选中的格子索引,初始化为0
let 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>
代码总结注释
-
HTML 结构部分
- 页面的
head
标签内定义了页面的标题、字符编码以及样式相关的CSS
。样式部分主要对抽奖容器(.lottery-container
)、抽奖格子(.lottery-item
)和抽奖按钮(.lottery-button
)进行了样式设置,使得页面呈现出九宫格抽奖的基本外观,抽奖容器使用grid
布局来均匀划分九宫格,每个格子设置了背景色、文字颜色等样式,抽奖按钮设置了大小、颜色、圆角等外观样式。 - 在
body
标签内,首先创建了一个包含九个div
(代表九宫格的格子)的抽奖容器,每个格子里显示了不同的奖品名称(这里简单写为奖品 1 - 奖品 9,实际应用中可替换为真实奖品信息),然后添加了一个id
为lotteryButton
的按钮用于触发抽奖操作。
- 页面的
-
JavaScript 代码部分
- 变量声明与初始化:
- 通过
document.getElementById
和document.querySelectorAll
方法获取到抽奖按钮元素和所有抽奖格子元素,并分别存储在lotteryButton
和lotteryItems
变量中。 - 声明了几个关键变量,
currentIndex
用于记录当前选中的格子索引,初始值设为0
;roundCount
用于记录抽奖转动的圈数,初始值为0
;winningIndex
用来存储随机生成的中奖格子索引;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
获取格子内的文本内容)。
- 首先通过一个
- 变量声明与初始化:
总的来说,这段代码实现了一个简单的九宫格抽奖功能,通过随机选择格子、模拟转动圈数以及判断中奖等逻辑,让用户点击按钮后能参与抽奖并在满足条件时得知中奖结果,同时可以根据实际需求对抽奖的各项参数(如目标圈数范围、格子样式、奖品信息等)进行调整和扩展。