vue 实现抽奖大转盘

在这里插入图片描述
实际解决需求,前端只是负责页面转动,在用户点击时,请求中奖接口,同同时通过设置css属性,让转盘转动起来,当转盘转动结束后,根据请求后端接口回来的中奖信息,设置转盘的转动位置,然后进行弹窗显示中奖信息,在此时,***注意要重置转盘的转动角度为初始0度,***在不进行重置,倒置了后续的小bug,
代码实现:

页面布局

 <div class="turntable">
     <!-- 点击时候转动转盘 指针不转 -->
     <img class="turntable-center" :style="{transform:rotateAngle,transition:rotateTransition == ''?'transform 4s ease-in-out':rotateTransition }" src="/DCTrain/static/img/user/activity/newyear-fancycarp/turncenter.png">
     <img class="turntable-top" @click="luckflag ? pointer():''" src="/DCTrain/static/img/user/activity/newyear-fancycarp/turntop.png" >
 </div>

逻辑实现

data(){
	return{
		luckflag: true,
		rotateAngle: 0, //将要旋转的角度
               startRotatingDegree: 0, //初始旋转角度
               rotateTransition:'',//控制过渡效果
               click_flag: true, //是否可以旋转抽奖
	}
},
  methods:{
      // 点击指针
      pointer(){
          const me = this;
          // 如果没有登录,则前往登录页面
          if(me.$store.state.loginUser!='true'){
              this.$router.push({path:'/login.html',query:{fancy:'fancy'}})
              return
          }
          // 抽奖函数
          this.getlotteryPrizeFun()
      },
         // 转动
         rotate(prize){//目前是只转动转盘
             if (!this.click_flag) return;
             var type = 0; // 默认为 0  转盘转动
             var randCircle = 10; // 附加多转几圈,2-3
             var duringTime = 5; // 默认为 5s
             var rotateAngle = '';
             switch(prize.name){
                 case '奖品1:rotateAngle = randCircle*360+330 ; break;
                 case '奖品2':rotateAngle = randCircle*360+270 ; break;
                 case '奖品3':rotateAngle = randCircle*360+210 ; break;
                 case '奖品4':rotateAngle = randCircle*360+150 ; break;
                 case '奖品5':rotateAngle = randCircle*360+90 ; break;
                 case '奖品6':rotateAngle = randCircle*360+30 ; break;
             }
             this.click_flag = false; // 旋转结束前,不允许再次触发
             if (type == 0) {
                 // 转动盘子
                 var rotateAngle = this.startRotatingDegree + rotateAngle - this.startRotatingDegree % 360;//将要旋转的角度
                 this.startRotatingDegree = rotateAngle;//改变初始旋转的角度
                 this.rotateAngle = "rotate(" + rotateAngle + "deg)";//真正控制转动角度
                 // 旋转结束后允许再次触发
                 setTimeout(()=>{
                     this.click_flag = true;
                     this.gameOver(prize)
                 }, duringTime * 1000+200)
             }
         },
          // 游戏结束
         gameOver () {
             // 游戏结束,重置旋转初始位置
             this.rotateAngle = "rotate(" + 0 + "deg)";//真正控制转动角度的,为0,回到初始位置
             this.rotateTransition = 'transform 0.05s ease-in-out' //控制转动过渡效果的
             setTimeout(()=>{
                 this.rotateTransition = ''
             },100)
             // 中奖弹窗提示
             this.isShowMask = true
             this.winAward = true
             // 更新抽奖次数
             this.getActcivityFancy()
         },
           // 请求活动页面数据
          getActcivityFancy(){
              const me =this;
              $.Ajax.post({
                  url: '/common/activity/getActivityPageInfo.json',
                  callBack(res){
                      me.num = res.data.lotteryNum;//剩余抽奖次数
                  }
              })  
          },
            //请求点击抽奖数据,中奖操作
          getlotteryPrizeFun(){
              const me = this;
              $.Ajax.post({
                  url: '/user/activity/lotteryPrize.json',
                  callBack(res){
                      // console.log(res)
                      me.winId = res.data.join_id;
                      me.prize = res.data.prize;
                      me.prizeArr = me.srcArr.filter(item=>{
                          console.log()
                          if(item.title == me.prize.name) return true
                          return false
                      })
                      me.rotate(res.data.prize)
                  },
                  fail:false,
                  failBack(){
                      me.tipMessage='您的抽奖次数为0,无法参与抽奖';
                      me.noChanceAndNotJoin = true;
                      me.isShowMask = true;
                  }
              })                
          },
  }
  • 12
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实现转盘抽奖功能,你可以使用Vue来创建一个交互式的转盘组件。以下是一个简单的示例代码,可以帮助你开始: 1. 创建一个Vue组件,例如"LuckyDraw": ```javascript <template> <div> <div class="roulette-wheel"> <div v-for="(item, index) in items" :key="index" class="roulette-item"> {{ item }} </div> </div> <button @click="startSpinning">Start Spinning</button> <div v-if="winner" class="winner"> Congratulations! You won: {{ winner }} </div> </div> </template> <script> export default { data() { return { items: ['Prize 1', 'Prize 2', 'Prize 3', 'Prize 4', 'Prize 5'], // 奖项列表 winner: null // 中奖结果 }; }, methods: { startSpinning() { // 模拟抽奖过程,设置一个随机的中奖结果 const randomIndex = Math.floor(Math.random() * this.items.length); this.winner = this.items[randomIndex]; } } }; </script> <style scoped> .roulette-wheel { display: flex; justify-content: center; align-items: center; height: 300px; } .roulette-item { width: 100px; height: 100px; border: 1px solid #000; display: flex; justify-content: center; align-items: center; } button { margin-top: 20px; } .winner { margin-top: 20px; font-weight: bold; } </style> ``` 2. 在你的Vue应用中使用该组件: ```javascript <template> <div> <lucky-draw></lucky-draw> </div> </template> <script> import LuckyDraw from './LuckyDraw.vue'; export default { components: { LuckyDraw } }; </script> ``` 这样,你就可以使用Vue实现一个简单的转盘抽奖功能。当点击"Start Spinning"按钮时,会随机选取一个奖项作为中奖结果,并显示在页面上。你可以根据自己的需求进行样式和功能上的定制。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值