VUE实现大转盘抽奖

2022-04-15 0 893
目录
  • UI
  • 初始参考各值参考图
  • 方案分析-参数配置
    • 核心思路:
    • 关于旋转位置
    • 参数配置
  • 实现逻辑
    • 组件使用
      • 抽奖效果
        • 结语

          UI

          老规矩,先看下静态UI,以便于有个图像概念

          VUE实现大转盘抽奖

          初始参考各值参考图

          VUE实现大转盘抽奖

          方案分析-参数配置

          核心思路:

          将指针和中奖区域划分两部分,目前常规的效果,控制中奖区域旋转,然后停在指针处,当然控制指针也可以,一套思路,dom结构也比较简单,唯一算是复杂点的就是中奖区域,但是如果你足够懒,像我一样,你可以传递一张图也可以,完全依赖远端数据;

          关于旋转位置

          每个移动位置应均分,360/个数 === 每个奖品所占据的位置,以本文为例8个奖品位置,每个区域应为45deg,每个指针中心位置应为±22.5deg(±的意思看你是顺时针还是逆时针)具体值看下面 实现逻辑 区域

          参数配置

          • data 给与组件一些系统参数 旋转的圈数、效果等等配置
          • 计算属性 rotateStyle 旋转角度,实时调整
          • props 提供组件内部接口的参数和一些核心数据,比如转盘的图片等等
          // 基础参数
          data () {
             return {
               isrun: false,
               rotateAngle: 0, // 旋转角度
               config: {
                 duration: 4000, // 总旋转时间 ms级
                 circle: 8, // 旋转圈数
                 mode: 'ease-in-out' // 由快到慢 惯性效果都省了
               },
               cricleAdd: 1, // 第几次抽奖
               drawIndex: 0 // 中奖索引 转盘图片排序 指针右手开始 0-...
             }
           }
           // 计算属性
           computed: {
             rotateStyle () {
               const _c = this.config
               return `
                 -webkit-transition: transform ${_c.duration}ms ${_c.mode};
                 transition: transform ${_c.duration}ms ${_c.mode};
                 -webkit-transform: rotate(${this.rotateAngle}deg);
                     transform: rotate(${this.rotateAngle}deg);`
             }
           }
           // 入参
           props: {
             httpData: {}, // 接口调用所需参数
             stateData: {
               type: Object,
               default: () => {
                 return {
                   coin: 0, // 超级币数量
                   prize_img: '' // 转盘图片
                 }
               }
             }
           }
          

          实现逻辑

          • 咱们要做的事情很简单,计算出中奖奖品的位置,输出即可
          • 位置即对应圈数,drawIndex对应奖品位置,这个参数里面说过了
          this.rotateAngle = this.config.circle * 360 * this.cricleAdd - (22.5 + this.drawIndex * 45)
          // 圈数位置解析
          // this.config.circle * 360 * this.cricleAdd 顺时针总圈数/累积总圈数
          // 22.5 + this.drawIndex * 45 ===> (奖品位置 === this.drawIndex * 45) (指针中间位置 === 22.5)
          
          • drawIndex,直接从服务端拿就行了,如果没有跑出位置,自己可以计算一下
          • 为了方便拓展,抛出了两个状态对应抽奖的开始于完成,start和fin
          this.$emit('draw_fin', 'start')
          this.$emit('draw_fin', 'fin')
          
          • 完整代码,css就不水字数了,下面附上源码地址
            methods: {
                async run () {
                  if (this.stateData.coin < 10) {
                    console.log('超级币不足')
                    return
                  }   
                  if (this.isrun) return
                  // const data = await this.goDraw()
                  // 可以作为弹窗等信息展示
                  this.$emit('draw_fin', 'start')
                  this.$set(this.stateData, 'coin', 0) // 更新数据,此处仅为示例,推荐使用 draw_fin方法的 start/fin 进行相应数据更新
                  this.isrun = true
                  this.rotateAngle = this.config.circle * 360 * this.cricleAdd - (22.5 + this.drawIndex * 45)
                  // 圈数位置解析
                  // this.config.circle * 360 * this.cricleAdd 顺时针总圈数/累积总圈数
                  // 22.5 + this.drawIndex * 45 ===> (奖品位置 === this.drawIndex * 45) (指针中间位置 === 22.5)
          
              this.cricleAdd++
              setTimeout(() => {
                this.$emit('draw_fin', 'fin')
                this.isrun = false
              }, this.config.duration)
            },
            goDraw () {
              // 请求接口拿到中奖商品
              // 加下自己项目的样式 loading 用户体验
              return new Promise(async (resolve, reject) => {
                // await 奖品接口
                resolve({
                  msg: '抽奖明细'
                })
              })
            }
          

          组件使用

          使用

          import dialWrap from '../../components/dial/dial.vue'
          <dialWrap ref="dialWrap" :stateData="stateData"></dialWrap>
          

          抽奖效果

          VUE实现大转盘抽奖

          结语

          以上就是大概的实现思路了,比较简单的效果;再细的一些东西以及拓展,大家可以自行发挥哈~

          另附本文-源码地址,欢迎探讨哈~

          以上就是VUE实现大转盘抽奖的详细内容,更多关于vue 大转盘抽奖的资料请关注NICE源码其它相关文章!

          免责声明:
          1、本网站所有发布的源码、软件和资料均为收集各大资源网站整理而来;仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 不得使用于非法商业用途,不得违反国家法律。否则后果自负!

          2、本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与www.niceym.com无关。
          如果您喜欢该程序,请支持正版源码、软件,购买注册,得到更好的正版服务。
          如有侵犯你版权的,请邮件与我们联系处理(邮箱:skknet@qq.com),本站将立即改正。

          NICE源码网 JavaScript VUE实现大转盘抽奖 https://www.niceym.com/26958.html