转盘抽奖主要有两种,指针转动和转盘转动,个人觉得转盘转动比较好看点,指针转动看着头晕,转盘转动时指针是在转盘的中间位置,这里要用到css的transform属性和transition属性,这两个因为不常用最好是上网查查,用法和功能。

在html部分

  

  1. <div id="wheel_surf">
  2. <div class="wheel_surf_title">幸运大转盘</div>
  3. <div class="lucky-wheel">
  4. <div class="wheel-main">
  5. <div class="wheel-pointer-box">
  6. <div class="wheel-pointer" @click="rotate_handle()" :style="{transform:rotate_angle_pointer,transition:rotate_transition_pointer}"></div>
  7. </div>
  8. <div class="wheel-bg" :style="{transform:rotate_angle,transition:rotate_transition}">
  9. <div class="prize-list">
  10. <div class="prize-item" v-for="(item,index) in prize_list" :key="index">
  11. <div class="prize-pic" v-if="item.icon">
  12. <img :src="item.icon" />
  13. </div>
  14. <div class="prize-type">
  15. {{item.name}}</div>
  16. </div>
  17. </div>
  18. </div>
  19. </div>
  20. </div>
  21. <div v-transfer-dom>
  22. <x-dialog v-model="showHideOnBlur" class="dialog-demo wheel_dialog" hide-on-blur>
  23. <div class="img-box">
  24. <div v-show="val == 7" class="noactive">
  25. <p>谢谢参与!祝您下次好运</p>
  26. </div>
  27. <div v-show="val !== 7">
  28. <p>恭喜你</p>
  29. <img :src="imgActive" />
  30. <p>{{item.rewardDesc}}</p> // 获奖返回值
  31. </div>
  32. </div>
  33. <div @click="showHideOnBlur=false">
  34. <span class="vux-close"></span>
  35. </div>
  36. </x-dialog>
  37. </div>
  38. </div>

  奖项数据

这里的第一个style部分是指针的位置,距离转动的初始值,是固定不变的,第二个style是转盘的位置transform:rotate_angle是转盘转动的角度,transition:rotate_transition是转动的时候它的转动速度,方向,等等属性。rotate_handle()是点击开始转动的事件。prize_list是转盘上面的奖品图片名字列表。

  data:

  1. prize_list: [
  2.  
  3. {
  4.  
  5. icon: require("../../../../static/WX/img/wheel_big_5.png"), // 奖品图片
  6.  
  7. count: , // 奖品级别
  8.  
  9. name: "五等奖", // 奖品名称
  10.  
  11. isPrize: // 该奖项是否为奖品
  12.  
  13. },
  14.  
  15. {
  16.  
  17. icon: require("../../../../static/WX/img/wheel_big_2.png"),
  18.  
  19. count: ,
  20.  
  21. name: "二等奖",
  22.  
  23. isPrize:
  24.  
  25. },
  26.  
  27. {
  28.  
  29. icon: require("../../../../static/WX/img/wheel_big_4.png"),
  30.  
  31. count: ,
  32.  
  33. name: "四等奖",
  34.  
  35. isPrize:
  36.  
  37. },
  38.  
  39. {
  40.  
  41. icon: require("../../../../static/WX/img/wheel_big_1.png"),
  42.  
  43. count: ,
  44.  
  45. name: "一等奖",
  46.  
  47. isPrize:
  48.  
  49. },
  50.  
  51. {
  52.  
  53. icon: require("../../../../static/WX/img/wheel_big_6.png"),
  54.  
  55. count: ,
  56.  
  57. name: "六等奖",
  58.  
  59. isPrize:
  60.  
  61. },
  62.  
  63. {
  64.  
  65. count: ,
  66.  
  67. name: "谢谢参与",
  68.  
  69. isPrize:
  70.  
  71. },
  72.  
  73. {
  74.  
  75. icon: require("../../../../static/WX/img/wheel_big_3.png"),
  76.  
  77. count: ,
  78.  
  79. name: "三等奖",
  80.  
  81. isPrize:
  82.  
  83. }
  1. ], //奖品列表
  2.  
  3. hasPrize: false, //是否中奖
  4.  
  5. start_rotating_degree: , //初始旋转角度
  6.  
  7. rotate_angle: , //将要旋转的角度
  8.  
  9. start_rotating_degree_pointer: , //指针初始旋转角度
  10.  
  11. rotate_angle_pointer: , //指针将要旋转的度数
  12.  
  13. rotate_transition: "transform 6s ease-in-out", //初始化选中的过度属性控制
  14.  
  15. rotate_transition_pointer: "transform 12s ease-in-out", //初始化指针过度属性控制
  16.  
  17. click_flag: true, //是否可以旋转抽奖
  18.  
  19. item: {}

  methods:

  

  1. rotating(index) {
  2.  
  3. if (!this.click_flag) return;
  4.  
  5. var type = ; // 默认为 0 转盘转动 1 箭头和转盘都转动(暂且遗留)
  6.  
  7. var during_time = ; // 默认为1s
  8.  
  9. var random = Math.floor(Math.random() * );
  10.  
  11. var result_index
  12.  
  13. result_index = this.val
  14.  
  15. if (this.val == ) { // 这里多余可以不写
  16.  
  17. result_index =
  18.  
  19. } else if (this.val == ) {
  20.  
  21. result_index =
  22.  
  23. } else if (this.val == ) {
  24.  
  25. result_index =
  26.  
  27. } else if (this.val == ) {
  28.  
  29. result_index =
  30.  
  31. } else if (this.val == ) {
  32.  
  33. result_index =
  34.  
  35. } else if (this.val == ) {
  36.  
  37. result_index =
  38.  
  39. } else if (this.val == ) {
  40.  
  41. result_index =
  42.  
  43. }
  44.  
  45. this.valindex = result_index // // 最终要旋转到哪一块
  46.  
  47. var result_angle = [, , , , , , ]; //最终会旋转到下标的位置所需要的度数,从指针初始位置开始算度数,顺时针或逆时针
  48.  
  49. var rand_circle = ; // 附加多转几圈,2-3
  50.  
  51. this.click_flag = false; // 旋转结束前,不允许再次触发
  52.  
  53. if (type == ) {
  54.  
  55. // 转动盘子
  56.  
  57. var rotate_angle =this.start_rotating_degree + rand_circle * +result_angle[result_index] - this.start_rotating_degree % ;
  58.  
  59. this.start_rotating_degree = rotate_angle;
  60.  
  61. this.rotate_angle = "rotate(" + rotate_angle + "deg)";
  62.  
  63. var that = this;
  64.  
  65. // 旋转结束后,允许再次触发
  66.  
  67. setTimeout(function() {
  68.  
  69. that.click_flag = true;
  70.  
  71. that.game_over();
  72.  
  73. }, during_time * + ); // 延时,保证转盘转完
  74.  
  75. } else {
  76.  
  77. //
  78.  
  79. }
  80.  
  81. }

js部分主要是转动停止的角度rotate_angle ,第一次是从0开始到一个角度,在这个角度的基础上到下一个角度,所以会减去上一个角度对圆的取余,这里面this.val是代表着奖品等级,result_index是对应的旋转到的角度,因为旋转是顺时针,所以角度的选择要逆时针的选取。转完调用that.game_over();函数来获取奖品count等级。

下面方法为处理奖品数据

  旋转停下来时调用game_over()函数

  1. rotate_handle() {
  2.  
  3. api.activityget(param).then(res => {
  4.  
  5. if (res.status == || res.status == '') {
  6.  
  7. this.item = res.data
  8.  
  9. this.val = res.data.rewardLevel // 获取获奖等级
  10.  
  11. this.rotating(); //开始旋转
  12.  
  13. } else {
  14.  
  15. this.$vux.alert.show({
  16.  
  17. title: '提示',
  18.  
  19. content: res.message,
  20.  
  21. })
  22.  
  23. }
  24.  
  25. })
  26.  
  27. }

下面是css部分,根据你的奖品等级和数量自动调整距离左边和顶部距离和转动角度。

  1. <style scoped>
  2.  
  3. .wheel-main {
  4.  
  5. display: flex;
  6.  
  7. align-items: center;
  8.  
  9. justify-content: center;
  10.  
  11. position: relative;
  12.  
  13. }
  14.  
  15. .wheel-bg {
  16.  
  17. width: 8rem;
  18.  
  19. height: 8rem;
  20.  
  21. background: url("../../../static/img/draw_wheel.png") no-repeat center top;
  22.  
  23. background-size: %;
  24.  
  25. color: #fff;
  26.  
  27. font-weight: ;
  28.  
  29. display: flex;
  30.  
  31. flex-direction: column;
  32.  
  33. justify-content: center;
  34.  
  35. align-content: center;
  36.  
  37. transition: transform 3s ease;
  38.  
  39. }
  40.  
  41. .wheel-pointer-box {
  42.  
  43. position: absolute;
  44.  
  45. top: %;
  46.  
  47. left: %;
  48.  
  49. z-index: ;
  50.  
  51. transform: translate(-%, -%);
  52.  
  53. }
  54.  
  55. .wheel-pointer {
  56.  
  57. width: .5rem;
  58.  
  59. height:.2rem;
  60.  
  61. background: url("../../../static/img/btn_start_n.png") no-repeat ;
  62.  
  63. background-size: %;
  64.  
  65. transform-origin: center %;
  66.  
  67. }
  68.  
  69. .wheel-bg div {
  70.  
  71. text-align: center;
  72.  
  73. }
  74.  
  75. .prize-list {
  76.  
  77. width: %;
  78.  
  79. height: %;
  80.  
  81. position: relative;
  82.  
  83. }
  84.  
  85. .prize-list .prize-item {
  86.  
  87. position: absolute;
  88.  
  89. top: ;
  90.  
  91. left: ;
  92.  
  93. z-index: ;
  94.  
  95. }
  96.  
  97. .prize-list .prize-item:first-child {
  98.  
  99. top: .95rem;
  100.  
  101. left: .9rem;
  102.  
  103. transform: rotate(-20deg);
  104.  
  105. }
  106.  
  107. .prize-list .prize-item:nth-child() {
  108.  
  109. top: .4rem;
  110.  
  111. left: 5rem;
  112.  
  113. transform: rotate(40deg);
  114.  
  115. }
  116.  
  117. .prize-list .prize-item:nth-child() {
  118.  
  119. top: .2rem;
  120.  
  121. left: .95rem;
  122.  
  123. transform: rotate(-270deg);
  124.  
  125. }
  126.  
  127. .prize-list .prize-item:nth-child() {
  128.  
  129. top: .08rem;
  130.  
  131. left: .1rem;
  132.  
  133. transform: rotate(-225deg);
  134.  
  135. }
  136.  
  137. .prize-list .prize-item:nth-child() {
  138.  
  139. top: .8rem;
  140.  
  141. left: .2rem;
  142.  
  143. transform: rotate(-170deg);
  144.  
  145. }
  146.  
  147. .prize-list .prize-item:nth-child() {
  148.  
  149. top: .7rem;
  150.  
  151. left: .5rem;
  152.  
  153. transform: rotate(-115deg);
  154.  
  155. }
  156.  
  157. .prize-list .prize-item:nth-child() .prize-type{
  158.  
  159. font-size: .3rem;
  160.  
  161. }
  162.  
  163. .prize-list .prize-item:nth-child() {
  164.  
  165. top: .4rem;
  166.  
  167. left: .2rem;
  168.  
  169. transform: rotate(-69deg);
  170.  
  171. }
  172.  
  173. .prize-list .prize-item:nth-child() img{
  174.  
  175. width: .7rem;
  176.  
  177. }
  178.  
  179. .prize-list .prize-item:nth-child() {
  180.  
  181. top: .1rem;
  182.  
  183. left: .6rem;
  184.  
  185. transform: rotate(-20deg);
  186.  
  187. }
  188.  
  189. .prize-pic img {
  190.  
  191. width: .8rem;
  192.  
  193. }
  194.  
  195. .prize-count {
  196.  
  197. font-size: .4rem;
  198.  
  199. }
  200.  
  201. .prize-type {
  202.  
  203. font-size: 10px;
  204.  
  205. }
  206.  
  207. </style>

Vue 幸运大转盘的更多相关文章

  1. jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现

    jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现 在线实例 查看演示 完整代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  2. asp.net+jQueryRotate开发幸运大转盘

    在线抽奖程序在很多网站上很多,抽奖形式多种多样,Flash抽奖偏多,本文将给大家介绍jQuery转盘抽奖,结合代码实例将使用jQuery和asp.net来实现转盘抽奖程序,为了便于理解,文章贴出实现源 ...

  3. PHP幸运大转盘源码,支持ThinkPHP

    原理 先看图 可以看到1-6等奖都只有1个 ,7等奖有6个.指针默认指向上图位置,记为0°. 每个奖项对应不同的角度,圆的角度为360°,分成12块,所以每块为30°. 为了防止指针指着相邻两个将向之 ...

  4. html5简单拖拽实现自动左右贴边+幸运大转盘

    此篇文章主要实现两个功能: 1.点击屏幕下方签到悬浮按钮: 2.弹出幸运大转盘,转盘抽奖签到 效果如图: ​ 在网上找了很多移动端拖拽的js实现方式,大部分都是这一种,html5的touch事件,但是 ...

  5. PHP+AJAX开发幸运大转盘抽奖

    PHP+AJAX开发幸运大转盘抽奖,通过奖品库存.中奖次数来计算中奖概率 奖品设置 $prizes = array( 0 => array( "id" => 0, // ...

  6. C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断

    C#保留2位小数几种场景总结   场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2 ...

  7. 跟我一起学编程—《Scratch编程》第24课:幸运大转盘

    同学你好,欢迎来到<跟我一起学编程>,我是包老师.这是<Scratch3.0编程>课程的第24课,我这节课教你做一个抽奖游戏:幸运大转盘. 学习目标: 1. 能够熟练使用造型工 ...

  8. 幸运大转盘-jQuery+PHP实现的抽奖程序

    目前好多网站上应用的转盘抽奖程序大多是基于flash的,而本文结合实例将使用jQuery和PHP来实现转盘抽奖程序,为了便于理解,作者分两部分来讲解,本文讲解第一部分,侧重使用jQuery实现转盘的转 ...

  9. WP8.1&Win10幸运大转盘源码分享

    先AD一下我的群:Win10开发者群:53078485 最近在写一个APP,其中需要一个转盘动画的源码,找了很多但是都没有找到,无奈只好自己来写,写完效果自己还是比较满意的,分享出来,有需要的童鞋可以 ...

随机推荐

  1. python学习-while True语句

    while True是不会跳出循环的. 在while中括号里为一个条件值,只有当条件为真的时候,会执行这条语句,直到条件为false的时候,则会跳出该循环语句.而在这里括号里的值为true,也就意味着 ...

  2. 你真的了解java序列化吗

    问:可是我这个实体类,没有实现序列化那个接口,也能存到数据库,这是为什么呢? 想不通!我是用的注解和hibernate框架弄的! 难道说不实现序列化接口也能保存数据?不应该啊. @Entity pub ...

  3. 关于ESET占用CPU严重 的解决方案||ESET CPU 100%||用迅雷时ESET占用CPU(6月22日再次更新)

    关于ESET占用CPU严重 的解决方案 本文根据原帖有适量删改. ESET 的杀毒软件历来以占用资源少,CPU消耗少著称,可是很多朋友(特别是中国大陆的朋友)反应ESS & EAV 间歇性占用 ...

  4. JdbcTemplate实现增删改查操作

    JdbcTemplate介绍 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架,Spring Boot Spring Data-JP ...

  5. 计算机网络(1)- TCP

    TCP的全称是传输控制协议(Transmission Control Protocol)[RFC 793] TCP提供面向连接的服务.在传送数据之前必须先建立连接,数据传送结束后要释放连接.TCP不提 ...

  6. ApplicationContextAware使用理解

    接口的作用 当一个类实现了这个接口(ApplicationContextAware)之后,Aware接口的Bean在被初始之后,可以取得一些相对应的资源,这个类可以直接获取spring 配置文件中 所 ...

  7. 6、pytest -- 临时目录和文件

    目录 1. 相关的fixture 1.1. tmp_path 1.2. tmp_path_factory 1.3. tmpdir 1.4. tmpdir_factory 1.5. 区别 2. 默认的基 ...

  8. CentOS6.5下安装JDK1.7+MYSQL5.5+TOMCAT7+nginx1.7.5环境安装文档

    ----------------CentOS6.5下安装JDK1.7+MYSQL5.5+TOMCAT7+nginx1.7.5环境安装文档----------------------- [JDK1.7安 ...

  9. 暑期集训20190725 加法(add)

    [题目描述] 数学课,黑板上写着n个数字,记为A1到An,fateice会重复以下操作若干次: 1. 选择两个奇偶性相同的整数Ai和Aj, 将他们擦去 2. 将Ai+Aj写在黑板上 问黑板上最终是否有 ...

  10. UVA12433 【Rent a Car】

    这题应该算是比较难的一道网络流的题,(但却在我校OJ考试上出现了),但是大家只要能理解此图的建边方式就行. 假设有5天的租车需求,虚拟出2*n+2 即 12个节点,0为源点,12为汇点. 1,源点到1 ...