一、devicemotion事件

window 对象中devicemotion事件,它封装了运动传感器数据的事件,可以用来监听设备的加速度变化等信息。devicemotion事件对象有acceleration、accelerationIncludingGravity、rotationRate和interval四个属性

window.addEventListener("devicemotion", (e) => {console.log(e)});

注意:本地测试无法打印出来的时候请注意啦,devicemotion事件要在线上并且的https协议的域名才有效
acceleration(速度)和accelerationIncludingGravity(重力加速度)这两者的属性都包含三个轴:X轴、Y轴、Z轴,区别是阿acceleration是监听手机目前的移动速度,accelerationIncludingGravity监听的是手机的重力反应

rotationRate(旋转速度)

提供了设备在 alpha,beta, gamma轴方向上旋转的速率的对象。旋转速率的单位为度每秒

  1. alpha: 设备沿着垂直屏幕的轴的旋转速率
  2. beta: 设备沿着屏幕左至右方向的轴的旋转速率
  3. gamma: 设备沿着屏幕下至上方向的轴的旋转速率

interval(时间间隔)

表示从设备获取数据的间隔时间,单位是毫秒

二、苹果机ios13.3以上的机子不能直接监听devicemotion事件,需要用户手动同意开启权限才可以

IOS 13 之后新增的一个方法用来获取用户权限,获取到用户权限之后,我们就可以来检测加速度了,但是注意该方法是 IOS 13 之后才有的,在 IOS 13 之前这么写的话,DeviceMotionEvent下并没有requestPermission方法就会报错

判断苹果13的方法

 var system = navigator.userAgent.toLowerCase();if (system.indexOf("like mac os x") > 0) {// 苹果机var reg = /os [\d._]*/gi;var info = system.match(reg);var version = (info + "").replace(/[^0-9|_.]/gi, "").replace(/_/gi, ".");var list = version.split(".");// 苹果13手机 list[0]  16 list[1] 0// 对苹果13以后的版本处理if (list[0] > 15) {if (typeof DeviceMotionEvent !== "undefined" &&typeof DeviceMotionEvent.requestPermission === "function") {//要授权了哦}} else {if (window.DeviceMotionEvent) {//监听设备运动window.addEventListener("devicemotion", (e) => {console.log(e)});}}} 

授权方法:

window.DeviceOrientationEvent.requestPermission().then((state) => {if (state === "granted") {// 监听传感器运动事件if (window.DeviceMotionEvent) {window.addEventListener("devicemotion", (e) => {console.log(e)});} else {alert("手机不支持陀螺仪功能哦");}} else if (state === "denied") {alert("拒绝授权");} else if (state === "prompt") {alert("你对手机做了啥");}});

完整代码:

<template><div class="yao-box"><div class="img"><img id="yaoyiyao" src="../assets/shou.png" alt /><div class="tip" v-if="isAuth">晃动你的屏幕开始摇一摇吧</div></div><div class="cover-box" v-if="!isAuth"><div class="btn" @click="getAuth">获取一下你的权限哦</div></div></div>
</template>
<script>
export default {data() {return {num: 10000, //抽奖次数SHAKE_THRESHOLD: 8000, //动摇阀值,越高需要摇摆的幅度越大loading: false, //防止摇摆过程中造成的误操作last_update: 0, // 记录最后一次摇一摇的时间x: 0,y: 0,z: 0,last_x: 0,last_y: 0,last_z: 0,isAuth: true, // 已经授权};},mounted() {this.init();},//页面销毁时beforeDestroy() {window.removeEventListener("devicemotion", this.devicemotion, false);},methods: {init() {var system = navigator.userAgent.toLowerCase();if (system.indexOf("like mac os x") > 0) {// 苹果机var reg = /os [\d._]*/gi;var info = system.match(reg);var version = (info + "").replace(/[^0-9|_.]/gi, "").replace(/_/gi, ".");var list = version.split(".");// 苹果13手机 list[0]  16 list[1] 0// 对苹果13以后的版本处理if (list[0] > 15) {if (typeof DeviceMotionEvent !== "undefined" &&typeof DeviceMotionEvent.requestPermission === "function") {this.isAuth = false;}} else {if (window.DeviceMotionEvent) {//监听设备运动window.addEventListener("devicemotion", this.devicemotion, false);}}} else {//判断设否授权了 设备运动权限if (window.DeviceMotionEvent) {//监听设备运动window.addEventListener("devicemotion", this.devicemotion, false);}}},// 设备运动 方法devicemotion(event) {//获取加速度信息//通过监听上一步获取到的x, y, z 值在一定时间范围内的变化率,进行设备是否有进行晃动的判断。var acceleration = event.accelerationIncludingGravity;var curTime = new Date().getTime();// 最低间隔一秒if (curTime - this.last_update > 1000) {var diffTime = curTime - this.last_update;this.last_update = curTime;this.x = acceleration.x;this.y = acceleration.y;this.z = acceleration.z;var speed =(Math.abs(this.x + this.y + this.z - this.last_x - this.last_y - this.last_z) /diffTime) *10000;//而为了防止正常移动的误判,需要给该变化率设置一个合适的临界值。if (speed > this.SHAKE_THRESHOLD) {if (this.num <= 0 && !this.loading) {alert("抽奖次数用完了");} else {if (!this.loading) {var block = document.getElementById("yaoyiyao");block.classList.add("play");setTimeout(() => {alert("你中奖啦!"); // Do somethingblock.classList.remove("play");this.loading = false;}, 1500);this.num -= 1;this.loading = true;}}}this.last_x = this.x;this.last_y = this.y;this.last_z = this.z;} else {this.$toast.fail("不要太频繁哦");// this.$message({title})}},getAuth() {let that = this;window.DeviceOrientationEvent.requestPermission().then((state) => {if (state === "granted") {// 监听传感器运动事件if (window.DeviceMotionEvent) {that.isAuth = true;window.addEventListener("devicemotion", this.devicemotion);} else {alert("手机不支持陀螺仪功能哦");}} else if (state === "denied") {alert("拒绝授权");} else if (state === "prompt") {alert("你对手机做了啥");}});},},
};
</script><style lang="less" scoped>
.yao-box {width: 100vw;height: 100vh;overflow: hidden;
}
.img {height: 15rem;text-align: center;margin-top: 12rem;img {display: inline-block;height: 100%;}
}
.play {animation: play 0.3s linear 4;
}
.tip {font-size: 1.5rem;text-align: center;margin-top: 4rem;
}
@keyframes play {25% {transform: rotate(-40deg);}75% {transform: rotate(40deg);}100% {transform: rotate(0deg);}
}
.cover-box {width: 100vw;height: 100vh;position: absolute;top: 0;left: 0;background: rgba(0, 0, 0, 0.5);.btn {width: 80%;height: 4rem;background: #06ae56;line-height: 4rem;text-align: center;border-radius: 4rem;margin: 50vh 10vw;color: #fff;font-size: 1.5rem;}
}
</style>

图片文件:

vue项目实现摇一摇h5相关推荐

  1. vue.js中H5使用微信摇一摇抽奖,判断摇一摇次数

    微信摇一摇抽奖: export default {data() {return {SHAKE_THRESHOLD:4000,//定义一个摇动的值last_update :0,//定义一个变量保存上次更 ...

  2. 微信摇一摇效果HTML,JavaScript+H5实现微信摇一摇功能

    项目终于如约上线,但是在春节前又有一个新的活动要做,类似微信的摇一摇活动.也一直在做微信公众号的东西,但是要调用微信摇一摇的接口还是有些困难,因为只提供了摇一摇周边,附近的人以及一系列的红包页面,相对 ...

  3. php微信摇一摇,怎样使用JS+H5实现微信摇一摇

    这次给大家带来怎样使用JS+H5实现微信摇一摇,使用JS+H5实现微信摇一摇的注意事项有哪些,下面就是实战案例,一起来看一下. 项目终于如约上线,但是在春节前又有一个新的活动要做,类似微信的摇一摇活动 ...

  4. 开源免费,捷微H5活动平台(微砍价、九宫格、斧头帮、摇一摇送卡券) h5huodong.com

    捷微H5营销活动平台(h5huodong.com) 特点:(采用插件模式开发H5营销活动,独立部署,解决微信活动大用户.高并发问题) 源码下载:https://gitee.com/jeecg/h5hu ...

  5. 开源免费,捷微H5活动平台(微砍价、九宫格、斧头帮、摇一摇送卡券) h5huodong.com...

    捷微H5营销活动平台(h5huodong.com) 特点:(采用插件模式开发H5营销活动,独立部署,解决微信活动大用户.高并发问题) 源码下载:http://git.oschina.net/jeecg ...

  6. IOS系统中H5页面实现摇一摇功能

    公司准备开年会了,年会活动用了一套别人的系统,根据测试,有些游戏的摇一摇功能在IOS上无法使用,为了修复该功能,踩了一些坑,特此记录如下: 1. 因为IOS系统的安全要求,项目必须是在https的域名 ...

  7. 微信——H5实现微信摇一摇

    项目终于如约上线,但是在春节前又有一个新的活动要做,类似微信的摇一摇活动.也一直在做微信公众号的东西,但是要调用微信摇一摇的接口还是有些困难,因为只提供了摇一摇周边,附近的人以及一系列的红包页面,相对 ...

  8. vue如何在一个工程里判断h5还是pc,(利用在一个页面显示不同router-view内容原理,本文只使用于单页面项目,多页面项目请查看我另一篇博文)

    本文只适用于单页面项目,多页面项目请查看我另一篇博文 vue如何在一个工程里显示pc和手机端(适用多页面复杂项目) https://blog.csdn.net/qq_37816525/article/ ...

  9. 微信摇一摇抽奖的H5制作思路

    第一步 微信授权登录,获取用户的微信信息,并写入数据库,相当于摇奖已经有了用户基础. 第二步 页面出现一个手机摇动的CSS3动画,提示用户摇奖,每天可以设定摇奖交数,超过次数提醒用户分享好友,好友拉新 ...

最新文章

  1. Js_Span 滑动手型鼠标样式
  2. SQL语句中不同的连接JOIN
  3. 用ASDM管理思科PIX防火墙
  4. SQLalchemy 字段类型
  5. Struts2中文件上传下载实例
  6. 秒杀场景_多线程异步抢单队列分析与实现_02
  7. MySQL怎么给表简明_科学网—mySQL简明入门 - 张金龙的博文
  8. mysql创建的是拉丁_mysql 拉丁1 转换成 utf8
  9. 无法检测的新型 Linux 恶意软件利用 Dogecoin API 攻击 Docker 服务器
  10. iOS: 教你给UI控件添加Badge(消息提醒小圆点)
  11. SSL 延迟与 Http、Https
  12. Wannafly挑战赛27: C. 蓝魔法师(树形DP)
  13. 【CVE-2016-10009】OpenSSH 7.4 - agent Protocol Arbitrary Library Loading
  14. 航海王启航服务器维护要多久,《航海王启航》7月1日服务器更新维护公告
  15. VM VirtualBox 安装Window XP3安装版
  16. 朱兰的质量观(转载)
  17. elasti 时间范围查询
  18. 怎么1年内赚100万
  19. Python基础知识(9)
  20. 深圳成为乌拉圭智慧城市解决方案输出地

热门文章

  1. 用python对数据进行主成分分析、类概念描述及特征化分析-实验报告
  2. Silverlight学习之调用bing搜索引擎进行网络搜索
  3. win10豆沙绿护眼色
  4. 关于路由器,交换机,宽带猫(光猫)的相关概念详解
  5. error converting to execution character set illegal byte sequence报错解决办法
  6. uni.getLocation(Object)获取经纬度和当前中文地址
  7. 微信第三方平台之授权流程(三)
  8. php毕设代做,客户管理系统,java,jsp,php,好毕设为你指导如何完成一个客户管理系统...
  9. VB6.0 让函数返回一个值
  10. 如何开启GBase XDM的操作日志