原生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实现老虎-机组件,可以嵌套到任意要使用的 ... 
随机推荐
- 使用Ramdisk 加速 Visualstudio 编译调试
			一般来说ASP.NET在执行的时候,会先动态编译在目录 C:\Windows\Microsoft.NET\Framework64\版本\Temporary ASP.NET Files 由于每次修改程序 ... 
- C++ 下 typeof 的实现
			现在我们有这样一坨代码: std::vector<int> arr; // ... for(std::vector<int>::iterator iter = arr.begi ... 
- UberX及以上级别车奖励政策(优步北京第四组)
			优步北京第四组: 定义为2015年7月20日至今激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版最新最详细 ... 
- Andrew Ng Machine learning  Introduction
			1. 机器学习的定义:Machine learning is programming computers to optimize a performance criterion(优化性能标准) usi ... 
- 在OC项目工程中混编Swift
			1.创建一个OC项目工程,然后在Build Settings中找到如下字段,修改. 2.然后在项目中创建swift文件,如果系统提示是否需要创建桥接文件的时候,点击确定. 然后在Build Setti ... 
- uva10617 - Again Palindrome(dp)
			再次回文 输入:标准输入 输出:标准输出 时间限制: 2秒 是àpalindorme的读取相同的从左边,因为它从右侧的一个或多个字符的序列.例如,Ž,TOT和女士的 回文,但是,ADAM是不是. 给定 ... 
- SQLite  for C#
			slqlite是个轻量级的数据库,是目前较为流行的小型数据库,适用于各个系统..NET自然也是支持的 1.添加2个引用System.Data.SQLite.Linq,System.Data.SQLit ... 
- oracle tns
			oracle tns 是oracle提供的服务名,设置方法,oracle安装根目录---product----版本选择11.2.0----client1---NETWORK---ADMIN---tns ... 
- matlab最小二乘法数据拟合函数详解
			定义: 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可 以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小. ... 
- Sql Sever 字符串截取汉字
			最近需要在SQL的字符串中截取汉字,利用unicode函数判断字符的unicode编码,根据编码范围过滤掉非汉字字符. 写成了一个function /*@str 需要获取汉字的字符串*/ create ... 
