vue抽奖大转盘,vue抽奖程序_1

  vue抽奖大转盘,vue抽奖程序

  本文主要详细介绍vue对转盘抽奖的简单实现。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

  本文分享vue简单实现转盘抽奖的具体代码,供大家参考。具体内容如下

  

1.0 思路整理

  彩票很常见,我以前没写过。现在我有时间写了。分析如下:

  1.1转盘旋转-可以通过旋转变换来解决。

  1.2旋转动画-过渡过渡处理

  1.3停留在目标位置和获胜提示?-通过控制旋转角度来控制停止位置,并提示中奖。请考虑添加回拨。

  1.1 开始行动

  从上面的思考,我们知道了要实现的步骤。首先,我们来做一张图。

  这张盘有10份,每份都是360/10=36deg。如果想停留在第二个-20金币,顺时针方向(包括初始位置,计为1),需要旋转 (2 - 1)* 36 = 36。这样就可以得到停留位置需要旋转的角度 = (target - 1)*36。

  1.2 中奖回调

  以上步骤,我们知道如何控制到目标位置,那么下一步就是事件通知了。一开始我们想到的是固定自转时间,然后启动定时器,这显然不靠谱。动画结束后有什么可以通知的吗?Transitionend,我发现了这个事件,可以监听元素动画的end事件,但是很容易处理一些与这个事件的兼容性。

  /**

  动画结束事件兼容性

  **/

  whichTransitionEvent(){

  设El=document . createelement( span ),

  过渡={

  “过渡”:“过渡结束”,

   OTransition:oTransitionEnd ,

  “moz transition”:“transitionend”,

  “WebkitTransition”:“webkitTransitionEnd”

  };

  for(让t在过渡中){

  if( el.style[t]!==未定义){

  返回转换[t];

  }

  }

  el=null

  }

  

2.0 完整示例

  我们找到了控制旋转位置和通知事件的方法。开始吧!

  栗子:

  完全码

  模板

  差异

  H3转盘彩票/h3

  div class=round_box

   img class= img _ rotate ref= rotImg src=./assets/zhuan.png alt=

  div class=中心

  div class=pointer /div

  /div

  /div

  Button @click=toDraw 点击彩票/按钮

  /div

  /模板

  脚本

  导出默认值{

  名称:“rotaryDraw”,

  data() {

  返回{

  旋转:0,

  重置:0,

  hitId: 1,//1-10

  drawStatus: false

  }

  },

  异步装载(){

  等待这个。$ next tick();

  let event transition=this . which transitionevent();

  让img=这个。$ refs.rotImg

  让那个=这个;

  Const hitAre=[30M流量包, 20金币, 20M流量包, 10M流量包, 5金币,

  感谢您的参与, 10金币, 50M流量包, 2金币, 100M流量包

  ];

  //监控动画结束

  img . addevent listener(event transition,tranHand,false);

  函数tranHand() {

  //重置

  that.resetRotate=that .旋转360?that . rotate % 360:0;

  img . style . transition= none 0s ease 0s ;

  img . style . transform=` rotate($ { that . reset rotate } deg)`;

  Alert(`抽奖结果[$ { hitAre[that . hitid-1]}]`);

  that.drawStatus=false

  }

  },

  方法:{

  start() {

  这个。$ refs . rot img . style . transition= all 3s ease 0s ;

  这个。$ refs . rotimg . style . transform=` rotate($ { this . rotate } deg)`;

  },

  toDraw() {

  if(this.drawStatus){

  Console.log(中彩票);

  返回

  }

  //标记状态

  this.drawStatus=true

  /**

  *总共10个光盘,每个36度,停车位置(id)度(id-1)*36

  *底座3圈360*4

  * this .旋转当前角度

  * **/

  设reset=360 * 4;

  设idx=this.getRandomInt(1,11);

  //设置点击

  this.hitId=idx

  //需要转更多的角度

  让addRotate=this.resetRotate 0?360-this . reset rotate:0;

  //总角度

  设all rotate=this . rotate(idx-1)* 36 reset add rotate;

  //角度限制

  this . rotate=this . set rotate(all rotate);

  this.start()

  },

  //递归计算角度不超过360*6

  setRotate(deg) {

  设rest=deg-360;

  回程休息360*6?this . set rotate(rest):deg;

  },

  getRandomInt(最小值,最大值){

  //向上

  min=math . ceil(min);

  //向下收集

  max=数学。地板(最大);

  回归数学。地板(数学。random()*(max-min))min;//不含最大值,含最小值

  },

  //动画兼容

  whichTransitionEvent(){

  设El=文档。createelement(“span”),

  过渡={

  "过渡":"过渡结束",

   OTransition:oTransitionEnd ,

  《墨子过渡》:“过渡结束”,

  " WebkitTransition ":" webkitTransitionEnd "

  };

  对于(让t在过渡中){

  if( el.style[t]!==未定义){

  返回转换[t];

  }

  }

  el=空

  }

  }

  }

  /脚本

  样式lang=scss 。img_rotate{

  变换:旋转(0度);

  }。圆形框{

  宽度:100%;

  最大宽度:375像素

  位置:相对;

  溢出:隐藏;

  img{

  宽度:100%;

  }。居中{

  位置:绝对;

  top:50%;

  左:50%;

  transform: translate(-50%,-50%);指针{

  宽度:5px

  高度:90px

  背景色:# f40

  位置:绝对;

  top:-90px;

  }。指针:在{

  内容:"";

  宽度:0;

  高度:0;

  边框顶部:15px纯色透明;

  右边框:15px纯色透明;

  边框-底部:15px实心# f40

  边框-左侧:15px纯色透明;

  位置:绝对;

  top:-20px;

  左:50%;

  transform:平移x(-50%);

  }

  }

  }

  /风格

  

3.0 tips

  总体来说有几个点需要注意

  1、动画开始前上锁

  2、动画结束后通知,状态复位

  /**

  比如:

  基数3圈重置360*3

  停留位置第二个(2 - 1)* 36=36

  总共角度360*3 36

  动画停止后,因为还要继续旋转,所以不可能把角度一直增加,因此需要复位

  360*3 36 其实可以考虑就转了36度,然后再增加需要转的角度

  **/

  3、继续旋转,因为我们计算是以30米流量为初始值的,所以在此旋转仍然需要以30米为起点,此时假设现在停留位置是300度,也就是说再转60度,也就回到了初始位置,本人也是按照这个思路进行复位的。

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: