VUE实现大转盘抽奖

 更新时间:2021年05月13日 11:25:43   作者:依旧优雅  
营运三宝(九宫格、大转盘、老虎机,当然此三宝当然是最基础的营销运营手段),本片文章聊聊大转盘,转盘的实现逻辑应该是营销方案较为简单的一种了,本文将介绍如何实现大转盘抽奖,感兴趣的朋友可以参考下

UI

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

初始参考各值参考图

方案分析-参数配置

核心思路:

将指针和中奖区域划分两部分,目前常规的效果,控制中奖区域旋转,然后停在指针处,当然控制指针也可以,一套思路,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动态子组件的两种实现方式

    vue动态子组件的两种实现方式

    这篇文章主要介绍了vue动态子组件的两种实现方式,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • vue前端开发keepAlive使用详解

    vue前端开发keepAlive使用详解

    在开发中经常有从列表跳到详情页,然后返回详情页的时候需要缓存列表页的状态(比如滚动位置信息),这个时候就需要保存状态,要缓存状态
    2021-10-10
  • VUE利用vuex模拟实现新闻点赞功能实例

    VUE利用vuex模拟实现新闻点赞功能实例

    本篇文章主要介绍了VUE利用vuex模拟实现新闻点赞功能实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 详解element-ui设置下拉选择切换必填和非必填

    详解element-ui设置下拉选择切换必填和非必填

    这篇文章主要介绍了详解element-ui设置下拉选择切换必填和非必填,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • axios 发 post 请求,后端接收不到参数的完美解决方案

    axios 发 post 请求,后端接收不到参数的完美解决方案

    这篇文章主要介绍了axios 发 post 请求,后端接收不到参数的解决方案,场景很简单,就是一个正常 axios post 请求,本文给大家分享问题原因分析及解决方案需要的朋友可以参考下
    2022-12-12
  • vue3获取当前路由地址的两种方法

    vue3获取当前路由地址的两种方法

    近期在做ve3的项目时因为功能需要,需要获取当前路由的地址,下面这篇文章主要给大家介绍了关于vue3获取当前路由地址的两种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 一看就会的vuex实现登录验证(附案例)

    一看就会的vuex实现登录验证(附案例)

    这篇文章主要介绍了一看就会的vuex实现登录验证(附案例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • vue中多个文件下载实现打包压缩下载示例

    vue中多个文件下载实现打包压缩下载示例

    这篇文章主要为大家介绍了vue中多个文件下载实现打包压缩下载的发发示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Element UI/Plus中全局修改el-table默认样式的解决方案

    Element UI/Plus中全局修改el-table默认样式的解决方案

    element ui官方封装好的el-table组件,好用是挺好用的,但不可避免的是默认的样式,下面这篇文章主要给大家介绍了关于Element UI/Plus中全局修改el-table默认样式的解决方案,需要的朋友可以参考下
    2023-02-02
  • 浅谈Vue入门需掌握的知识

    浅谈Vue入门需掌握的知识

    这篇文章主要介绍了浅谈Vue入门需掌握的知识,感兴趣的同学参考下
    2021-04-04

最新评论