原生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 lang="en"> |
2 | |
3 | <head> |
4 | <meta charset="UTF-8"> |
5 | <title>点名系统v1.1</title> |
6 | <style> |
7 | * { |
8 | margin: 0; |
9 | padding: 0; |
10 | } |
11 | |
12 | body { |
13 | background-color: #000; |
14 | overflow: hidden; |
15 | } |
16 | |
17 | ul { |
18 | list-style: none; |
19 | } |
20 | input{ |
21 | outline-style: none; |
22 | } |
23 | .max { |
24 | width: 1000px; |
25 | height: 300px; |
26 | font-size: 30px; |
27 | font-weight: 0; |
28 | cursor: pointer; |
29 | margin: 50px auto 0; |
30 | border-top: 1px solid green; |
31 | border-bottom: 1px solid green; |
32 | box-sizing: border-box; |
33 | position: relative; |
34 | transition: all 0.5s; |
35 | } |
36 | |
37 | .max:hover { |
38 | font-size: 40px; |
39 | font-weight: bold; |
40 | } |
41 | |
42 | #box, |
43 | #box1, |
44 | #box2 { |
45 | width: 300px; |
46 | height: 300px; |
47 | font-family: "微软雅黑"; |
48 | line-height: 300px; |
49 | text-align: center; |
50 | overflow: hidden; |
51 | position: absolute; |
52 | top: -1px; |
53 | } |
54 | |
55 | #box li, |
56 | #box1 li, |
57 | #box2 li { |
58 | width: 300px; |
59 | height: 300px; |
60 | box-sizing: border-box; |
61 | color: #fff; |
62 | font-family: "微软雅黑"; |
63 | line-height: 300px; |
64 | text-align: center; |
65 | overflow: hidden; |
66 | float: left; |
67 | background-color: rgba(0, 0, 0, 0); |
68 | border: 1px solid green; |
69 | box-sizing: border-box; |
70 | margin: 0; |
71 | } |
72 | |
73 | #box { |
74 | left: 0; |
75 | } |
76 | |
77 | #box1 { |
78 | left: 350px; |
79 | } |
80 | |
81 | #box2 { |
82 | right: 0; |
83 | } |
84 | |
85 | #box ul, |
86 | #box1 ul, |
87 | #box2 ul { |
88 | position: absolute; |
89 | left: 0; |
90 | top: 0; |
91 | } |
92 | |
93 | #btn { |
94 | width: 200px; |
95 | height: 60px; |
96 | display: block; |
97 | text-decoration: none; |
98 | border: 1px solid #eee; |
99 | border-radius: 30px; |
100 | line-height: 60px; |
101 | text-align: center; |
102 | color: #eee; |
103 | font-family: "微软雅黑"; |
104 | font-size: 18px; |
105 | margin: 0 auto 100px; |
106 | transition: all 1s; |
107 | } |
108 | |
109 | #btn:hover { |
110 | width: 1000px; |
111 | border-color: green; |
112 | color: green; |
113 | } |
114 | |
115 | p { |
116 | color: green; |
117 | font-size: 12px; |
118 | text-align: center; |
119 | line-height: 16px; |
120 | } |
121 | |
122 | #sp { |
123 | display: block; |
124 | width: 1000px; |
125 | height: 100px; |
126 | font-size: 6px; |
127 | font-family: "微软雅黑"; |
128 | margin: 0 auto; |
129 | line-height: 100px; |
130 | text-align: center; |
131 | color: green; |
132 | animation: myfirst 0.5s paused forwards; |
133 | } |
134 | |
135 | @keyframes myfirst { |
136 | from { |
137 | bfont-size: 16px; |
138 | } |
139 | to { |
140 | font-size: 30px; |
141 | } |
142 | } |
143 | </style> |
144 | </head> |
145 | <body> |
146 | <div class="max"> |
147 | <div id="box"> |
148 | <ul> |
149 | <li>攻城狮,</li> |
150 | </ul> |
151 | </div> |
152 | <div id="box1"> |
153 | <ul> |
154 | <li>ready?</li> |
155 | </ul> |
156 | </div> |
157 | <div id="box2"> |
158 | <ul> |
159 | <li>go!</li> |
160 | </ul> |
161 | </div> |
162 | </div> |
163 | <span id="sp"></span> |
164 | <a href="javascript:void(0)" id="btn">开始</a> |
165 | <p>说明:将任意名单复制粘贴到页面id为names的标签内添加注释,即可开始随机点名!</p> |
166 | <p style="color:#000">作者:陈晨</p> |
167 | </body> |
168 | <script id="names"> |
169 | /* |
170 | 张孝梅 陈惠芳 翟英祥 催渊 涂新昭 罗平益 谢韶光 杨凯 李佳佳 刘轲轲 杨红哲 张荣秋 王小策 费伊蒙 杜程 李杰 周曼 孔德晨 池远哲 李娜 张雪 张钧 杜东阳 刘冲冲 刘硕 袁冬 孙守鑫 殷昊 孙红厚 高全 |
171 | */ |
172 | </script> |
173 | <script> |
174 | var sp = document.getElementById('sp'), |
175 | box = document.getElementById('box'), |
176 | box1 = document.getElementById('box1'), |
177 | box2 = document.getElementById('box2'), |
178 | ul = box.getElementsByTagName('ul')[0], |
179 | ul1 = box1.getElementsByTagName('ul')[0], |
180 | ul2 = box2.getElementsByTagName('ul')[0], |
181 | lis = ul.getElementsByTagName('li'), |
182 | lis1 = ul1.getElementsByTagName('li'), |
183 | lis2 = ul2.getElementsByTagName('li'), |
184 | btn = document.getElementById('btn'), |
185 | names = document.getElementById('names').innerHTML, |
186 | Rnam1 = /^\s{0,}\/\*\s{0,}|\s{0,}\*\/\s{0,}$/g, |
187 | Rnam2 = /\s{1,}/g, |
188 | names = names.replace(Rnam1, ""), |
189 | names = names.replace(Rnam2, ","), |
190 | nameArr = names.split(","), |
191 | timer = null, |
192 | timerFalse = null, |
193 | flag = true, |
194 | i = 0, |
195 | randoma,li, li1, li2,k,one,two,three; |
196 | console.log(nameArr); |
197 | document.getElementById('names').parentNode.removeChild(document.getElementById('names')); |
198 | for (var j = 0; j < nameArr.length; j++) { |
199 | nameArr[j] = nameArr[j].split(''); |
200 | if (nameArr[j].length != 3) { |
201 | nameArr[j].splice(1, 0, '_'); |
202 | } |
203 | } |
204 | btn.addEventListener('click', function() { |
205 | if (flag == true && btn.innerHTML == '开始') { |
206 | flag = false; |
207 | btn.innerHTML = '停止'; |
208 | sp.innerHTML = ''; |
209 | sp.style.animation = 'none'; |
210 | randomName(); |
211 | timer = setInterval(play, 5); |
212 | |
213 | function play() { |
214 | if (i % 300 == -290) { |
215 | randomName(); |
216 | } |
217 | ul.style.top = i + 'px'; |
218 | ul1.style.top = i + 'px'; |
219 | ul2.style.top = i + 'px'; |
220 | i -= 5; |
221 | } |
222 | } else { |
223 | clearInterval(timer); |
224 | if (btn.innerHTML == '停止') { |
225 | btn.innerHTML = '请稍后……'; |
226 | timerFalse = setInterval(stop, 30); |
227 | } |
228 | k = i - 900 - (300 + (i % 300)); |
229 | |
230 | function stop() { |
231 | if (i != k) { |
232 | if (i % 300 == -290) { |
233 | randomName(); |
234 | } |
235 | ul.style.top = i + 'px'; |
236 | ul1.style.top = i + 'px'; |
237 | ul2.style.top = i + 'px'; |
238 | i -= 5; |
239 | } else { |
240 | ul.style.top = i + 'px'; |
241 | ul1.style.top = i + 'px'; |
242 | ul2.style.top = i + 'px'; |
243 | btn.innerHTML = '开始'; |
244 | flag = true; |
245 | clearInterval(timerFalse); |
246 | var two = lis1[Math.abs(i / 300)].innerHTML; |
247 | if (two == "_") { |
248 | two = ''; |
249 | } |
250 | sp.innerHTML = '让我们有请<span style="color:red;">' + lis[Math.abs(i / 300)].innerHTML + two + lis2[Math.abs(i / 300)].innerHTML + '</span>同学发表个人意见'; |
251 | one = lis[Math.abs(i / 300)].cloneNode(true); |
252 | two = lis1[Math.abs(i / 300)].cloneNode(true); |
253 | three = lis2[Math.abs(i / 300)].cloneNode(true); |
254 | ul.innerHTML = ul1.innerHTML = ul2.innerHTML = ''; |
255 | ul.style.top = ul1.style.top = ul2.style.top = '0'; |
256 | i = 0; |
257 | ul.appendChild(one); |
258 | ul1.appendChild(two); |
259 | ul2.appendChild(three); |
260 | sp.style.animation = 'myfirst 0.5s running forwards'; |
261 | } |
262 | } |
263 | } |
264 | }) |
265 | |
266 | function randomName() { |
267 | li = document.createElement('li'); |
268 | li1 = document.createElement('li'); |
269 | li2 = document.createElement('li'); |
270 | randoma = parseInt(Math.random() * nameArr.length); |
271 | li.innerHTML = nameArr[randoma][0]; |
272 | li1.innerHTML = nameArr[randoma][1]; |
273 | li2.innerHTML = nameArr[randoma][2]; |
274 | ul.appendChild(li); |
275 | ul1.appendChild(li1); |
276 | ul2.appendChild(li2); |
277 | } |
278 | </script> |
279 | |
280 | </html> |
281 |
结合源码再看一遍我的思路,相信大家就很清楚了,如果还有不清楚的或者有更好的意见,欢迎留言讨论。
原生javascript实现老.虎机抽奖点名demo源码思路解析的更多相关文章
- 抽奖动画 - lao虎机抽奖
本文介绍一个lao虎机抽奖动画的实现,lao虎机抽奖在各类商家营销活动中非常常见,这里主要介绍动画的实现过程,其他细节不做详细分析. ps:lao虎机是敏感词,博客园不允许出现,所有老用拼音. 1. ...
- Go netpoll I/O 多路复用构建原生网络模型之源码深度解析
导言 Go 基于 I/O multiplexing 和 goroutine 构建了一个简洁而高性能的原生网络模型(基于 Go 的I/O 多路复用 netpoll),提供了 goroutine-per- ...
- DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码
前不久,公司举办了15周年庆,其中添加了一个抽奖环节,要从在读学员中随机抽取幸运学员,当然,这个任务就分到了我这里. 最后的效果如下,启动有个欢迎页面,数据是来自Excel的,点击开始则上面的学号及姓 ...
- iOS 数字滚动 类似于老 - 虎- 机的效果
效果图 具体实现代码如下 ZCWScrollNumView.h文件 #import <UIKit/UIKit.h> typedef enum { ZCWScrollNumAnimation ...
- 带你一分钟理解 JavaScript 闭包 自己结合所看文档+源码的一些理解 喜欢就评论个赞哦!!!!--小蛋蛋
什么是闭包? 先看一段代码: function a(){ var n = 0; function inc() { n++; console.log(n); } inc(); inc(); } a(); ...
- MongoDB一次节点宕机引发的思考(源码剖析)
目录 简介 日志分析 副本集 如何实现 Failover 心跳的实现 electionTimeout 定时器 业务影响评估 参考链接 声明:本文同步发表于 MongoDB 中文社区,传送门: http ...
- MongoDB一次节点宕机引发的思考(源码剖析)【华为云分享】
目录 简介 日志分析 副本集 如何实现 Failover 心跳的实现 electionTimeout 定时器 业务影响评估 参考链接 声明:本文同步发表于 MongoDB 中文社区,传送门:http: ...
- 【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖游戏总结
大家好!先上图看看本次案例的整体效果. 完整版实战课程附源码:[Vue.js游戏机实战]- Vue.js实现九宫格水果机抽奖 实现思路: Vue component实现九宫格水果机组件,可以嵌套到任意 ...
- 【Vue.js游戏机实战】- Vue.js实现老虎-机抽奖总结
大家好!先上图看看本次案例的整体效果. 完整版实战课程附源码:[Vue.js游戏机实战]- Vue.js实现老虎-机抽奖 实现思路: Vue component实现老虎-机组件,可以嵌套到任意要使用的 ...
随机推荐
- ADB几种常见的错误及解决方法
下面列举出几种常见的错误及解决方法. Q1:无效的安装包,安装包已损坏[INSTALL_FAILED_INVALID_APK] A1:请检查安装包是否完整.如果是xpk包,可以通过 手动安装xpk来检 ...
- javascript数组去重算法-----4(另一种写法)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- pwd显示链接文件的真实路径
1.pwd用于显示当前工作路径 2.pwd -P 用于显示当前的实际工作路径(主要用于链接文件) 加参数难以了理解,看个例子就明白了: 进入链接文件,pwd显示的是链接文件所在的路径,而你不是链接文件 ...
- ceph 参数说明<转>
//path/to/socket指向某个osd的admin socket文件#> ceph --admin-daemon {path/to/socket} config show | grep ...
- css3动画工具
去年,我刚刚开始学习css3时候,看到了腾讯的这个工具,引起了我对css3的兴趣. 配合着书本上的知识写了一些效果,感觉不错. http://www.f2e.name/case/css3/tools. ...
- Ueditor和CKeditor 两款编辑器的使用与配置
一丶ueditor 百度编辑器 1.官方文档,演示,下载地址:http://ueditor.baidu.com/website/index.html 2.百度编辑器的好:Editor是由百度web前端 ...
- Putty以及adb网络调试
1.什么是SSH? SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议. 传 ...
- 网页播放音频、视频文件——基于web的html 5的音乐播放器(转载)
文章转载自:开源中国社区 [http://www.oschina.net] 想通过手机客户端(支持 Android.iPhone 和 Windows Phone)访问开源中国:请点这里 HTML5 是 ...
- UISearchBar--改变内部输入框的背景颜色
思路是获取UISearchBar的子视图,判断他是否是输入框(注意不要先入为主地认为是UITextField),最后修改背景色.至于UISearchBar的子视图结构,在不同的iOS版本可能会不一样, ...
- Farpoint Spread 常用事件
1 // 单元格编辑结束,焦点离开或者按回车键时 比如:你要判断当前单元格输入内容是否合法.private void fpSpread1_EditModeOff(object sender, Syst ...