原生javascript实现老.虎机抽奖点名demo源码思路解析

想着使用原生Javascript做一个随机点名的小应用,

也可以做抽奖使用。

html简单化,人名单可以通过js生成并处理。

可以非常随意的添加修改人名字。

应用想带点特效,比如老.虎机转动的特效。

思路入下:

借鉴模板引擎的思想,在页面中添加一个指定ID的script标签,我们可以在任意文本中将提前准备好的人名单复制进来并添加注释。

利用正则处理空白字符,把所有人名添加到数组当中,再删除该script节点,在这里我们只讨论名字为两个字或者三个字的。

遍历数组,此时数组的每一项是一个人名,有两个字的和三个字的。

对数组的每一项进行split操作,使得每一个名字变成一个数组。

接下来处理长度只有2(名字是两个字)的数组,把数组【0】个之后添加一个空字符串,使得所有的姓名数组长度都为3。

点击按钮,开始按钮文字更改‘停止,先执行函数randomName随机出一个姓名【‘1’,‘2’,‘3’】放在对应的三个展示框中。

展示框同时开始滚动,展示框的高度为300px。

开启定时器,在定时器内进行检测,当前的top值余300如果等于-290,说明再往上滚动10当前最后一个姓名就展示完了。

此时需要继续在后面借着生成姓名追加到三个展示框内,所以此时应该执行randomName函数。

当点击停止口,停止按钮的文字变成请稍后,此时需要做一个老.虎机结束,滚动减慢最后确定一个姓名的函数。

清楚上一个定时器,重新开始一个定时器。

定义一个变量,确定此时老.虎机慢速度转几个停下。

k = i - 900 - (300 + i % 300);

i%300 计算的是 当前正在滚动出去的这个姓名还差多少px完整滚动出去。

300 + i % 300 计算的是当前正在滚动进来的姓名还差多少px完整显示出来。

900 是一个可更改的值,值为300的倍数,在这里赋值计算的是点击停止后再 滚动900/300个姓名停下。

i - 900 - (300 + i % 300)计算的就是点击停止后,需要再滚动多少px。

再新的慢速定时器中继续执行randomName函数,继续生成姓名并追加。

判断,当top值等于k时,清除定时器,为了保证准确性,需要最后再次赋值top值等于 k 或 i。

因为在定时器中i -= 5,可能会产生微小误差。

下面上源码:

0<!DOCTYPE html>
1<html >
2
3<head>
4<meta charset="UTF-8">
5<title>点名系统v1.1</title>
6<style>
7* {
8margin: 0;
9padding: 0;
10}
11
12body {
13background-color: #000;
14overflow: hidden;
15}
16
17ul {
18list-style: none;
19}
20input{
21outline-style: none;
22}
23.max {
24width: 1000px;
25height: 300px;
26font-size: 30px;
27font-weight: 0;
28cursor: pointer;
29margin: 50px auto 0;
30border-top: 1px solid green;
31border-bottom: 1px solid green;
32box-sizing: border-box;
33position: relative;
34transition: all 0.5s;
35}
36
37.max:hover {
38font-size: 40px;
39font-weight: bold;
40}
41
42#box,
43#box1,
44#box2 {
45width: 300px;
46height: 300px;
47font-family: "微软雅黑";
48line-height: 300px;
49text-align: center;
50overflow: hidden;
51position: absolute;
52top: -1px;
53}
54
55#box li,
56#box1 li,
57#box2 li {
58width: 300px;
59height: 300px;
60box-sizing: border-box;
61color: #fff;
62font-family: "微软雅黑";
63line-height: 300px;
64text-align: center;
65overflow: hidden;
66float: left;
67background-color: rgba(0, 0, 0, 0);
68border: 1px solid green;
69box-sizing: border-box;
70margin: 0;
71}
72
73#box {
74left: 0;
75}
76
77#box1 {
78left: 350px;
79}
80
81#box2 {
82right: 0;
83}
84
85#box ul,
86#box1 ul,
87#box2 ul {
88position: absolute;
89left: 0;
90top: 0;
91}
92
93#btn {
94width: 200px;
95height: 60px;
96display: block;
97text-decoration: none;
98border: 1px solid #eee;
99border-radius: 30px;
100line-height: 60px;
101text-align: center;
102color: #eee;
103font-family: "微软雅黑";
104font-size: 18px;
105margin: 0 auto 100px;
106transition: all 1s;
107}
108
109#btn:hover {
110width: 1000px;
111border-color: green;
112color: green;
113}
114
115p {
116color: green;
117font-size: 12px;
118text-align: center;
119line-height: 16px;
120}
121
122#sp {
123display: block;
124width: 1000px;
125height: 100px;
126font-size: 6px;
127font-family: "微软雅黑";
128margin: 0 auto;
129line-height: 100px;
130text-align: center;
131color: green;
132animation: myfirst 0.5s paused forwards;
133}
134
135@keyframes myfirst {
136from {
137bfont-size: 16px;
138}
139to {
140font-size: 30px;
141}
142}
143</style>
144</head>
145<body>
146<div class="max">
147<div >
148<ul>
149<li>攻城狮,</li>
150</ul>
151</div>
152<div >
153<ul>
154<li>ready?</li>
155</ul>
156</div>
157<div >
158<ul>
159<li>go!</li>
160</ul>
161</div>
162</div>
163<span ></span>
164<a href="javascript:void(0)" >开始</a>
165<p>说明:将任意名单复制粘贴到页面id为names的标签内添加注释,即可开始随机点名!</p>
166<p color: rgba(51, 102, 153, 1)">color:#000">作者:陈晨</p>
167</body>
168<script >
169/*
170张孝梅 陈惠芳 翟英祥 催渊 涂新昭 罗平益 谢韶光 杨凯 李佳佳 刘轲轲 杨红哲 张荣秋 王小策 费伊蒙 杜程 李杰 周曼 孔德晨 池远哲 李娜 张雪 张钧 杜东阳 刘冲冲 刘硕 袁冬 孙守鑫 殷昊 孙红厚 高全
171*/
172</script>
173<script>
174var sp = document.getElementById('sp'),
175box = document.getElementById('box'),
176box1 = document.getElementById('box1'),
177box2 = document.getElementById('box2'),
178ul = box.getElementsByTagName('ul')[0],
179ul1 = box1.getElementsByTagName('ul')[0],
180ul2 = box2.getElementsByTagName('ul')[0],
181lis = ul.getElementsByTagName('li'),
182lis1 = ul1.getElementsByTagName('li'),
183lis2 = ul2.getElementsByTagName('li'),
184btn = document.getElementById('btn'),
185names = document.getElementById('names').innerHTML,
186Rnam1 = /^\s{0,}\/\*\s{0,}|\s{0,}\*\/\s{0,}$/g,
187Rnam2 = /\s{1,}/g,
188names = names.replace(Rnam1, ""),
189names = names.replace(Rnam2, ","),
190nameArr = names.split(","),
191timer = null,
192timerFalse = null,
193flag = true,
194i = 0,
195randoma,li, li1, li2,k,one,two,three;
196console.log(nameArr);
197document.getElementById('names').parentNode.removeChild(document.getElementById('names'));
198for (var j = 0; j < nameArr.length; j++) {
199nameArr[j] = nameArr[j].split('');
200if (nameArr[j].length != 3) {
201nameArr[j].splice(1, 0, '_');
202}
203}
204btn.addEventListener('click', function() {
205if (flag == true && btn.innerHTML == '开始') {
206flag = false;
207btn.innerHTML = '停止';
208sp.innerHTML = '';
209sp.style.animation = 'none';
210randomName();
211timer = setInterval(play, 5);
212
213function play() {
214if (i % 300 == -290) {
215randomName();
216}
217ul.style.top = i + 'px';
218ul1.style.top = i + 'px';
219ul2.style.top = i + 'px';
220i -= 5;
221}
222} else {
223clearInterval(timer);
224if (btn.innerHTML == '停止') {
225btn.innerHTML = '请稍后……';
226timerFalse = setInterval(stop, 30);
227}
228k = i - 900 - (300 + (i % 300));
229
230function stop() {
231if (i != k) {
232if (i % 300 == -290) {
233randomName();
234}
235ul.style.top = i + 'px';
236ul1.style.top = i + 'px';
237ul2.style.top = i + 'px';
238i -= 5;
239} else {
240ul.style.top = i + 'px';
241ul1.style.top = i + 'px';
242ul2.style.top = i + 'px';
243btn.innerHTML = '开始';
244flag = true;
245clearInterval(timerFalse);
246var two = lis1[Math.abs(i / 300)].innerHTML;
247if (two == "_") {
248two = '';
249}
250sp.innerHTML = '让我们有请<span color: rgba(51, 102, 153, 1)">color:red;">' + lis[Math.abs(i / 300)].innerHTML + two + lis2[Math.abs(i / 300)].innerHTML + '</span>同学发表个人意见';
251one = lis[Math.abs(i / 300)].cloneNode(true);
252two = lis1[Math.abs(i / 300)].cloneNode(true);
253three = lis2[Math.abs(i / 300)].cloneNode(true);
254ul.innerHTML = ul1.innerHTML = ul2.innerHTML = '';
255ul.style.top = ul1.style.top = ul2.style.top = '0';
256i = 0;
257ul.appendChild(one);
258ul1.appendChild(two);
259ul2.appendChild(three);
260sp.style.animation = 'myfirst 0.5s running forwards';
261}
262}
263}
264})
265
266function randomName() {
267li = document.createElement('li');
268li1 = document.createElement('li');
269li2 = document.createElement('li');
270randoma = parseInt(Math.random() * nameArr.length);
271li.innerHTML = nameArr[randoma][0];
272li1.innerHTML = nameArr[randoma][1];
273li2.innerHTML = nameArr[randoma][2];
274ul.appendChild(li);
275ul1.appendChild(li1);
276ul2.appendChild(li2);
277}
278</script>
279
280</html>
281

点击在线运行老.虎机

结合源码再看一遍我的思路,相信大家就很清楚了,如果还有不清楚的或者有更好的意见,欢迎留言讨论。

原文链接-摘自大公爵ddamy.com