一、引言
正值一年一度的1024程序员
节,CSDN的活动也办的热火朝天,我也没有错过这个官方发福利的机会,辗转于各大直播间,参加了各种活动,但是发现最后我才是活动的小丑,两天下来十几场活动,一次都没中奖。仿佛自己就是中奖绝缘体
。
不过意外发现,自己发布的动态竟被官方大佬翻了牌子🤪,荣幸至极! 原来以为这种超神级别的大佬
都是远在天边,也有可能是最近佛祖拜的多,最近才好运不断。十分感谢官方大佬的中级红包肯定,我们作为一线战斗人员,会好好呵护好自己的秀发,磨练自己的技术,不断为社区带来更优质的内容🥰🥰
言归正传,针对中奖绝缘体这件事情,我实在是有感而发:现在的活动这么多,都是采用这种直播发福利的形式,对于观看直播的用户,每次到了抽奖环节,用户在启动了单身十八年的手速发出了抽奖指定的口令之后,剩下的命运就只能交给天意,然后主播在规定的时间结束后直接公布获奖名单。事实就会证明我是一个中奖绝缘体
整个过程,我们作为参与者没有任何的参与感,除了在主播侧可以看到抽奖的人数状况外,我就会有一种抽了个寂寞的感觉😝。
那有没有什么办法能让我没中奖还是让我很开心呢??
我不禁想到了买福利彩票
,我们明明知道中奖概率很低,但还是愿意赌那亿分之一的机会!可能从心底里觉得我们会是那个被上帝眷顾的人。
所以这个时候我们需要一些套路,各种提高自我感觉的抽奖功能就显得尤为重要!
二、抽奖功能大合集
目前主流的抽奖功能都是以提升用户参与度为目的!所以有以下几种:九宫格抽奖
、翻卡牌抽奖
、刮刮乐抽奖
、转盘抽奖
、`贩卖机抽奖
三、完整源码
3.1 九宫格抽奖
<template> <view class="container"> <view class="tui-dot" :class="'tui-dot-'+(index+1)" v-for="(item,index) in circleList" :key="index"></view> <view class="tui-container-in"> <view class="tui-content-out" :class="['tui-award-'+(index+1),index==indexSelect?'tui-awardSelect':'']" v-for="(item,index) in awardList" :key="index"> <image class="tui-award-image" :src="item.img"></image> </view> <view class="tui-btn-start" :class="isRunning?'tui-ative':''" @click="start">开始</view> </view> </view> </template> <script> export default { data() { return { circleList: 24, //圆点个数 awardList: [{ img: "/static/other/1.png", name: "酷表情" }, { img: "/static/other/2.png", name: "流鼻血表情" }, { img: "/static/other/3.png", name: "冷表情" }, { img: "/static/other/4.png", name: "色表情" }, { img: "/static/other/5.png", name: "吐表情" }, { img: "/static/other/6.png", name: "睡觉表情" }, { img: "/static/other/7.png", name: "哭表情" }, { img: "/static/other/8.png", name: "奋斗表情" }], //奖品 indexSelect: 0, //抽中的奖品下标 isRunning: false //抽奖状态 } }, methods: { //随机数 random(u) { let rnd = Math.random() > 0.5 ? "2" : "1"; u = u || 3; for (var i = 0; i < u; i++) { rnd += Math.floor(Math.random() * 10); } return Number(rnd); }, //开始 start() { if (this.isRunning) return this.isRunning = true; let indexSelect = 0; let i = 0; let randomNum = this.random(3); let timer = setInterval(() => { ++indexSelect; //这里用y=30*x+150函数做的处理.可根据自己的需求改变转盘速度 indexSelect = indexSelect % 8; this.indexSelect = indexSelect; i += 40; if (i > randomNum) { //去除循环 clearInterval(timer) timer = null; this.$util.tip("恭喜您,抽中了" + this.awardList[indexSelect].name) this.isRunning = false } }, (70 + i)) } } } </script> <style lang="scss"> page { background-color: $uni-bg-color; } .container { height: 600rpx; width: 650rpx; background-color: #fc4034; margin: 100rpx auto; border-radius: 40rpx; box-shadow: 0 10px 0 #d80014; position: relative; } .tui-container-in { width: 580rpx; height: 530rpx; background-color: #d80014; border-radius: 40rpx; position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; } /**小圆点 start*/ .tui-dot { position: absolute; display: block; border-radius: 50%; height: 20rpx; width: 20rpx; } .tui-dot:nth-child(odd) { background: #fff; animation: 0.5s odd linear infinite; } .tui-dot:nth-child(even) { background: #fcf400; animation: 0.5s even linear infinite; } .tui-dot-1 { left: 15rpx; top: 15rpx; } .tui-dot-2 { left: 117.5rpx; top: 7.5rpx; } .tui-dot-3 { left: 220rpx; top: 7.5rpx; } .tui-dot-4 { left: 322.5rpx; top: 7.5rpx; } .tui-dot-5 { left: 425rpx; top: 7.5rpx; } .tui-dot-6 { left: 527.5rpx; top: 7.5rpx; } .tui-dot-7 { left: 620rpx; top: 15rpx; } .tui-dot-8 { left: 622rpx; top: 109rpx; } .tui-dot-9 { left: 622rpx; top: 203rpx; } .tui-dot-10 { left: 622rpx; top: 297rpx; } .tui-dot-11 { left: 622rpx; top: 391rpx; } .tui-dot-12 { left: 622rpx; top: 485rpx; } .tui-dot-13 { left: 620rpx; top: 565rpx; } .tui-dot-14 { left: 517.5rpx; top: 572rpx; } .tui-dot-15 { left: 415rpx; top: 572rpx; } .tui-dot-16 { left: 312.5rpx; top: 572rpx; } .tui-dot-17 { left: 210rpx; top: 572rpx; } .tui-dot-18 { left: 107.5rpx; top: 572rpx; } .tui-dot-19 { left: 15rpx; top: 565rpx; } .tui-dot-20 { left: 7.5rpx; top: 471rpx; } .tui-dot-21 { left: 7.5rpx; top: 377rpx; } .tui-dot-22 { left: 7.5rpx; top: 283rpx; } .tui-dot-23 { left: 7.5rpx; top: 189rpx; } .tui-dot-24 { left: 7.5rpx; top: 95rpx; } @-webkit-keyframes odd { 0% { background: #fff; } 100% { background: #fcf400; } } @keyframes odd { 0% { background: #fff; } 100% { background: #fcf400; } } @-webkit-keyframes even { 0% { background: #fcf400; } 100% { background: #fff; } } @keyframes even { 0% { background: #fcf400; } 100% { background: #fff; } } /**小圆点 end*/ .tui-content-out { position: absolute; height: 150rpx; width: 168rpx; background-color: #fcecec; border-radius: 15rpx; box-shadow: 0 4px 0 #fcc8d0; } /* 580 530 */ .tui-award-1 { left: 24rpx; top: 24rpx; } .tui-award-2 { left: 206rpx; top: 24rpx; } .tui-award-3 { left: 388rpx; top: 24rpx; } .tui-award-4 { left: 388rpx; top: 188rpx; } .tui-award-5 { left: 388rpx; top: 352rpx; } .tui-award-6 { left: 206rpx; top: 352rpx; } .tui-award-7 { left: 24rpx; top: 352rpx; } .tui-award-8 { left: 24rpx; top: 188rpx; } /**居中 加粗*/ .tui-btn-start { position: absolute; top: 188rpx; left: 206rpx; border-radius: 15rpx; height: 150rpx; width: 168rpx; background-color: #fc4034; box-shadow: 0 4px 0 #fcc8d0; color: #fcf400; text-align: center; font-size: 32rpx; font-weight: bold; line-height: 150rpx; } .tui-ative { opacity: 0.6 !important; } .tui-award-image { position: absolute; margin: auto; top: 0; left: 0; bottom: 0; right: 0; height: 50rpx; width: 50rpx; } .tui-awardSelect { background-color: #fcf400 !important; box-shadow: 0 4px 0 rgb(240, 208, 12) !important; } </style>
3.2 翻卡牌抽奖
<template> <view> <view class="button" @click="again">重新翻牌</view> <view class="curin-index"> <view style="background-image: url('/static/other/1.png');color: aquamarine;" @click="tamin(index)" v-for="(item,index) in 9" :key="index" class="currin" :class="[really == index+1?'animt':'', really != index+1 && surplus?'animt':'', really == ''?'cinton'+(index+1):'',really == index+1 && implement > 1?'selected':'un-selected']"> {{really == index+1?flop:''}}{{really != index+1 && really != ''?biutin:''}}{{really == ''?'点击翻牌':''}} </view> </view> <view style="position: fixed;bottom: 100rpx;left: 250rpx;"> </view> </view> </template> <script> export default { data() { return { url: '', whether: false, flop: '点击翻牌', really: '', implement: 0, surplus: false, biutin: '点击翻牌', } }, onLoad() {}, methods: { again(e) { if (this.implement == 3 || this.implement == 0) { this.whether = false this.flop = '点击翻牌' this.really = '' this.implement = 0 this.surplus = false this.biutin = '点击翻牌' } else { uni.showToast({ title: '正在执行抽奖中...', icon: 'none', duration: 2000 }) return false } }, tamin(index) { if (this.really == '') { this.whether = true this.really = index + 1 this.implement = 1 setTimeout(res => { this.flop = '' }, 500) setTimeout(res => { this.flop = 'iPhone12' this.surplus = true this.implement = 2 }, 1200) setTimeout(res => { this.biutin = '' }, 1700) setTimeout(res => { this.biutin = '谢谢惠顾' this.implement = 3 }, 2500) } } } } </script> <style lang="scss"> .selected { // background-image: linear-gradient(45deg, #f43f3b, #ec008c); background-color: #f43f3b; } .un-selected { // background-image: linear-gradient(45deg, #39b54a, #8dc63f); background-color: #39b54a; } .button { width: 40%; height: 80rpx; line-height: 80rpx; background-color: #fadbd9; color: #e54d42; text-align: center; border-radius: 10rpx; margin: 30rpx 30%; float: left; position: relative; } .curin-index { width: 100%; float: left; } .currin { margin-left: 4%; margin-top: 50rpx; width: 28%; float: left; color: #fff; text-align: center; height: 200rpx; line-height: 200rpx; border-radius: 10rpx; position: relative; } .currin::before { content: ""; display: block; background: inherit; filter: blur(10rpx); position: absolute; width: 100%; height: 100%; top: 10rpx; left: 10rpx; z-index: -1; opacity: 0.4; transform-origin: 0 0; border-radius: inherit; transform: scale(1, 1); } .cinton1 { animation: cinton1 alternate linear 2 1s; } @keyframes cinton1 { from { top: 0; left: 0; } to { top: 230rpx; left: 230rpx; } } .cinton2 { animation: cinton2 alternate linear 2 1s; } @keyframes cinton2 { from { top: 0; left: 0; } to { top: 230rpx; left: 0rpx; } } .cinton3 { animation: cinton3 alternate linear 2 1s; } @keyframes cinton3 { from { top: 0; left: 0; } to { top: 230rpx; left: -230rpx; } } .cinton4 { animation: cinton4 alternate linear 2 1s; } @keyframes cinton4 { from { top: 0; left: 0; } to { top: 0rpx; left: 230rpx; } } .cinton6 { animation: cinton6 alternate linear 2 1s; } @keyframes cinton6 { from { top: 0; left: 0; } to { top: 0rpx; left: -230rpx; } } .cinton7 { animation: cinton7 alternate linear 2 1s; } @keyframes cinton7 { from { top: 0; left: 0; } to { top: -230rpx; left: 230rpx; } } .cinton8 { animation: cinton8 alternate linear 2 1s; } @keyframes cinton8 { from { top: 0; left: 0; } to { top: -230rpx; left: 0rpx; } } .cinton9 { animation: cinton9 alternate linear 2 1s; } @keyframes cinton9 { from { top: 0; left: 0; } to { top: -230rpx; left: -230rpx; } } .animt { animation: fanzhuan 1.2s; } @keyframes fanzhuan { 0% { transform: perspective(150px) rotateY(0deg); } 50% { transform: perspective(150px) rotateY(0deg); } 100% { transform: perspective(150px) rotateY(179.9deg); } } </style>
3.3 刮刮乐抽奖
<template> <view> <view class="scratch"> <view class="box"> <!-- 刮奖结果--> <view class="result"> <text>iPhone12一台</text> </view> <!-- 刮奖canvas容器 --> <canvas class="canvas-box" canvas-id="canvas-id" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd"></canvas> </view> <view class="tip">刮一刮</view> </view> </view> </template> <script> import scratch from '@/util/scratch.js' export default { data() { return { url: 'https://blog.csdn.net/qq_40101922/article/details/102463778', scratchWidth: 350, // 绘制刮奖范围宽 scratchHeight: 150, // 绘制刮奖范围高 scratchSize: 10, // 触手大小 scratchScale: 0.30, // 需刮开百分比 } }, onLoad() { this.initCanvas(); }, methods: { initCanvas() { // 刮奖初始化信息必须在onReady后,不然h5不支持(小程序可在onLoad执行) new scratch(this, { canvasId: 'canvas-id', width: this.scratchWidth, height: this.scratchHeight, size: this.scratchSize, scale: this.scratchScale }) } } } </script> <style lang="scss"> .scratch { width: 600rpx; height: 300rpx; // background: url($baseImgUrl+"luck-draw-guajiang.png") no-repeat; background-size: contain; margin: 400rpx 75rpx; box-sizing: border-box; position: relative; overflow: hidden; .box { width: 100%; height: 100%; background: #aaaa7f; border-radius: 10rpx; position: relative; overflow: hidden; .result { height: 100%; display: flex; justify-content: center; align-items: center; font-size: 50rpx; color: #FFFFFF; } .canvas-box { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 10rpx; overflow: hidden; } } .tip { position: fixed; text-align: center; top: 300rpx; left: 300rpx; width: 150rpx; font-size: 40rpx; font-weight: bold; z-index: 999; } } </style>
3.4 贩卖机抽奖
<template> <view> <view class="box"> <view class="qiang"> <!-- 可以设置距离顶部的高 --> </view> <view class="conter"> <view v-for="(i,index) in str" class="someBox"> <image src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2FO1CN01DKEdXI1oLlqBDGxY2_%21%212212923455209-0-cib.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1669648345&t=51ee063b70b708bd88e93f664e7fd0f5" :class="{nainai:i.state}" id="yeye" @click="add(index)"></image> <view class="text" style="background-image: url('https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2FO1CN01DKEdXI1oLlqBDGxY2_%21%212212923455209-0-cib.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1669648345&t=51ee063b70b708bd88e93f664e7fd0f5');">{{i.zhi}}</view> </view> </view> </view> </view> </template> <script> export default { data() { return { url: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2FO1CN01DKEdXI1oLlqBDGxY2_%21%212212923455209-0-cib.jpg&refer=http%3A%2F%2Fcbu01.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1669648345&t=51ee063b70b708bd88e93f664e7fd0f5', str: [{ zhi: '抽纸', state: false }, { zhi: '鼠标', state: false }, { zhi: '茶具', state: false }, { zhi: '牛肉干', state: false }, { zhi: '电脑', state: false }, { zhi: '手机', state: false }, { zhi: '洗衣机', state: false }, { zhi: '水杯', state: false }, { zhi: '手环', state: false }, { zhi: '帽子', state: false }, { zhi: '热水壶', state: false }, { zhi: '辣条', state: false }, ] } }, onLoad() { }, methods: { add(index) { this.str[index].state = true; } } } </script> <style> .qiang { width: 100%; height: 275rpx; } .box { width: 100vw; margin: 0 auto; height: 1300rpx; background-color: pink; background: url('https://6e69-niew6-1302638010.tcb.qcloud.la/%E8%83%8C%E6%99%AF/%E5%94%AE%E5%8D%96%E6%9C%BA.jpg?sign=92e33f978e8bc7f5cd192b98a953620d&t=1611471153') no-repeat; background-size: 100% 100%; } .conter { width: 475rpx; height: 825rpx; margin-left: 80rpx; overflow: hidden; } .someBox { width: 157rpx; height: 206rpx; float: left; text-align: center; position: relative; } .someBox .text { width: 100rpx; height: 30rpx; color: #160000; font-weight: bold; margin: 0 auto; font-size: 22rpx; line-height: 30rpx; text-align: center; z-index: 666; position: absolute; left: 20rpx; bottom: 50rpx; z-index: 9; } .nainai { animation: ol 2s ease-in 0s; animation-fill-mode: forwards; } #yeye { width: 105rpx; height: 120rpx; position: absolute; top: 70rpx; left: 26rpx; z-index: 10; } @keyframes ol { 0% { transform: scale(1) rotate(0deg); } 5% { transform: scale(1.4) rotate(30deg); } 10% { transform: scale(1.4) rotate(-30deg); } 15% { transform: scale(1.4) rotate(30deg); } 20% { transform: scale(1.4) rotate(-30deg); } 25% { transform: scale(1.4) rotate(-45deg); } 50% { transform: scale(1) rotate(-45deg); top: 70rpx; } 100% { transform: scale(1) rotate(-45deg); top: 900rpx; } } </style>
3.5 转盘抽奖
<template> <view class="container"> <view class="header"> <view class="header-title"> 点击转盘抽奖获得红包 </view> </view> <view class="main"> <view class="canvas-container"> <view :animation="animationData" class="canvas-content"> <view class="canvas-line"> <view class="canvas-litem" v-for="(item,index1) in awardsList" :key="index1" :style="[{transform:'rotate('+item.lineTurn+')'}]"></view> </view> <view class="canvas-list"> <view class="canvas-item" v-for="(iteml,index2) in awardsList" :key="index2"> <view class="canvas-item-text" :style="[{transform:'rotate('+iteml.turn+')'}]"> <text>{{iteml.award}}</text> <image class="canvas-item-text-img" src="/static/other/1.png"></image> </view> </view> </view> </view> <view @tap="playReward" class="canvas-btn" v-bind:class="btnDisabled">开始 </view> <view class="canvas-btn-table">剩余{{chishu}}次</view> </view> </view> <view class="comm-content"> </view> </view> </template> <script> export default { data() { return { url:'https://www.baidu.com/link?url=Vudt-1kEqZqAXnDyaw67FKE6qdANdkWOVl8OS9VSbezcql181qVYSar7PUdMPrzzM45XZnI4xF1deeIFbXMfTa&wd=&eqid=db15fd820008c60f000000065fafac6f', awardsConfig: { chance: true, awards: [{ index: 0, name: '10元红包', type: 0 }, { index: 1, name: '谢谢参与', type: 1 }, { index: 2, name: '50元红包', type: 0 }, { index: 3, name: '谢谢参与', type: 1 }, { index: 4, name: '100元话费', type: 0 }, { index: 5, name: '谢谢参与', type: 1 }, { index: 6, name: '20元红包', type: 0 }, { index: 7, name: '谢谢参与', type: 1 } ] }, awardsList: {}, animationData: {}, btnDisabled: '', chishu: 5 }; }, onReady(e) { this.drawAwardRoundel() }, methods: { //画抽奖圆盘 drawAwardRoundel: function() { var awards = this.awardsConfig.awards; var awardsList = []; var turnNum = 1 / awards.length * 360; // 文字旋转 turn 值 // 奖项列表 for (var i = 0; i < awards.length; i++) { awardsList.push({ turn: i * turnNum + 'deg', lineTurn: i * turnNum + turnNum / 2 + 'deg', award: awards[i].name }); } this.btnDisabled = this.awardsConfig.chance ? '' : 'disabled'; this.awardsList = awardsList; }, //发起抽奖 playReward: function() { if (this.chishu == 0) { uni.showToast({ title: '抽奖次数已经用完', icon: 'none' }) return } //中奖index var awardsNum = this.awardsConfig.awards; var awardIndex = Math.round(Math.random() * (awardsNum.length - 1)); //随机数 var runNum = 8; //旋转8周 var duration = 4000; //时长 // 旋转角度 this.runDeg = this.runDeg || 0; this.runDeg = this.runDeg + (360 - this.runDeg % 360) + (360 * runNum - awardIndex * (360 / awardsNum.length)) //创建动画 var animationRun = uni.createAnimation({ duration: duration, timingFunction: 'ease' }) animationRun.rotate(this.runDeg).step(); this.animationData = animationRun.export(); this.btnDisabled = 'disabled'; // 中奖提示 var awardsConfig = this.awardsConfig; var awardType = awardsConfig.awards[awardIndex].type; this.chishu = this.chishu - 1; if (awardType == 0) { setTimeout(function() { uni.showModal({ title: '恭喜', content: '获得' + (awardsConfig.awards[awardIndex].name), showCancel: false }); this.btnDisabled = ''; }.bind(this), duration); } else { setTimeout(function() { uni.showModal({ title: '很遗憾', content: '没中奖 ' + (awardsConfig.awards[awardIndex].name), showCancel: false }); this.btnDisabled = ''; }.bind(this), duration); } } } } </script> <style> page { background: #fff; } .header { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100upx; } /* 转盘 */ .canvas-container { margin: 0 auto; position: relative; width: 600upx; height: 600upx; border-radius: 50%; box-shadow: 0 10upx 30upx #333, 0 0 10upx #000; border: 10rpx solid #A83FDB; } .canvas-content { position: absolute; left: 0; top: 0; z-index: 1; display: block; width: 600upx; height: 600upx; border-radius: inherit; background-clip: padding-box; /* background-color: #ffcb3f; */ } .canvas-element { position: relative; z-index: 1; width: inherit; height: inherit; border-radius: 50%; } .canvas-list { position: absolute; left: 0; top: 0; width: inherit; height: inherit; z-index: 9999; } .canvas-item { position: absolute; left: 0; top: 0; width: 100%; height: 100%; color: #e4370e; font-weight: bold; text-shadow: 0 1upx 1upx rgba(255, 255, 255, 0.6); } .canvas-item-text { position: relative; display: block; padding-top: 20upx; margin: 0 auto; text-align: center; -webkit-transform-origin: 50% 300upx; transform-origin: 50% 300upx; display: flex; flex-direction: column; align-items: center; } .canvas-item-text text { font-size: 30upx; } .canvas-item-text-img { width: 60upx; height: 60upx; padding-top: 10upx; } /* 分隔线 */ .canvas-line { position: absolute; left: 0; top: 0; width: inherit; height: inherit; z-index: 99; } .canvas-litem { position: absolute; left: 300upx; top: 0; width: 3upx; height: 300upx; background-color: rgba(228, 55, 14, 0.4); overflow: hidden; -webkit-transform-origin: 50% 300upx; transform-origin: 50% 300upx; } /** * 抽奖按钮 */ .canvas-btn { position: absolute; left: 260upx; top: 260upx; z-index: 400; width: 80upx; height: 80upx; border-radius: 50%; color: #f4e9cc; background-color: #e44025; line-height: 80upx; text-align: center; font-size: 26upx; text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.6); box-shadow: 0 3px 5px rgba(0, 0, 0, 0.6); text-decoration: none; } .canvas-btn::after { position: absolute; display: block; content: ' '; left: 12upx; top: -44upx; width: 0; height: 0; overflow: hidden; border-width: 30upx; border-style: solid; border-color: transparent; border-bottom-color: #e44025; } .canvas-btn.disabled { pointer-events: none; background: #b07a7b; color: #ccc; } .canvas-btn.disabled::after { border-bottom-color: #b07a7b; } .canvas-btn-table { color: #A83FDB; width: 120upx; text-align: center; position: absolute; left: 240upx; top: 360upx; font-size: 26upx; background-color: #FFFFFF; opacity: 0.9; } </style>