原生JS抽奖程序
用于记录学习过程
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>友好的抽奖环节</title> 6 </head> 7 <style> 8 * { 9 margin: 0; 10 padding: 0; 11 } 12 13 body { 14 display: flex; 15 justify-content: center; 16 align-items: center; 17 height: 100vh; 18 } 19 20 .outher, .wapper { 21 position: relative; 22 width: 300px; 23 height: 300px; 24 background-color: red; 25 border-radius: 50%; 26 overflow: hidden; 27 } 28 .wapper{ 29 transform: rotate(22.5deg); 30 } 31 32 .left, .right { 33 width: 150px; 34 height: 100%; 35 overflow: hidden; 36 position: absolute; 37 } 38 39 .left div, .right div { 40 position: absolute; 41 width: 150px; 42 height: 100%; 43 } 44 45 .left div { 46 transform-origin: right center; 47 } 48 49 .right div { 50 transform-origin: left center; 51 } 52 53 .left { 54 left: 0; 55 background-color: burlywood; 56 } 57 58 .right { 59 right: 0; 60 background-color: blue; 61 } 62 63 .left div.one { 64 background-color: yellow; 65 } 66 67 .left div.two { 68 background-color: darkorange; 69 transform: rotate(-45deg); 70 } 71 72 .left div.three { 73 background-color: yellow; 74 transform: rotate(-90deg); 75 } 76 77 .left div.four { 78 background-color: darkorange; 79 transform: rotate(-135deg); 80 } 81 82 .right div.one { 83 background-color: darkorange; 84 } 85 86 .right div.two { 87 background-color: yellow; 88 transform: rotate(45deg); 89 } 90 91 .right div.three { 92 background-color: darkorange; 93 transform: rotate(90deg); 94 } 95 96 .right div.four { 97 background-color: yellow; 98 transform: rotate(135deg); 99 } 100 101 .left .text { 102 position: absolute; 103 left: 45%; 104 top: 30px; 105 transform: rotate(-30deg); 106 } 107 108 .right .text { 109 position: absolute; 110 right: 45%; 111 top: 30px; 112 transform: rotate(30deg); 113 } 114 115 .circle { 116 position: absolute; 117 width: 80px; 118 height: 80px; 119 background-color: orange; 120 left: 50%; 121 top: 50%; 122 transform: translate(-50%, -50%); 123 border-radius: 50%; 124 text-align: center; 125 line-height: 80px; 126 font-size: 20px; 127 user-select: none; 128 } 129 130 .circle::after { 131 content: ""; 132 position: absolute; 133 top: -70px; 134 left: 50%; 135 transform: translate(-50%); 136 border: 40px solid orange; 137 border-left-width: 10px; 138 border-right-width: 10px; 139 border-left-color: transparent; 140 border-top-color: transparent; 141 border-right-color: transparent; 142 } 143 144 145 </style> 146 <body> 147 <div class="outher"> 148 <div class="wapper"> 149 <div class="left"> 150 <div class="one"> 151 <span class="text">特等奖</span> 152 </div> 153 <div class="two"><span class="text">特等奖</span></div> 154 <div class="three"><span class="text">特等奖</span></div> 155 <div class="four"><span class="text">特等奖</span></div> 156 </div> 157 <div class="right"> 158 <div class="one"><span class="text">特等奖</span></div> 159 <div class="two"><span class="text">特等奖</span></div> 160 <div class="three"><span class="text">特等奖</span></div> 161 <div class="four"><span class="text">特等奖</span></div> 162 </div> 163 </div> 164 <div class="circle"> 165 抽奖 166 </div> 167 </div> 168 <script> 169 let wapper = document.querySelector(".wapper"); 170 let textAll = document.querySelectorAll(".text"); 171 let isFlag = true; 172 173 let texts = ['钻石奖','铂金奖','黄金奖','白银奖','鼓励奖','塑料奖','黑铁奖','青铜奖']; 174 let textss = ['恭喜您获得MVP,SSVIP,钻石大奖,暂不揭晓!¥_¥','不错哟,铂金奖,不过什么也没有>_<', 175 '恭喜获得黄金奖,emmm...没有奖励,送你点好运气吧qaq','恭喜获得白银奖,是我们策划马同学的么么哒一个!', 176 '恭喜您!获得马同学一个抱抱!QAQ','塑料也是奖吗?下一位!','啊这,祝你排位十连胜吧!','恭喜,很想送您奖品,但是没经费了,给多加点辣椒吧!' 177 ]; 178 for(let i =0; i<textAll.length; i++){ 179 textAll[i].innerHTML = texts[i]; 180 } 181 let random = parseInt(Math.random()*8); 182 document.querySelector(".circle").onclick = function () { 183 if(isFlag){ 184 switch (random) { 185 case 0: 186 run(22.5,texts[random]); 187 break; 188 case 1: 189 run(66.5,texts[random]); 190 break; 191 case 2: 192 run(112.5,texts[random]); 193 break; 194 case 3: 195 run(157.5,texts[random]); 196 break; 197 case 4: 198 run(338.5,texts[random]); 199 break; 200 case 5: 201 run(294.5,texts[random]); 202 break; 203 case 6: 204 run(247.5,texts[random]); 205 break; 206 case 7: 207 run(201.5,texts[random]); 208 break; 209 } 210 } 211 } 212 let timer = null; 213 function run(angle,text) { 214 console.log(angle,text); 215 isFlag = false; 216 let begin = 0; 217 let basic = 1800; 218 timer = setInterval(function () { 219 if(begin>=(basic+angle)){ 220 isFlag = true; 221 clearInterval(timer); 222 } 223 wapper.style.transform = "rotate("+begin+"deg)"; 224 begin += (basic+angle-begin)*0.1; //只能抽一次 225 // begin += Math.ceil((basic+angle-begin)*0.1); //无限制 226 },50); 227 setTimeout("alert(textss[random])",4000); 228 } 229 230 </script> 231 232 233 234 </body> 235 </html>
稍加修改,面对不同的应用场景。
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>友好的抽奖环节</title> 6 </head> 7 <style> 8 * { 9 margin: 0; 10 padding: 0; 11 } 12 13 body { 14 display: flex; 15 justify-content: center; 16 align-items: center; 17 height: 100vh; 18 } 19 20 .outher, .wapper { 21 position: relative; 22 width: 300px; 23 height: 300px; 24 background-color: red; 25 border-radius: 50%; 26 overflow: hidden; 27 } 28 .wapper{ 29 transform: rotate(22.5deg); 30 } 31 32 .left, .right { 33 width: 150px; 34 height: 100%; 35 overflow: hidden; 36 position: absolute; 37 } 38 39 .left div, .right div { 40 position: absolute; 41 width: 150px; 42 height: 100%; 43 } 44 45 .left div { 46 transform-origin: right center; 47 } 48 49 .right div { 50 transform-origin: left center; 51 } 52 53 .left { 54 left: 0; 55 background-color: burlywood; 56 } 57 58 .right { 59 right: 0; 60 background-color: blue; 61 } 62 63 .left div.one { 64 background-color: greenyellow; 65 } 66 67 .left div.two { 68 background-color: orangered; 69 transform: rotate(-45deg); 70 } 71 72 .left div.three { 73 background-color: greenyellow; 74 transform: rotate(-90deg); 75 } 76 77 .left div.four { 78 background-color: orangered; 79 transform: rotate(-135deg); 80 } 81 82 .right div.one { 83 background-color: orangered; 84 } 85 86 .right div.two { 87 background-color: greenyellow; 88 transform: rotate(45deg); 89 } 90 91 .right div.three { 92 background-color: orangered; 93 transform: rotate(90deg); 94 } 95 96 .right div.four { 97 background-color: greenyellow; 98 transform: rotate(135deg); 99 } 100 101 .left .text { 102 position: absolute; 103 left: 45%; 104 top: 30px; 105 transform: rotate(-30deg); 106 } 107 108 .right .text { 109 position: absolute; 110 right: 45%; 111 top: 30px; 112 transform: rotate(30deg); 113 } 114 115 .circle { 116 position: absolute; 117 width: 80px; 118 height: 80px; 119 background-color: orange; 120 left: 50%; 121 top: 50%; 122 transform: translate(-50%, -50%); 123 border-radius: 50%; 124 text-align: center; 125 line-height: 80px; 126 font-size: 20px; 127 user-select: none; 128 } 129 130 .circle::after { 131 content: ""; 132 position: absolute; 133 top: -70px; 134 left: 50%; 135 transform: translate(-50%); 136 border: 40px solid orange; 137 border-left-width: 10px; 138 border-right-width: 10px; 139 border-left-color: transparent; 140 border-top-color: transparent; 141 border-right-color: transparent; 142 } 143 144 145 </style> 146 <body> 147 <div class="outher"> 148 <div class="wapper"> 149 <div class="left"> 150 <div class="one"> 151 <span class="text">特等奖</span> 152 </div> 153 <div class="two"><span class="text">特等奖</span></div> 154 <div class="three"><span class="text">特等奖</span></div> 155 <div class="four"><span class="text">特等奖</span></div> 156 </div> 157 <div class="right"> 158 <div class="one"><span class="text">特等奖</span></div> 159 <div class="two"><span class="text">特等奖</span></div> 160 <div class="three"><span class="text">特等奖</span></div> 161 <div class="four"><span class="text">特等奖</span></div> 162 </div> 163 </div> 164 <div class="circle"> 165 抽奖 166 </div> 167 </div> 168 <script> 169 let wapper = document.querySelector(".wapper"); 170 let textAll = document.querySelectorAll(".text"); 171 let isFlag = true; 172 173 let texts = ['下次一定','肉串*2','再来一次','肉串*2','和一个帅哥合影','再来一次','素菜*2','下次一定']; 174 // let textss = ['恭喜您获得MVP,SSVIP,钻石大奖,暂不揭晓!¥_¥','不错哟,铂金奖,不过什么也没有>_<', 175 // '恭喜获得黄金奖,emmm...没有奖励,送你点好运气吧qaq','恭喜获得白银奖,是我们策划马同学的么么哒一个!', 176 // '恭喜您!获得马同学一个抱抱!QAQ','塑料也是奖吗?下一位!','啊这,祝你排位十连胜吧!','恭喜,很想送您奖品,但是没经费了,给多加点辣椒吧!' 177 // ]; 178 for(let i =0; i<textAll.length; i++){ 179 textAll[i].innerHTML = texts[i]; 180 } 181 182 document.querySelector(".circle").onclick = function () { 183 if(isFlag){ 184 let random = parseInt(Math.random()*8); 185 switch (random) { 186 case 0: 187 run(22.5,texts[random]); 188 break; 189 case 1: 190 run(66.5,texts[random]); 191 break; 192 case 2: 193 run(112.5,texts[random]); 194 break; 195 case 3: 196 run(157.5,texts[random]); 197 break; 198 case 4: 199 run(338.5,texts[random]); 200 break; 201 case 5: 202 run(294.5,texts[random]); 203 break; 204 case 6: 205 run(247.5,texts[random]); 206 break; 207 case 7: 208 run(201.5,texts[random]); 209 break; 210 } 211 } 212 } 213 let timer = null; 214 function run(angle,text) { 215 console.log(angle,text); 216 isFlag = false; 217 let begin = 0; 218 let basic = 5400; 219 timer = setInterval(function () { 220 if(begin>=(basic+angle)){ 221 isFlag = true; 222 clearInterval(timer); 223 } 224 wapper.style.transform = "rotate("+begin+"deg)"; 225 // begin += (basic+angle-begin)*0.1; //只能抽一次 226 begin += Math.ceil((basic+angle-begin)*0.1); //无限制 227 },50); 228 // setTimeout("alert(texts[random])",4000); 229 } 230 231 </script> 232 233 234 235 </body> 236 </html>
代码搬运,方便寻找。over~