Html5监听手机摇一摇事件的实现


Posted in HTML / CSS onNovember 07, 2019

MDN地址:

https://developer.mozilla.org/zh-CN/docs/Web/API/DeviceMotionEvent/DeviceMotionEvent

下面为vue实现代码

<template>
  <div id="Shake">
    <van-popup v-model="show">
      <div class="ad-box">
        <span class="skip-ad" @click="hideAD">跳过广告({{time}})</span>
        <img src="../../../../assets/img/shake/shake_ad.jpg" alt>
      </div>
    </van-popup>
    <div class="shake-page">
      <span class="cash-withdrawal-btn">提现</span>
      <img
        class="shake-img shake-horizontal"
        :class="shake?'shake-horizontal-move':''"
        src="../../../../assets/img/shake/shake.png"
        alt="摇一摇"
        @click="shakeImg"
      >
    </div>
    <audio
      style="display: none;"
      :src="publicDir + '/static/audio/5018.mp3'"
      ref="musicBox"
      preload="preload"
      controls
    ></audio>
  </div>
</template>

<script>
import { setTimeout } from "timers";
import config from "../../../../utils/config.js";
export default {
  name: "Shake",
  data() {
    return {
      time: 5,
      show: true,
      shake: false,
      SHAKE_THRESHOLD: 3000,
      last_update: 0,
      last_x: 0,
      last_y: 0,
      last_z: 0,
      publicDir: config.publicDir
    };
  },
  mounted() {
    this.init();
    this.countDown();
  },
  methods: {
    // 广告倒计时
    countDown() {
      setTimeout(() => {
        if (this.time < 1) {
          this.show = false;
        } else {
          this.time--;
          this.countDown();
        }
      }, 1000);
    },
    // 显示广告
    showPopup() {
      this.show = true;
    },
    // 隐藏广告
    hideAD() {
      this.show = false;
    },
    // 开启图片摇动效果
    shakeImg() {
      if (!this.show) {
        this.shake = true;
        this.$refs.musicBox.play();
        window.removeEventListener("devicemotion", this.deviceMotionHandler, false);
        setTimeout(() => {
          this.shake = false;
          this.routerPush("/RedBag");
        }, 2000);
      }
    },
    // 路由跳转
    routerPush(path, query) {
      this.$router.push({
        path,
        query
      });
    },
    // 初始化摇一摇,添加摇动监听
    init() {
      this.last_update = new Date().getTime();
      if (window.DeviceMotionEvent) {
        window.addEventListener(
          "devicemotion",
          this.deviceMotionHandler,
          false
        );
      } else {
        alert("not support mobile event");
      }
    },
    // 摇一摇事件回调函数
    deviceMotionHandler(eventData) {
      var acceleration = eventData.accelerationIncludingGravity;
      var curTime = new Date().getTime();
      if (curTime - this.last_update > 100) {
        var diffTime = curTime - this.last_update;
        this.last_update = curTime;
        var x = 0,
          y = 0,
          z = 0;
        x = acceleration.x;
        y = acceleration.y;
        z = acceleration.z;
        var speed =
          (Math.abs(x + y + z - this.last_x - this.last_y - this.last_z) /
            diffTime) *
          10000;
        if (Number(speed) > Number(this.SHAKE_THRESHOLD)) {
          // 判断为摇一摇动作
          this.shakeImg();
        }
        this.last_x = x;
        this.last_y = y;
        this.last_z = z;
      }
    }
  }
};
</script>

<style lang="less">
#Shake {
  .ad-box {
    width: 100vw;
    height: 100vh;
    img {
      width: 100%;
      height: 100%;
    }
  }
  .skip-ad {
    position: fixed;
    top: 20px;
    right: 20px;
    color: white;
    background-color: rgba(0, 0, 0, 0.2);
    padding: 10px 20px;
    border-radius: 10px;
  }
  .shake-page {
    width: 100vw;
    height: 100vh;
    background-image: url("../../../../assets/img/shake/shake_bg.jpg");
    background-size: 100% 100%;
    padding-top: 0.1px;
    .shake-img {
      display: block;
      width: 469px;
      height: auto;
      margin: auto;
      margin-top: 350px;
      pointer-events: auto;
    }
  }
  .cash-withdrawal-btn {
    color: white;
    position: fixed;
    border: 1px solid #eee;
    padding: 5px 40px;
    border-radius: 25px;
    top: 30px;
    right: 20px;
  }
  .shake-horizontal-move {
    display: inherit;
    transform-origin: center center;
    animation-play-state: running;
    animation-name: shake-horizontal;
    animation-duration: 100ms;
    animation-timing-function: ease-in-out;
    animation-iteration-count: infinite;
  }
  @keyframes shake-horizontal {
    2% {
      transform: translate(-7px, 0) rotate(0);
    }

    4% {
      transform: translate(-5px, 0) rotate(0);
    }

    6% {
      transform: translate(4px, 0) rotate(0);
    }

    8% {
      transform: translate(-4px, 0) rotate(0);
    }

    10% {
      transform: translate(-6px, 0) rotate(0);
    }

    12% {
      transform: translate(2px, 0) rotate(0);
    }

    14% {
      transform: translate(-5px, 0) rotate(0);
    }

    16% {
      transform: translate(-3px, 0) rotate(0);
    }

    18% {
      transform: translate(2px, 0) rotate(0);
    }

    20% {
      transform: translate(3px, 0) rotate(0);
    }

    22% {
      transform: translate(-2px, 0) rotate(0);
    }

    24% {
      transform: translate(-3px, 0) rotate(0);
    }

    26% {
      transform: translate(-9px, 0) rotate(0);
    }

    28% {
      transform: translate(2px, 0) rotate(0);
    }

    30% {
      transform: translate(7px, 0) rotate(0);
    }

    32% {
      transform: translate(2px, 0) rotate(0);
    }

    34% {
      transform: translate(0px, 0) rotate(0);
    }

    36% {
      transform: translate(-1px, 0) rotate(0);
    }

    38% {
      transform: translate(6px, 0) rotate(0);
    }

    40% {
      transform: translate(-7px, 0) rotate(0);
    }

    42% {
      transform: translate(0px, 0) rotate(0);
    }

    44% {
      transform: translate(-1px, 0) rotate(0);
    }

    46% {
      transform: translate(-2px, 0) rotate(0);
    }

    48% {
      transform: translate(10px, 0) rotate(0);
    }

    50% {
      transform: translate(-8px, 0) rotate(0);
    }

    52% {
      transform: translate(-9px, 0) rotate(0);
    }

    54% {
      transform: translate(9px, 0) rotate(0);
    }

    56% {
      transform: translate(-2px, 0) rotate(0);
    }

    58% {
      transform: translate(-5px, 0) rotate(0);
    }

    60% {
      transform: translate(2px, 0) rotate(0);
    }

    62% {
      transform: translate(-4px, 0) rotate(0);
    }

    64% {
      transform: translate(1px, 0) rotate(0);
    }

    66% {
      transform: translate(-3px, 0) rotate(0);
    }

    68% {
      transform: translate(10px, 0) rotate(0);
    }

    70% {
      transform: translate(4px, 0) rotate(0);
    }

    72% {
      transform: translate(-6px, 0) rotate(0);
    }

    74% {
      transform: translate(-6px, 0) rotate(0);
    }

    76% {
      transform: translate(2px, 0) rotate(0);
    }

    78% {
      transform: translate(-2px, 0) rotate(0);
    }

    80% {
      transform: translate(-6px, 0) rotate(0);
    }

    82% {
      transform: translate(-1px, 0) rotate(0);
    }

    84% {
      transform: translate(-6px, 0) rotate(0);
    }

    86% {
      transform: translate(-5px, 0) rotate(0);
    }

    88% {
      transform: translate(-1px, 0) rotate(0);
    }

    90% {
      transform: translate(-1px, 0) rotate(0);
    }

    92% {
      transform: translate(-1px, 0) rotate(0);
    }

    94% {
      transform: translate(-3px, 0) rotate(0);
    }

    96% {
      transform: translate(-6px, 0) rotate(0);
    }

    98% {
      transform: translate(-6px, 0) rotate(0);
    }

    0%,
    100% {
      transform: translate(0, 0) rotate(0);
    }
  }
}
</style>

注意:iphone需要在https下才可触发监听事件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS教程:CSS3圆角属性
Apr 02 HTML / CSS
CSS3用@font-face实现自定义英文字体
Sep 23 HTML / CSS
CSS3哪些新特性值得称赞
Mar 02 HTML / CSS
前端隐藏出边界内容的实现方法
Apr 14 HTML / CSS
基于 HTML5 WebGL 实现的垃圾分类系统
Oct 08 HTML / CSS
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
Apr 26 HTML / CSS
input file上传文件样式支持html5的浏览器解决方案
Nov 14 HTML / CSS
html5如何及时更新缓存文件(js、css或图片)
Jun 24 HTML / CSS
详解html5 canvas常用api总结(二)--绘图API
Dec 14 HTML / CSS
HTML5实现无刷新修改URL的方法
Nov 14 HTML / CSS
如何使用 resize 实现图片切换预览功能
Aug 23 HTML / CSS
CSS中妙用 drop-shadow 实现线条光影效果
Nov 11 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
Nov 04 #HTML / CSS
详解使用postMessage解决iframe跨域通信问题
Nov 01 #HTML / CSS
跨域修改iframe页面内容详解
Oct 31 #HTML / CSS
html如何对span设置宽度
Oct 30 #HTML / CSS
关于iframe跨域使用postMessage的实现
Oct 29 #HTML / CSS
使用canvas生成含有微信头像的邀请海报没有微信头像问题
Oct 29 #HTML / CSS
Html5与App的通讯方式详解
Oct 24 #HTML / CSS
You might like
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
ajax php 实现写入数据库
2009/09/02 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
jquery插件开发注意事项小结
2013/06/04 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
使用Python实现分别输出每个数组
2019/12/06 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
python 通过exifread读取照片信息
2020/12/24 Python
物业公司采购员岗位职责
2013/12/31 职场文书
刑事代理授权委托书
2014/09/17 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
2014年防汛工作总结
2014/12/08 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
2015迎新晚会开场白
2015/05/29 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
导游词之昭君岛
2020/01/17 职场文书