JS 转盘抽奖,加速、减速

 

 

<!doctype html>
<html>
<head>
<meta charset="utf-8">
    <style type="text/css">
        #wrapper
        {
            width: 300px;
            height: 300px;
            position: absolute;
            left: 100px;
            top: 100px;
            
        }
        #board
        {
            width: 300px;
            height: 300px;
            position: absolute;
            left: 0;
            top: 0;
            z-index:999;
        }
        #direct
        {
            width: 300px;
            height: 300px;
        }
        #inner
        {
            width: 150px;
            height: 30px;
            float: right;
            margin-top: 135px;
            background: #f30;
        }
        .prize{
            width: 300px;
            height: 300px;
            position: absolute;
            left: 0;
            top: 0;
        }
        .prize .inner{
            width: 150px;
            height: 30px;
            float: right;
            margin-top: 135px;
            background: #f60;
            line-height:30px;
            text-align:center;
            color:#fff;
        }
    </style>
</head>
<body>
    <div id="wrapper">
        <div id="board">
            <div id="direct">
                <div id="inner">
                    </div>
            </div>
        </div>
    </div>
    <input type="button" value="start" onclick="t.start()" />
    
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script type="text/javascript">
var MSIEBrowser = function()
{
    var rorateIt = function(node,deg)
    {
        //取得末变形前矩形的中点
        var rect = node.getBoundingClientRect(),
        cx1 = (rect.right  - rect.left) / 2, // center x
        cy1 = (rect.bottom - rect.top)  / 2, // center y
        deg2rad =  Math.PI / 180,//角度转弧度
        rad = deg * deg2rad ,
        cos = Math.cos(rad),
        sin = Math.sin(rad);
        var ident  = "DXImageTransform.Microsoft.Matrix";
        node.style.filter = "progid:"+ident +"(M11='1.0',sizingmethod='auto expand')";
        //http://www.satzansatz.de/cssd/onhavinglayout.html
        if(!node.currentStyle.hasLayout){//在IE7中,如果没有获得hasLayout,滤镜会失效
          node.style.writingMode  = "tb-rl";
        }
        var filter = node.filters.item(ident);
        //  +-------+-------+
        //  |  M11  |  M12  |
        //  +-------+-------+
        //  |  M21  |  M22  |
        //  +-------+-------+
        filter.M11 = cos;
        filter.M12 = -sin;
        filter.M21 = sin;
        filter.M22 = cos;
        //取得当前中心
        rect = node.getBoundingClientRect();
        var cx = (rect.right  - rect.left) / 2;
        var cy = (rect.bottom - rect.top)  / 2;
        //调整此元素的坐标系,实现CSS3 transform-origin的功能
        node.style.marginLeft = cx1 - cx + "px";
        node.style.marginTop  = cy1 - cy + "px";
    }
    this.rorateIt = function(node, deg)
    {
        rorateIt(node,0);
        rorateIt(node,deg);
    }
    this.getValue = function()
    {
        return 1;
    }
}
var W3CBrowser = function()
{
    var rorateIt = function(node,deg)
    {
       var cssText = "-webkit-transform: rotate("+ deg +"deg);"
       cssText += "-moz-transform: rotate("+ deg +"deg);"
       cssText += " -o-transform: rotate("+ deg +"deg);"
       node.style.cssText = cssText;
    }
    this.rorateIt = function(node,deg)
    {
        rorateIt(node,deg);
    }
    this.getValue = function()
    {
        return 0.3;
    }
}
var Prize = function(data,browser)
{
     var createPrize = function(prize)
     {
         var htmlText = "<div class='prize'><div class='inner' style='background:"+ prize.src +"'>"+ prize.name +"</div></div>"
         return $(htmlText);
     }
     var getDeg = function(index)
     {
         return  Math.round(360 / data.length) * index;
     }
     this.initialize = function()
     {
         for(var i = 0 ; i < data.length ; i ++)
         {
             var p = createPrize(data[i]);
             $("#wrapper").append(p)
             data[i].deg = getDeg(i)
             browser.rorateIt(p.get(0),getDeg(i));
         }
     }
     this.getPrizesInfo = function()
     {
         return data;
     }
}
var Turntable = function(browser,prize)
{
    var board = $("#board").get(0);
    var deg = 0; //标记数字,每360度清0
    var degcount = 0; //已经旋转度数
    var maxdegcount; //总共要旋转度数
    var changeNum = 120 ;// 每转changeNum度进行一次速度变换
    var owner = this;
    var observers = [];
    var getRandom = function()
    {
        random.setPrizesInfo(prize.getPrizesInfo());
        return random.getValue();
    }
    var getIdentity = function()
    {
        var count = maxdegcount / changeNum //要更新速度次数
        var alreadycount = degcount  / changeNum //已更新速度次数
        var identity = count/2 - Math.abs(alreadycount - count/2)
        identity = identity <= 1 ? 1 : identity;
        return identity * browser.getValue();
    }
    this.start = function()
    {
        this.reset();
        var timer = window.setInterval(function()
        {
            var identity = getIdentity();
            if(degcount >= maxdegcount)
            {
                 window.clearInterval(timer);
                 owner.notify()
                 return;
            }
            if(deg>=360) deg = 0
            deg = degcount += identity;
            browser.rorateIt(board,deg);
            //document.getElementById('inner').innerHTML = identity
        },1);
    }
    this.reset = function()
    {
        maxdegcount = getRandom();
        degcount = 0;
        deg = 0;
        browser.rorateIt(board,0);
    }
    this.getSelectedPrize = function()
    {
        var deg = Math.round(maxdegcount % 360);
        var selectedPrize ;
        $.each(prize.getPrizesInfo(),function(index,o){
            if(o.deg == deg){
                selectedPrize = o;
                return false;
            }
        })
        return selectedPrize;
    }
    this.addObserver = function(observer)
    {
        observers.push(observer);
    }
    this.notify = function()
    {
        $.each(observers,function(index,o){o.update(owner);})
    }
}
var Random = function(userlevel)
{
    var owner = this;
    var prizesInfo;
    var filter;
    var level1count = 0;
    var level2count = 0;
    var level3count = 0;
    var level1HitRate = 1;
    var level2HitRate = 1;
    var level3HitRate = 1;
    this.reset = function()
    {
        level1count = 0;
        level2count = 0;
        level3count = 0;
    }
    this.getUserLevel = function()
    {
        throw new Error('未实现');
    }
    this.setPrizesInfo = function(p)
    {
        prizesInfo = p;
        filter = getData();
    }
    var getValue = function()
    {
        var random = Math.random() * (5400-5040+1) + 5040;
        var v = Math.round(random % 360);
        for(var i = 0 ; i < filter.length ; i ++)
        {
            if(filter[i].deg == v)
            {
                if(filter[i].level == 1 && ++level1count >= level1HitRate) return random;
                if(filter[i].level == 2 && ++level2count >= level2HitRate) return random;
                if(filter[i].level == 3 && ++level3count >= level3HitRate) return random;
            }
        }
        return getValue();
    }
    this.getValue = function()
    {
        this.reset();
        var value = getValue();
        //document.getElementById("level1").innerHTML = level1count;
        //document.getElementById("level2").innerHTML = level2count;
        //document.getElementById("level3").innerHTML = level3count;
        return value;
    }
    var getData = function()
    {
        var filter = new Array;
        $.each(prizesInfo,function(index,obj){
            if(obj.accept.join(',').indexOf(userlevel) != -1) filter.push(obj);
        })
        return filter;
    }
}
var Success = function()
{
    var turntable ;
    this.update = function(t)
    {
        turntable = t;
        alert("您获得的礼品为:"+t.getSelectedPrize().name)
    }
}
function createBrowser()
{
    var isMSIE = navigator.userAgent.indexOf("MSIE") != - 1 ? true : false;
    if(isMSIE) return new MSIEBrowser();
    else return new W3CBrowser();
}
var browser = createBrowser();
var prize = new Prize([{level:1,name:'奖品一(级别一)',src:'#111',accept:[1]},//src为礼品图片路径,这里先用颜色代替
                       {level:1,name:'奖品二(级别一)',src:'#222',accept:[1]},
                       {level:1,name:'奖品三(级别一)',src:'#333',accept:[1,2]},
                       {level:2,name:'奖品四(级别二)',src:'#444',accept:[1,2,3]},
                       {level:2,name:'奖品五(级别二)',src:'#555',accept:[1,2,3]},
                       {level:2,name:'奖品六(级别二)',src:'#666',accept:[1,2,3]},
                       {level:3,name:'奖品七(级别三)',src:'#777',accept:[1,2,3]},
                       {level:3,name:'奖品八(级别三)',src:'#888',accept:[1,2,3]},
                       {level:3,name:'奖品九(级别三)',src:'#999',accept:[1,2,3]},
                       {level:3,name:'奖品十(级别三)',src:'#ccc',accept:[2,3]}],browser)
prize.initialize()
var random = new Random(1);
var success = new Success();
var t = new Turntable(browser,prize,random);
t.addObserver(success);
    </script>
<div id="level1"></div>
<div id="level2"></div>
<div id="level3"></div>



</body>
</html>

 

posted @ 2014-08-11 10:26  赵小磊  阅读(1650)  评论(0)    收藏  举报
回到头部