hhhhhhh

h5移动端网页模仿微信摇一摇代码实现

现在h5可以做到很多跟app一样的功能,接下来我们将通过手机的shake.event事件来实现想要的功能。

 

 

通过手机摇一摇 会去数据库查询 是否中奖,并且弹窗出相应的提示。

 

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>摇一摇</title>
<meta charset="UTF-8">
<meta content="yes" name="apple-mobile-web-app-capable"></meta>
<meta content="black" name="apple-mobile-web-app-status-bar-style"></meta>
<meta name="format-detection" content="telephone=no"></meta>
<meta content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport"></meta>
<meta content="yes" name="full-screen"></meta>
<meta content="true" name="x5-fullscreen"></meta>
<meta content="application" name="browsermode"></meta>
<link href="css/shake.css?v=2.7" type="text/css" rel="stylesheet" />
<script src="js/jquery-1.8.3.min.js" type="text/javascript"></script>
<script src="js/shake.js?v=0.6.3" type="text/javascript"></script>
<script src="js/common.js?v=0.7.1" type="text/javascript"></script>
<script src="js/jQueryRotate.js" type="text/javascript"></script>
<script>

</script>
</head>
<body>
<div class="banner">
        <div class="turnplate" style="background-image:url(css/images/bj.png);background-size:100%;">
            <canvas class="item" id="wheelcanvas" width="100%" ></canvas>
            <img class="pointer"  src="css/images/hand.png" id="pointer"  >
            
            <a class="hdgz" id="rule-btn" href="javascript:void(0)">活动规则</a>
            <a class="ckjp" href="javascript:void(0)">查看我的奖品</a>
        </div>
</div>
<!--摇一摇活动说明规则-->
<div id="rule" class="hide">摇一摇中卡券活动,活动时间:2015年1月1日摇一摇中卡券活动,活动时间:2015年1月1日摇一摇中卡券活动,活动时间:2015年1月1日摇一摇中卡券活动,活动时间:2015年1月1日摇一摇中卡券活动,活动时间:2015年1月1日</div>

<!--摇一摇活动未开始提示-->
<div id="no_time_start" class="hide">亲,您来的太早了,活动还没有开始呢!</div>

<!--摇一摇活动结束提示-->
<div id="time_end" class="hide">亲,您来晚了,活动已经结束了!</div>

<!--已经摇中并领取-->
<div id="git_sended" class="hide">亲,您已经参加过活动了,下次活动再来吧!</div>

<!--已经摇中未领取-->
<div id="no_git_send" class="hide">亲,您已经中过奖品了,点击下面按钮领取奖品吧!</div>

<!--未关注用户-->
<div id="user_gz" class="hide">亲,需要关注我们公众号才可以摇奖品哦!</div>

<!--摇一摇未关注提示-->
<!--摇一摇音效-->
<audio id="audio_shake" src="css/images/wechat_shake.mp3" preload></audio>
<audio id="audio_shake1" src="css/images/red-02.mp3" preload></audio>
<!--摇一摇音效-->

<!--<div class="modal-backdrop"></div>
<div class="dia_box">
<div class="title"></div>
<div class="content">
1.参加活动人员关注后,即可参与“摇一摇”活动。<br/>
2.“摇一摇”开始后,屏幕显示中奖礼品为本次得奖礼品。<br/>
3. ⑤、⑥、⑦礼品仅限活动当晚兑换,逾期不候。(⑤、⑥、⑦礼品为暂定)<br/>
4. 活动最终解释权,归我公司所有,如有不明白事项,请提前咨询。
</div>
<a href="javascript:void(0)" class="dia_close">关闭</a>
</div>-->

 
</body>

</html>

 

根据手机晃动来加载事件:

 

// shake.event
(function(global, factory) {
    if (typeof define === "function" && define.amd) {
        define(function() {
            return factory(global, global.document)
        })
    } else {
        if (typeof module !== "undefined" && module.exports) {
            module.exports = factory(global, global.document)
        } else {
            global.Shake = factory(global, global.document)
        }
    }
}(typeof window !== "undefined" ? window : this, function(window, document) {
    function Shake(options) {
        this.hasDeviceMotion = "ondevicemotion" in window;
        this.options = {
            threshold: 15,
            timeout: 1000
        };
        if (typeof options === "object") {
            for (var i in options) {
                if (options.hasOwnProperty(i)) {
                    this.options[i] = options[i]
                }
            }
        }
        this.lastTime = new Date();
        this.lastX = null ;
        this.lastY = null ;
        this.lastZ = null ;
        if (typeof document.CustomEvent === "function") {
            this.event = new document.CustomEvent("shake",{
                bubbles: true,
                cancelable: true
            })
        } else {
            if (typeof document.createEvent === "function") {
                this.event = document.createEvent("Event");
                this.event.initEvent("shake", true, true)
            } else {
                return false
            }
        }
    }
    Shake.prototype.reset = function() {
        this.lastTime = new Date();
        this.lastX = null ;
        this.lastY = null ;
        this.lastZ = null 
    }
    ;
    Shake.prototype.start = function() {
        this.reset();
        if (this.hasDeviceMotion) {
            window.addEventListener("devicemotion", this, false)
        }
    }
    ;
    Shake.prototype.stop = function() {
        if (this.hasDeviceMotion) {
            window.removeEventListener("devicemotion", this, false)
        }
        this.reset()
    }
    ;
    Shake.prototype.devicemotion = function(e) {
        var current = e.accelerationIncludingGravity;
        var currentTime;
        var timeDifference;
        var deltaX = 0;
        var deltaY = 0;
        var deltaZ = 0;
        if ((this.lastX === null ) && (this.lastY === null ) && (this.lastZ === null )) {
            this.lastX = current.x;
            this.lastY = current.y;
            this.lastZ = current.z;
            return
        }
        deltaX = Math.abs(this.lastX - current.x);
        deltaY = Math.abs(this.lastY - current.y);
        deltaZ = Math.abs(this.lastZ - current.z);
        if (((deltaX > this.options.threshold) && (deltaY > this.options.threshold)) || ((deltaX > this.options.threshold) && (deltaZ > this.options.threshold)) || ((deltaY > this.options.threshold) && (deltaZ > this.options.threshold))) {
            currentTime = new Date();
            timeDifference = currentTime.getTime() - this.lastTime.getTime();
            if (timeDifference > this.options.timeout) {
                window.dispatchEvent(this.event);
                this.lastTime = new Date()
            }
        }
        this.lastX = current.x;
        this.lastY = current.y;
        this.lastZ = current.z
    }
    ;
    Shake.prototype.handleEvent = function(e) {
        if (typeof (this[e.type]) === "function") {
            return this[e.type](e)
        }
    }
    ;
    return Shake
}));

 

弹窗框div的封装

 

ar shakeEvent;
// 提示框
var box_dialog = function(opt) {
    var box = $('<div class="modal-backdrop"></div><div class="dia_box"></div>').appendTo(document.body);
    var dlg = $('.dia_box');
    if (opt.title == "title") {
        
        var head = $('<div class="title"></div>').appendTo(dlg);
    } 
    else {
        var head = $('<div class="title1"></div>').appendTo(dlg);
    }
    
    var cont = $('<div class="content"></div>').appendTo(dlg);
    cont.html(opt.content);
    
    if (opt.closebtn == true) {
        $('<a class="dia_close"></a>').appendTo(dlg);
    }
    
    var yheight = $(window).height();
    var theight = $(".dia_box").height();
    var wheight = yheight - 120;
    $(".dia_box .content").css({
        height: (theight > yheight) ? wheight : ''
    });
    $(".dia_box").css({
        top: (theight > yheight) ? 60 : (yheight - theight) / 2
    });
    
    return box;
}
;

 

根据不同的状态 加载不同的提示内容 ,以及在数据库搜索之前 有动画加载进行中的loading效果!

 

$(function(){
//根据不同的状态来加载不同的提示框	
shakeEvent = new Shake({ threshold:15, timeout:1000 });
	shakeEvent.start();
	window.addEventListener('shake', gift_shake, false);
	
	$('#rule-btn').click(function(){
		shakeEvent.stop();
		var dlg = box_dialog({ title:'title', content:$('#rule').html(), closebtn:true});
		dlg.find('.dia_close').text('关 闭').click(function(){
			dlg.remove();
			shakeEvent.start();
		});
});
	
});

var sbox;
var gift_shake = function(){
	
	$('#audio_shake')[0].play();
	var vargs = [[-21,100], [0,300], [-21,600], [0,850]];
	$(vargs).each(function(){
		var _this = this;
		setTimeout(function(){ $('#pointer').rotate(_this[0]);}, _this[1]);
	});

    
	setTimeout(function(){
						$('#audio_shake')[0].pause();
						$('#audio_shake1')[0].play();
                        sbox = $('<div class="modal-backdrop"></div><div class="msgtips search"><div>正在搜寻奖品...</div></div>').appendTo(document.body);
                        shakeEvent.stop();
					}, 1500);
	
	setTimeout(function(){
		   shakeTicket();
	    }, 2500 + ~~(Math.random() * 1500));}

 

 

像数据库进行ajax数据查询

//开始摇奖品
/*function shakeTicket() {
    
    
    
    
    
    
    //奖品摇到后,数据库查询到后,把提示语隐藏。然后再跳转到 卡卷。
    sbox.remove(); 
    
    
    
    
    
    var actId = $("#actId").val();
    var openid = $("#openid").val();
    var subscribe = $("#subscribe").val();
    var jwid = $("#jwid").val();
    var url = "../shaketicket/shakeTicket.do";
    $.getJSON(url, {"actId": actId,"openid" : openid,"subscribe":subscribe,"jwid" : jwid}, function(data,status,xhr){    
        if (!!sbox) sbox.remove();
        if (data.success) {
            var drawStatus = data.attributes.shaketicketRecord.drawStatus;//抽奖状态
            var awardsName = data.attributes.shaketicketAward.awardsName;//奖品名称
            var owner = data.attributes.shaketicketAward.owner;//发奖公司
            var cardId = data.attributes.shaketicketAward.cardId;//卡券ID
            if(drawStatus == '0'){//未中奖                    
                var msg = "真遗憾,再接再厉";
                if(msg==null||msg==""){
                    msg = (NOGIFT_TIPs[~~(Math.random()*NOGIFT_TIPs.length)]||NOGIFT_TIPs[0]);
                }
                var dlg = box_dialog({ title:'没有摇到~', content:'<p style="margin:0;margin-top:9px;">' + msg + '</p>' });
                dlg.find('.foot .-gifts').text('继续摇').click(function(){
                    dlg.remove();
                    shakeEvent.start();
                });
                
            }else{//已中奖
                var gift = '<div><span style="margin:4px 0;display:inline-block;color:#999">恭喜你获得</span><br><b style="font-size:16px;">' + owner + '提供的</b><br><b style="font-size:16px;">' + awardsName + '</b></div>';
                var dlg = box_dialog({ title:'恭喜!中奖啦!', content:gift });
                dlg.find('.foot .-gifts').attr('onclick', 'addCard()');                    
            }    
            var use_times = $("#count").html();//每天剩余抽奖次数
            if(use_times==null){
                use_times = $("#num").html();//剩余抽奖次数
                use_times--;
                $("#num").html(use_times);
            }else{                        
                use_times--;
                $("#count").html(use_times);
            }
        } else {
            if(data.obj=="isNotFoucs"){
                var dlg = box_dialog({ title:'友情提示', content:$('#no_focus').html() });
                dlg.find('.foot .-gifts').text('关闭').click(function(){
                    dlg.remove();
                    shakeEvent.start();
                });
            }else if(data.obj=="isNotBind"){
                var dlg = box_dialog({ title:'友情提示', content:$('#no_binding_phone').html() });
                dlg.find('.foot .-gifts').text('关闭').click(function(){
                    dlg.remove();
                    shakeEvent.start();
                });
            }else{               
                var msg = data.msg;
                var dlg = box_dialog({ title:'友情提示~', content:'<p style="margin:0;margin-top:9px;">' + msg + '</p>' });
                dlg.find('.foot .-gifts').text('关闭').click(function(){
                    dlg.remove();
                    shakeEvent.start();
                });
            }
        }
    });

}  */

 

为了兼容不同浏览器 我们这用了一个插件 ,就是让摇动的时候 手机左右上下 晃动,当然也可以用css3 动画来写 !

// VERSION: 2.3 LAST UPDATE: 11.07.2013
/* 
 * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
 * 
 * Made by Wilq32, wilq32@gmail.com, Wroclaw, Poland, 01.2009
 * Website: http://code.google.com/p/jqueryrotate/ 
 */

 

  

posted @ 2017-01-22 16:00  海纶  阅读(361)  评论(0)    收藏  举报