利用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;
- }
不考虑各等奖的中奖概率问题
最终完整代码示例:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
- <title>摇一摇抽奖</title>
- <style type="text/css">
- html,body{ width:100%; height:100%; background-color: #000; margin:0; overflow: hidden;}
- .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; }
- </style>
- </head>
- <body>
- <div class="tip" id="tip"> </div>
- <script type="text/javascript">
- var lastX = null,
- lastY = null,
- lastZ = null;
- var threshold = 3; //灵敏度(值越小灵敏度越高)
- var timeout = 1000;
- var lastTime = null;
- var isShaking = !1;
- document.addEventListener('DOMContentLoaded', function (e) {
- ready();
- }, !1);
- /*脚本逻辑:
- *移动端JS脚本逻辑的实现,摇一摇的实现需借助html5新增的devicemotion事件,获取设备在位置和方向上的改变速度的相关信息。
- *devicemotion事件对象中有一个accelerationIncludingGravity属性,该属性包括:一个包含x、y 和z 属性的对象,在考虑z 轴自然重力加速度的情况下,告诉你在每个方向上的加速度。
- */
- function ready() {
- if (window.DeviceMotionEvent) {
- window.addEventListener('devicemotion', handler, !1);
- lastTime = new Date();
- } else {
- alert('你的浏览器不支持摇一摇功能.');
- }
- }
- 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;
- }
- function dealShake() {
- if (isShaking) return;
- isShaking = !0;
- document.getElementById("tip").innerHTML = "恭喜您,摇中:" + GetName();
- setTimeout(function () {
- isShaking = !1;
- document.getElementById("tip").innerHTML = " ";
- }, 1000);
- }
- function GetName() {
- var chars = ["一等奖", "二等奖", "三等奖", "四等奖", "五等奖"];
- return chars[GetRandom(0, chars.length - 1)];
- }
- function GetRandom(minValue, maxValue) {
- return Math.round(Math.random() * (maxValue - minValue)) + minValue;
- }
- </script>
- </body>
shake.html
利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖的更多相关文章
- HTML5实现摇一摇的功能(实测后)--转
eviceMotionEvent(设备运动事件)返回设备有关于加速度和旋转的相关信息.加速度的数据将包含三个轴:x,y和z(示意如下图所 示,x轴横向贯穿手机屏幕或者笔记本键盘,y轴纵向贯穿手机屏幕或 ...
- h5手机摇一摇功能实现:基于html5重力感应DeviceMotionEvent事件监听手机摇晃
DeviceMotionEven是html5提供的一个用来获取设备物理方向及运动的信息(比如陀螺仪.罗盘及加速计)的Dom事件,事件描述如下: deviceorientation:提供设备的物理方向信 ...
- 利用HTML5的一个重要特性 —— DeviceOrientation来实现手机网站上的摇一摇功能
介绍之前做两个声明: 以下代码可以直接运行,当然你别忘了引用jQuery才行. <script> // DeviceOrientation将底层的方向传感器和运动传感器进行了高级封装, ...
- 利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
我比较喜欢听音乐,特别是周末的时候,电脑开着百度随心听fm,随机播放歌曲,躺在床上享受.但碰到了一个烦人的事情,想切掉不喜欢的曲子,还得起床去操作电脑换歌.于是思考能不能用手机控制电脑切换歌曲,经过一 ...
- 用HTML5实现手机摇一摇的功能(转)
在百度开发者大会上我介绍过HTML5另外一个重要特性就是DeviceOrientation,它将底层的方向传感器和运动传感器进行了高级封装,提供了DOM事件的支持.这个特性包括两种事件: 1.devi ...
- Adobe Edge Animate --使用HTML5实现手机摇一摇功能
Adobe Edge Animate --使用HTML5实现手机摇一摇功能 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. HTML5的发展日新月异,其功能 ...
- 【HTML5 】手机重力与方向感应的应用——摇一摇效果
http://www.helloweba.com/view-blog-287.html HTML5有一个重要特性:DeviceOrientation,它将底层的方向和运动传感器进行了高级封装,它使我们 ...
- html5 摇一摇事件监听
先来看下html5的这几个特性: 1.deviceOrientation:方向传感器数据的事件,通过监听该事件可以获取手机静态状态下的方向数据: 2.deviceMotion: 运动传感器数据事件,通 ...
- html5 DeviceOrientation来实现手机网站上的摇一摇功能
原文地址:http://www.cootm.com/?p=706 从网上转载看到的,感觉不错,就转过来了,特此感谢 cnblogs 的 幸福2胖纸的码农生活,直接转载了,不要介意!呵呵 以下是转载内容 ...
随机推荐
- 搭建环境Visual Studio 2013 社区版
搭建环境Visual Studio 2013 社区版 ActiveReports 9刚刚发布3天,微软就发布了 Visual Studio Community 2013 开发环境. Visual St ...
- 如何使用OPENQUERY访问另一个SQL Server
原文:如何使用OPENQUERY访问另一个SQL Server 在项目中,经常会遇到一个数据库访问另一个数据库,[CNVFERPDB]为服务器名,[CE3]为库名 SELECT Dtl.* FROM ...
- VS2013中Python学习环境搭建
VS2013中Python学习笔记[环境搭建] 前言 Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字, ...
- Unity SurfaceShader 开始编程
Unity SurfaceShader 开始编程 在14年年初的时候,以前给自己定下了今年要实现的三个目标.当中之中的一个就是学会编写自己的Shader,并可以投入到实际的项目应用之中.如今,转眼间日 ...
- C# 语言的多线程编程,完全是本科OS里的知识
基本知识,无参数Thread和带参数的Thread Thread类的参数就是参数指针,可以传入一个无参的函数. 如果要传入带参数的函数,先new一个ParameterizedThreadStart委托 ...
- Akka入门实例
Akka入门实例 Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用. Actor模型并非什么新鲜事物,它由Carl Hew ...
- 后台XML处理
public void GetInfo() { string message = @"<?xml version='1.0' encoding='utf-8' ...
- hadoop大数据处理之表与表的连接
hadoop大数据处理之表与表的连接 前言: hadoop中表连接其实类似于我们用sqlserver对数据进行跨表查询时运用的inner join一样,两个连接的数据要有关系连接起来,中间必须有一个 ...
- [转]Libev教程
libev Table of Contents 1 libev 1.1 About The Code 1.2 EventLoop 1.3 Watcher 1.4 How it works 1.4.1 ...
- Google开源的Deep-Learning项目word2vec
用中文把玩Google开源的Deep-Learning项目word2vec google最近新开放出word2vec项目,该项目使用deep-learning技术将term表示为向量,由此计算te ...