转盘式旋转抽奖

  转盘式抽奖的第一个问题是随机数个奖品在转盘上的定位,当然每个点的坐标是可以计算出来的:

  

  不过在js中不需要这么繁琐,有n个奖品,一个圆360度,所以每个奖品之间的夹角是 360 / (n - 1)度,也就是说每个奖品相对中心旋转一定角度就可以了。

  如果在canvas中那么可以自定义中心位置,如果用js的话,我目前为了演示采取的做法是每个点绝对定位在父元素顶部的中部(0, 50%),设置高度和父元素相同,这样变形原点就在父元素的(50%,50%)处了(不改动transform-origin的话)。

  跑马灯式抽奖效果的实现要简单许多,因为原理就是将当前的高亮元素重置,并使下一个元素高亮,这样可以在setInerval()中根据高亮次数(每个元素高亮一次,次数加1)来调整间隔。转盘式抽奖的问题在于转盘减速到选中奖品这个过程中角度差异最大达到360度,所以抽奖间隔不是很好控制。所以最终我把减速这段效果给去除了。

  给出的代码里各位不能自定义奖品的样式,因为li标签的样式是用来保证变形原点的,当然可以在li标签内加上一个span标签,在span标签内自定义奖品样式或者用图片,如果这样实现的话,那么推荐在操作DOM的时候使用innerHTML,类似innerHTML += ‘xxx‘,然后一次性加到父元素的节点下,我这里给个演示图片:

  

  下面给出代码,目前的抽奖效果不是很好,之后会想想换用animaion来实现。

  

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>lottery</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="format-detection" content="telephone=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<style>
/*css reset*/
html{font-family:"Helvetica Neue",Helvetica,STHeiTi,sans-serif;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;}
body{-webkit-overflow-scrolling:touch;margin:0;}
ul{margin:0;padding:0;list-style:none;outline:none;}
dl,dd{margin:0;}
a{display:inline-block;margin:0;padding:0;text-decoration:none;background:transparent;outline:none;color:#000;}
a:link,a:visited,a:hover,a:active{text-decoration:none;color:currentColor;}
a,dt,dd{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;}
img{border:0;}
p{margin:0;}
input,button,select,textarea{margin:0;padding:0;border:0;outline:0;background-color:transparent;}

/*css*/
body {
    height: 100vh;
    text-align: center;
}
.wrapper {
    margin: 0 auto;
    padding: 40px 0;
    max-width: 750px;
}
.wrapper .lottery {
    position: relative;
    display: inline-block;
    width: 600px;
    height: 600px;
    border: 1px solid #f0f0f0;
    border-radius: 50%;
    background-color: #f0f0f0;
    box-sizing: border-box;
}
.wrapper .lottery .list {
    position: absolute;
    top: 0;
    left: 300px;
    width: 0;
    height: 600px;
}
</style>
</head>
<body>
<div class="wrapper">
    <ul class="lottery">
    </ul>
</div>
<script>
    var doc = document,
        fragment = doc.createDocumentFragment(),
        $ = function(node) {
            return doc.querySelector(node);
        };

    var lotteryList = [0, 1, 2, 3, ,4],
        length = lotteryList.length,
        averRotate = 360 / (length - 1);

    lotteryList.forEach(function(i) {
        var node = doc.createElement(‘li‘);
        node.setAttribute(‘id‘, ‘list‘ + i);
        node.setAttribute(‘class‘, ‘list‘);
        node.innerHTML = i;
        fragment.appendChild(node);
    })

    $(‘.lottery‘).appendChild(fragment);

    lotteryList.forEach(function(i) {
        $(‘#list‘ + i).style.transform = ‘rotate(‘ + i * averRotate + ‘deg)‘;
    })

    var speed = 40,
        i = 0,
        angle = 0,
        drawn = Math.floor(Math.random() * length);
        lotteryTimer = setInterval(lotterFunc, speed);

    function lotterFunc() {
        $(‘.lottery‘).style.transform = ‘rotate(‘ + ++angle + ‘deg)‘;
        if (angle % 360 == 0) {
            i++;
        }
        if ((angle % 5 == 0) && speed > 10) {
            clearInterval(lotteryTimer);
            speed -= 1;
            lotteryTimer = setInterval(lotterFunc, speed);
        } else if (angle == (720 + drawn * averRotate)) {
            clearInterval(lotteryTimer);
        }
    }
</script>
</body>
</html>
时间: 2024-08-01 10:27:34

转盘式旋转抽奖的相关文章

旋转抽奖效果

近期写的一个旋转抽奖的程序,贴出来让大家看看,那些的不好的,可以指出,相互交流. 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3

利用jQueryRotate旋转插件开发大转盘抽奖

前言: 公司原来开发大转盘抽奖活动用的是flash 我发现swf文件竟然有6m大,吓尿了! 其实完全可以用js写的,但是自身前端功力有限,且时间紧迫,所以直接用旋转插件就好,兼容各方面都可以保证. 1.引用Jquery.js .jQueryRotate.2.2.js 插件 2.html代码: <div style="width: 480px;margin: 0 auto;height: 480px;background:url(http://weixin.maotui.cn/web/wec

物体旋转后缓慢停在指定角度的实现

可指定物体的旋转时间速度停下角度,可以参考来实现转盘抽奖或图片翻转打开等效果. 1 using UnityEngine; 2 using System.Collections; 3 4 public class Rotate : MonoBehaviour 5 { 6 public float targetAngle = 180f; 7 public float spinSpeed = 6f; 8 public float stopSpeed = 2f; 9 public float durat

jquery实现抽奖

用jquery实现抽奖小程序 用jquery实现抽奖小程序 这些日子,到处都可以看到关于微信小程序的新闻或报到,在博客园中写关于微信小程序的也不少.但是今天我要说的不是微信小程序,而是用简单的jquery写的一个好玩的抽奖小程序.最后介绍了后面关于抽奖小程序的一些后面更新的方向和Math.random的一些小知识.(最终结果保存在:http://runjs.cn/detail/rq3bbhto,点击可查看效果) 下面先看一个简单的抽奖小程序的例子: html: <div class="g-

纯CSS3大转盘抽奖(响应式、可配置)

源于前段时候微信小程序最初火爆公测时段,把以前用 Canvas 实现的大转盘抽奖移植成微信小程序,无奈当时小程序对 Canvas 支持不够完善,只好降低用 CSS3 实现.虽然比不上 Canvas 绘图的绚丽,但也总算完成了一个抽奖的 Demo,详见:https://github.com/givebest/wechat-turntalbe-canvas. 事后想起,CSS3 实现也并不是无有益处,比如简单.快捷.调试方便.渲染想来也是要比 Canvas 要高效的,更重要的一点是支持媒体查询,大转

抽奖软件

抽奖软件,实现翻牌效果 DEMO <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>CSS3-3D旋转</title> <style type="text/css"> *{marg

利用java实现抽奖转盘(着重安全控制)

本文是针对jquery 实现抽奖转盘作者的一个补充(主要用java去实现转盘结果生成及存储,解决jquery 做法 非法用户采用模拟器实现改变转盘值的风险性),针对jQuery的具体实现,请看案例:http://www.cnblogs.com/mofish/archive/2013/01/24/2875516.html              本文就不一一细说了,那么现在就直入正题. 由于公司产品推广,最近要求实现一个邀请用户注册即可抽奖的转盘,页面展示如下: java 实现方式如下: 构造实

canvas转盘抽奖

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>html5 canvas圆形转盘抽奖特</title> 6 </head> 7 <body> 8 <div style="w

大转盘抽奖

这周做了2个大转盘抽奖,一个使用了jQueryRotate.2.2.js插件,兼容到IE6,另外一个利用css3自己尝试写的 1.插件jQueryRotate.2.2.js(兼容基本浏览器,兼容到IE6) 效果查看: 此插件必须事先引入jquery插件,PC端推荐 JS插件代码: // VERSION: 2.2 LAST UPDATE: 13.03.2012 /* * Licensed under the MIT license: http://www.opensource.org/licens