利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖

摇一摇JS脚本逻辑:
接下来是移动端JS脚本逻辑的实现,摇一摇的实现需借助html5新增的devicemotion事件,获取设备在位置和方向上的改变速度的相关信息,该事件的基本使用如下:

if (window.DeviceMotionEvent) {
    window.addEventListener(‘devicemotion‘, handler, !1);
    lastTime = new Date();
} else {
    alert(‘你的浏览器不支持摇一摇功能.‘);
}

devicemotion事件对象中有一个accelerationIncludingGravity属性,该属性包括:一个包含x、y 和z 属性的对象,在考虑z 轴自然重力加速度的情况下,告诉你在每个方向上的加速度。该API的具体使用大家可以参考网上的资料,非常多,这里就不重复了。 摇一摇的具体逻辑如下:

function handler(e) {
    var current = e.accelerationIncludingGravity;
    var currentTime;
    var timeDifference;
    var deltaX = 0;
    var deltaY = 0;
    var deltaZ = 0;

    //记录上一次设备在x,y,z方向上的加速度
    if ((lastX === null) && (lastY === null) && (lastZ === null)) {
        lastX = current.x;
        lastY = current.y;
        lastZ = current.z;
        return;
    }

    //得到两次移动各个方向上的加速度绝对差距
    deltaX = Math.abs(lastX - current.x);
    deltaY = Math.abs(lastY - current.y);
    deltaZ = Math.abs(lastZ - current.z);
    //当差距大于设定的阀值并且时间间隔大于指定阀值时,触发摇一摇逻辑
    if (((deltaX > threshold) && (deltaY > threshold)) || ((deltaX > threshold) && (deltaZ > threshold)) || ((deltaY > threshold) && (deltaZ > threshold))) {
        currentTime = new Date;
        timeDifference = currentTime.getTime() - lastTime.getTime();
        //时间间隔
        if (timeDifference > timeout) {
            //触发摇一摇事件
            dealShake();
            lastTime = new Date;
        }
    }

    lastX = current.x;
    lastY = current.y;
    lastZ = current.z;
}

不考虑各等奖的中奖概率问题

最终完整代码示例:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
 6     <title>摇一摇抽奖</title>
 7    <style type="text/css">
 8        html,body{ width:100%; height:100%; background-color: #000; margin:0; overflow: hidden;}
 9        .tip{ position: absolute; bottom: 30px; left: 10px; color: #fff; font-family: ‘楷体‘; text-align: center; right: 10px; height: 32px; line-height: 32px; background-color: rgba(255,255,255,.4); border-radius: 3px; } .tip.active{ -webkit-animation: jump 1.5s linear; animation: jump 1s linear; }
10    </style>
11 </head>
12 <body>
13     <div class="tip" id="tip"> </div>
14
15     <script type="text/javascript">
16         var lastX = null,
17             lastY = null,
18             lastZ = null;
19         var threshold = 3; //灵敏度(值越小灵敏度越高)
20         var timeout = 1000;
21         var lastTime = null;
22         var isShaking = !1;
23         document.addEventListener(‘DOMContentLoaded‘, function (e) {
24             ready();
25         }, !1);
26
27         /*脚本逻辑:
28         *移动端JS脚本逻辑的实现,摇一摇的实现需借助html5新增的devicemotion事件,获取设备在位置和方向上的改变速度的相关信息。
29         *devicemotion事件对象中有一个accelerationIncludingGravity属性,该属性包括:一个包含x、y 和z 属性的对象,在考虑z 轴自然重力加速度的情况下,告诉你在每个方向上的加速度。
30         */
31         function ready() {
32             if (window.DeviceMotionEvent) {
33                 window.addEventListener(‘devicemotion‘, handler, !1);
34                 lastTime = new Date();
35             } else {
36                 alert(‘你的浏览器不支持摇一摇功能.‘);
37             }
38         }
39
40         function handler(e) {
41             var current = e.accelerationIncludingGravity;
42             var currentTime;
43             var timeDifference;
44             var deltaX = 0;
45             var deltaY = 0;
46             var deltaZ = 0;
47
48             //记录上一次设备在x,y,z方向上的加速度
49             if ((lastX === null) && (lastY === null) && (lastZ === null)) {
50                 lastX = current.x;
51                 lastY = current.y;
52                 lastZ = current.z;
53                 return;
54             }
55
56             //得到两次移动各个方向上的加速度绝对差距
57             deltaX = Math.abs(lastX - current.x);
58             deltaY = Math.abs(lastY - current.y);
59             deltaZ = Math.abs(lastZ - current.z);
60             //当差距大于设定的阀值并且时间间隔大于指定阀值时,触发摇一摇逻辑
61             if (((deltaX > threshold) && (deltaY > threshold)) || ((deltaX > threshold) && (deltaZ > threshold)) || ((deltaY > threshold) && (deltaZ > threshold))) {
62                 currentTime = new Date;
63                 timeDifference = currentTime.getTime() - lastTime.getTime();
64                 //时间间隔
65                 if (timeDifference > timeout) {
66                     //触发摇一摇事件
67                     dealShake();
68                     lastTime = new Date;
69                 }
70             }
71
72             lastX = current.x;
73             lastY = current.y;
74             lastZ = current.z;
75         }
76
77         function dealShake() {
78             if (isShaking) return;
79             isShaking = !0;
80
81             document.getElementById("tip").innerHTML = "恭喜您,摇中:" + GetName();
82
83             setTimeout(function () {
84                 isShaking = !1;
85                 document.getElementById("tip").innerHTML = " ";
86             }, 1000);
87
88         }
89
90         function GetName() {
91             var chars = ["一等奖", "二等奖", "三等奖", "四等奖", "五等奖"];
92             return chars[GetRandom(0, chars.length - 1)];
93         }
94         function GetRandom(minValue, maxValue) {
95             return Math.round(Math.random() * (maxValue - minValue)) + minValue;
96         }
97     </script>
98
99 </body>

shake.html

时间: 2024-10-12 13:45:12

利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖的相关文章

利用html5实现类似微信的手机摇一摇功能

利用html5实现类似微信的手机摇一摇功能,并播放音乐. 1.  deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方位.朝向等. 2.  deviceMotion:封装了运动传感器数据的事件,可以获取手机运动状态下的运动加速度等数据. 不多说直接上代码, Javascript: [javascript] view plaincopy var SHAKE_THRESHOLD = 3000; var last_update = 0;

利用html5实现类似微信的手机摇一摇功能,并播放音乐,并且解决中文乱码的问题。

转载了@三井学长:http://blog.csdn.net/david1030/article/details/8229008 转载了@Hello Csn楠!:http://www.cnblogs.com/csn0721/ 1.  deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方位.朝向等. 2.  deviceMotion:封装了运动传感器数据的事件,可以获取手机运动状态下的运动加速度等数据. 不多说直接上代码, Javas

HTML5实现手机摇一摇的功能

利用html5实现类似微信的手机摇一摇功能,并播放音乐. 1.  deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方位.朝向等. 2.  deviceMotion:封装了运动传感器数据的事件,可以获取手机运动状态下的运动加速度等数据. js如下: <scirpt> var SHAKE_THRESHOLD = 3000; var last_update = 0; var x = y = z = last_x = last_y =

html5实现摇一摇

利用html5实现类似微信的手机摇一摇功能,并播放音乐. 1.  deviceOrientation:封装了方向传感器数据的事件,能够获取手机精巧状态下的方向数据,比如手机所处角度.方位.朝向等. 2.  deviceMotion:封装了运动传感器数据的事件,能够获取手机运动状态下的运动加速度等数据. <!DOCTYPE html> <html lang="cn"> <head> <meta charset="utf-8"

HTML5实现摇一摇的功能(实测后)--转

eviceMotionEvent(设备运动事件)返回设备有关于加速度和旋转的相关信息.加速度的数据将包含三个轴:x,y和z(示意如下图所 示,x轴横向贯穿手机屏幕或者笔记本键盘,y轴纵向贯穿手机屏幕或笔记本键盘,z轴垂直于手机屏幕或笔记本键盘).因为有些设备可能没有硬件来排除重力的 影响,该事件会返回两个属性,accelerationIncludingGravity(含重力的加速度)和acceleration(加速度),后者 排除了重力的影响. 涉及到我们如何计算用户摇晃手机的原理了.考虑的要点

HTML5手机重力与方向感应的应用——摇一摇效果

http://www.helloweba.com/view-blog-287.html HTML5有一个重要特性:DeviceOrientation,它将底层的方向和运动传感器进行了高级封装,它使我们能够很容易的实现重力感应.指南针等有趣的功能.本文将结合实例给大家介绍使用HTML5的重力运动和方向传感器实现手机摇一摇效果. DeviceOrientation包括两个事件: 1.deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方

HTML5 实现手机摇一摇

HTML5新增了一些JavaScript API接口,比如地理定位.重力感应等.今天主要介绍devicemotion事件(设备事件),它提供设备的加速信息,表示为定义在设备上的坐标系.其还提供了设备在坐标系中的自转速率.若可行的话,事件应该提供设备重心处的加速信息.本文给大家讲解了HTML5实现手机摇一摇的效果. 手机摇一摇的实现思路: 1.检测设备是否支持重力传感: 1 // 监听运动传感事件,查看是否支持硬件运动 2 3 if (window.DeviceMotionEvent) { 4 5

html5 DeviceOrientation来实现手机网站上的摇一摇功能

原文地址:http://www.cootm.com/?p=706 从网上转载看到的,感觉不错,就转过来了,特此感谢 cnblogs 的 幸福2胖纸的码农生活,直接转载了,不要介意!呵呵 以下是转载内容. ——————————————————— 介绍之前做两个声明: 1.以下代码可以直接运行,当然你别忘了引用jQuery才行,我可提醒了,别到时候跑不起来骂我就成: 2.下面的实现思想参照了网上的一些文章,自己做了以下整理,对代码加入了一些注释说明,本人并非原创. 1 <html lang="

手机站建设HTML5触摸屏touch事件使用介绍

手机站建设HTML5触摸屏touch事件使用介绍技术 maybe yes 发表于2015-01-05 14:42 原文链接 : http://blog.lmlphp.com/archives/56  来自 : LMLPHP后院 市面上手机种类繁多,在触屏手机上运行的网页跟传统PC网页相比还是有很大差别的.由于设备的不同浏览器的事件的设计也不同.传统PC站的 click 和 onmouseover 等事件在一般触屏的手机上也可以使用,但是效果不够好.PC上还没有哪个事件是可以与触屏手机的触摸事件对