js幸运大转盘开发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js幸运大转盘开发相关的知识,希望对你有一定的参考价值。

最终效果实例下载:http://www.oschina.net/code/snippet_2352644_54997

 

一.大转盘准备工作

网上的一个抽奖大转盘实例http://www.jq22.com/yanshi2252

这就是我们要开发的效果,不过我们是让指针转,我们先分析这个效果:

  1. 结构有2部分,上面是指针背景图,下面是奖项图

  2. 点击指针元素开始抽奖,会转动一定圈数停下来

  3. 停下来的位置指针指使那个奖项,就会弹出获奖信息提示

这是参考效果,我们分析自己的大概实现:

  1. 同样上下2部分

  2. 点击指针转动,不过是指针动

  3. 转动一定圈数停止

  4. 根据指向弹出获奖信息

  5. 设置抽奖次数,假如只能三次

  6. 设置不同奖项中奖概率

在最后我们在写一个九宫格大转盘

 

二.如何转起来

转就是css3的2d旋转处理,css3就不写了,看下面。

 

三.静态结构搭建

问题出现了,那就是两张图,一个奖项图,一个指针图,不能设计不可怕,我们直接把参考效果的扒取下来就好了,省略下载操作,我们已经有图了,请下载。

back.png

技术分享

pointer.png

技术分享

书写我们的静态结构,背景图目录看css设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>幸运大转盘抽奖</title>
    <style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
#box{ width:531px; height:531px; margin:50px auto;position:relative; background:url(images/back.png) no-repeat left top;}
#zhizhen{ width:174px; height:228px; position:absolute;background:url(images/pointer.png) no-repeat left top; 
left:178.5px; z-index:999; cursor:pointer; top:132.5px;
transform-origin:87px 133px;}
#zhizhen{animation:animations 2s linear infinite forwards;transform:rotate(0deg);}
@keyframes animations{
    0%{transform:rotate(0deg);}
    100%{transform:rotate(360deg);}
}
</style>
</head>
<body>
    <!--幸运大转盘抽奖-->
    <div id="box">
     <div id="zhizhen"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //幸运大转盘抽奖
  
  
};
</script>
</html>

一个基于css3动画配合2d变化的旋转指针就出现了,下面我们将分析top ,left,旋转圆心为何如此设置的。

 

四.静态结构重要样式分析

技术分享

红线的就是最核心样式,首先是top和left的设置:

技术分享

这不需要太多解释吧,篮框就是我们指针,我们摆正后测量就可以了,

注意:一定要1px无偏差摆正,不然旋转时就跑偏了!

我们把指针已经放在中心位置,因为图不是正方形,需要具体测量,可见把指针处理为正方形会大大简化我们的处理。

技术分享

这就是旋转圆心位置,指针是非正方形,我们的测量位置就是在中心圆中心,不过y要加上偏差。

什么是旋转圆心?我们在桌子上摆好一个日记本,然后按住一个点,日记本转动,按住的点就是圆心。

为了测试是否可以不跑偏的转动,我们结合动画进行测试。

 

五.利用js开始转起来

我们利用动画已经不停的转了起来,利用js我们如何转动?

一说到js,还说到动,我们要瞬间想到setInterval函数,我们利用间隔函数,动态的不断修改2d变化旋转的角度大小,就可以转起来了,我们同样加入事件的处理,点击后触发转动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>幸运大转盘抽奖</title>
    <style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
#box{ width:531px; height:531px; margin:50px auto;position:relative; background:url(images/back.png) no-repeat left top;}
#zhizhen{ width:174px; height:228px; position:absolute;background:url(images/pointer.png) no-repeat left top; 
left:178.5px; z-index:999; cursor:pointer; top:132.5px;
transform-origin:87px 133px;transform:rotate(0deg);}
</style>
</head>
<body>
    <!--幸运大转盘抽奖-->
    <div id="box">
     <div id="zhizhen"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //幸运大转盘抽奖
 //获得指针元素
 var zhizhen=document.getElementById("zhizhen");
 //存放间隔动画id,用来清除运动
 var dbox=null;
 //间隔动画所用时间,表示转动快慢
 var dtime=2;
 //角度,和css设置对应,初始为0
 var deg=0;
 //变化增量
 var cc=2;
 //监听点击事件
 zhizhen.onclick=function(){
  dbox=setInterval(dong,dtime);
 };
 function dong(){
  deg+=cc;
  zhizhen.style.transform="rotate(" + deg + "deg)";
 }
  
};
</script>
</html>

 

六.转动一定角度后停止

我们知道,转一定圈数后,是要停止的,停止的位置根据指向,会弹出中奖信息提示,先说转,我们是从0一直增加,一说停止肯定是到一个角度不动了,假如是1460角度停止。

换算成圈数就是360度*4圈 +20度,就是赚了4圈多20度。

既然是停止,我们只要到1460时清除间隔函数就可以了,clearInteval的使用,传入间隔id。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>幸运大转盘抽奖</title>
    <style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
#box{ width:531px; height:531px; margin:50px auto;position:relative; background:url(images/back.png) no-repeat left top;}
#zhizhen{ width:174px; height:228px; position:absolute;background:url(images/pointer.png) no-repeat left top; 
left:178.5px; z-index:999; cursor:pointer; top:132.5px;
transform-origin:87px 133px;transform:rotate(0deg);}
</style>
</head>
<body>
    <!--幸运大转盘抽奖-->
    <div id="box">
     <div id="zhizhen"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //幸运大转盘抽奖
 //获得指针元素
 var zhizhen=document.getElementById("zhizhen");
 //存放间隔动画id,用来清除运动
 var dbox=null;
 //间隔动画所用时间,表示转动快慢
 var dtime=2;
 //角度,和css设置对应,初始为0
 var deg=0;
 //变化增量
 var cc=2;
 //停止时的角度
 var stopdeg=1460; 
 //监听点击事件
 zhizhen.onclick=function(){
  dbox=setInterval(dong,dtime);
 };
 function dong(){
  deg+=cc;
  if(deg>stopdeg){
   clearInterval(dbox);
  }else{
   zhizhen.style.transform="rotate(" + deg + "deg)";
  };  
 }
  
};
</script>
</html>

 

六.停止角度转为圈数+角度

我们上面也提到了1460就是4圈+20度,这个停止角度如此表示之后

1
2
3
4
5
6
//旋转基本圈数
 var quan=4;
 //多余角度
 var odeg=20;
 //停止时的角度
 var stopdeg=quan*360+odeg;

采用这种设置以后,我们可以自定义旋转圈数,比如基本圈数是6圈,同样停止额外角度也可自定义,比如是80度:

1
2
3
4
5
6
//旋转基本圈数
 var quan=6;
 //多余角度
 var odeg=80;
 //停止时的角度
 var stopdeg=quan*360+odeg;

下面是修改后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>幸运大转盘抽奖</title>
    <style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
#box{ width:531px; height:531px; margin:50px auto;position:relative; background:url(images/back.png) no-repeat left top;}
#zhizhen{ width:174px; height:228px; position:absolute;background:url(images/pointer.png) no-repeat left top; 
left:178.5px; z-index:999; cursor:pointer; top:132.5px;
transform-origin:87px 133px;transform:rotate(0deg);}
</style>
</head>
<body>
    <!--幸运大转盘抽奖-->
    <div id="box">
     <div id="zhizhen"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //幸运大转盘抽奖
 //获得指针元素
 var zhizhen=document.getElementById("zhizhen");
 //存放间隔动画id,用来清除运动
 var dbox=null;
 //间隔动画所用时间,表示转动快慢
 var dtime=2;
 //角度,和css设置对应,初始为0
 var deg=0;
 //变化增量
 var cc=2;
 //旋转基本圈数
 var quan=6;
 //多余角度
 var odeg=80;
 //停止时的角度
 var stopdeg=quan*360+odeg; 
 //监听点击事件
 zhizhen.onclick=function(){
  dbox=setInterval(dong,dtime);
 };
 function dong(){
  deg+=cc;
  if(deg>stopdeg){
   clearInterval(dbox);
  }else{
   zhizhen.style.transform="rotate(" + deg + "deg)";
  };  
 }
  
};
</script>
</html>

 

六.奖项依据

还是上面的延续,我们设置是6圈+80度,其实6圈我们不用考虑,只是让用户感觉在抽奖的假象,这个80才是我们真实考虑的东西,因为他代表在转盘上指针停在了哪里,要通过停在的位置弹出获奖信息:

技术分享

80度的位置和其实参考如图所示。

毫无疑问,0-6这7个奖项在0-360之间各占一定的区间,我们需要测量出来,例如:

0等奖:0-50度

6等奖:51-101度 等等一次类推

我们选择的图毫无疑问是失败的,若果是6等分,我们直接就算出来了(360*6),可是7份(360/7尴尬)的就要实际测量:

1
2
3
4
5
6
7
8
9
10
//区间奖项 
var jiang=[
  [1,51,"未中奖"], //未中奖
  [52,102,"6等奖"],//6等奖
  [103,153,"5等奖"],//5等奖
  [154,203,"4等奖"],//4等奖
  [204,251,"3等奖"],//3等奖
  [252,307,"2等奖"],//2等奖
  [307,360,"1等奖"]//1等奖
 ];

我们奖项和角度对应关系,我们现在是80度,那么就是6等奖

 

六.奖项判断

我们会在80度位置停止,我们的依据就是上面的数组,我们要写一个判定函数,去自动判断是几等奖,这样就非常的方便了,我们把80改为150也许自己判定结果。

1
2
3
4
5
6
7
8
9
10
//奖项判定函数
 function is(deg){
  var res="未中奖";
  for(var i=0;i<jiang.length;i++){
   if(deg>=jiang[i][0] && deg<jiang[i][1]){
    res=jiang[i][2];
   };
  };
  return res;
 };

我们在停止时弹出提示

1
2
3
4
5
6
if(deg>stopdeg){
   clearInterval(dbox);
   alert(is(odeg));
  }else{
   zhizhen.style.transform="rotate(" + deg + "deg)";
  };

修改后全部代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>幸运大转盘抽奖</title>
    <style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ li

以上是关于js幸运大转盘开发的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序项目实例——幸运大转盘

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

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

我想在微信公众平台弄一个幸运大转盘活动,该怎么弄呢??

Go·活动 |大家好,给大家介绍一下,这是你的初冬小确幸@幸运大转盘

小杜说技术——天轶说家庭趣味编程游戏 幸运大转盘(上)