美文网首页
转盘抽奖组件

转盘抽奖组件

作者: zhulichao | 来源:发表于2020-07-24 09:06 被阅读0次
  • 使用基于组件的开发模式,开发一个转盘抽奖组件,要求组件功能有:①可以设置旋转圈数②组件可复用③其它自行设计。设计对应的dom,css及js代码,最多可使用jQuery和zepto辅助。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>简单转盘效果</title>
        <style>
            #RotateDiv, #RotateDiv2 {
                width: 50px;
                height: 50px;
                color: #fff;
                text-align: center;
                line-height: 50px;
                background: #444;
                position: relative;
                margin: 20px;
                /* 指针效果 */
                border-radius: 50px 0 50px 50px;
            }
        </style>
    </head>
    <body>
        <p>简单转盘:</p>
        <p> <button id="RotateBtn">开始抽奖</button> </p>
        <div id="RotateDiv"></div>
        <p>默认转动:</p>
        <p> <button id="RotateBtn2">开始抽奖2</button> </p>
        <div id="RotateDiv2"></div>
     
        <script type="text/javascript">
            window.iRotate = (function(w, d){
                function R(obj, json){
                    this.obj = (typeof obj === 'object') ? obj : d.querySelector(obj);
                    this.startTime = Date.now();
                    this.timer = null;
                    this.rotate(json);
                };
                R.prototype = {
                    rotate: function(json) {
                        var self = this;
                        var times = json['time'] || 1000;
                        clearInterval(self.timer);
                        self.timer = setInterval(function() {
                            var changeTime = Date.now();
                            // 当前消耗时间
                            var timing = Math.min(times, changeTime - self.startTime);
                            var tweenFun = Tween[json['easing'] || 'easeOut'];
                            // 根据当前时间计算转动角度
                            var value = tweenFun(
                                            timing,
                                            +json['start'] || 0,
                                            json['end'] - (+json['start'] || 0),
                                            times
                                        );
                            self.obj.style['transform'] = 'rotate(' + value%360 + 'deg)';
                            self.obj.style['-webkit-transform'] = 'rotate(' + value%360 + 'deg)';
                            self.obj.setAttribute('data-rotate', value%360);
                            // 停止旋转
                            if(timing == times){
                                clearInterval(self.timer);
                                json.callback && json.callback.call(self.obj);
                            }
                        }, 10)
                    },
                    stop: function(fn) {
                        clearInterval(this.timer);
                        fn && fn.call(this.obj);
                    }
                };
            return R;
        })(window, document);
    
        var Tween = {
            // 匀速转动
            linear: function (t, b, c, d){
                return c*t/d + b;
            },
            // 逐渐变慢
            easeOut: function(t, b, c, d){
                return -c *(t/=d)*(t-2) + b;
            }
        };
        
        (function(){
            // 点击转动
            var off = true;
            RotateBtn.onclick = function(){
                if(!off) return; // 判断是否在旋转
                off = false;
                new iRotate('#RotateDiv', {
                    end: 45 + 1800,
                    time: 5000,
                    callback : function(){ // 回调函数
                        this.innerHTML = this.getAttribute('data-rotate');
                        off = true;
                    }
                });
            }
            //默认转动
            var r = null;
            var off2 = true;
            function rotate2(){ // 递归持续旋转
                r = new iRotate('#RotateDiv2', {
                    start: 0,
                    end: 360,
                    time: 1000,
                    easing: 'linear',
                    callback: function(){
                        rotate2();
                    }
                });
            }
            rotate2();
            RotateBtn2.onclick = function(){
                if(!off2) return; // 判断是否在旋转
                off2 = false;
                r.stop(); // 停止之前的旋转
                new iRotate('#RotateDiv2', {
                    start: RotateDiv2.getAttribute('data-rotate'), // 如果不加这个会从0角度开始旋转,有抖动
                    end: 65 + 1800,
                    time: 5000,
                    callback: function(){ // 回调函数
                        this.innerHTML = this.getAttribute('data-rotate');
                        off2 = true;
                    }
                });
            }
        })();
        </script>
    </body>
    </html>
    
效果图

相关文章

  • 转盘抽奖组件

    使用基于组件的开发模式,开发一个转盘抽奖组件,要求组件功能有:①可以设置旋转圈数②组件可复用③其它自行设计。设计对...

  • Scratch—转盘抽奖

    【知识延伸】 传统抽奖分为抽奖盒抽取、转盘抽奖等 【要求】 今天我们按照平时转盘抽奖、利用Scratch做一个转盘...

  • 抽奖转盘

    最近在写书上,老是看到别人抽一万钻的,我非常羡慕,就是我就试了试。 第一次我抽到的是解书钻二,我心想怎么这么倒霉,...

  • 抽奖转盘

    1.组件实现 2. 组件使用

  • 转盘抽奖

    越来越不济,100都没见一个。 全是10和20。

  • css3 转盘抽奖实践(sass)

    思路解释 转盘抽奖,就是像这样子的转盘。(如下图)点击中间的“点击抽奖”按钮,然后后面的圆形转盘开始转动,最后停在...

  • axure原型设计之转盘抽奖

    转盘抽奖一般会出现在一些金融类网站中,通过转盘抽奖来激活用户浏览行为,后来又多用于微信的公众号运营中,通过转盘抽奖...

  • 微信小程序 抽奖 转盘

    微信小程序 抽奖 转盘

  • JavaScript / 转盘抽奖

    之前公司活动时做的一个转盘抽奖活动,本来想自己封装一个,但是看过源码之后感觉好麻烦,而且这个方法个人感觉是比较好的...

  • 转盘抽奖笔记

    1.微信授权 2.调用抽奖接口判断活动结束||未结束 3.获取奖品信息 4.设置转盘 5.开始抽奖,获取中奖信息,...

网友评论

      本文标题:转盘抽奖组件

      本文链接:https://www.haomeiwen.com/subject/iofjhktx.html