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 相关文章推荐
基于CSS3特效之动画:animation的应用
May 09 HTML / CSS
css3实现垂直下拉动画菜单示例
Apr 22 HTML / CSS
CSS3实现时间轴效果
Jul 11 HTML / CSS
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
Mar 15 HTML / CSS
HTML5实现视频直播功能思路详解
Nov 16 HTML / CSS
HTML5中语义化 b 和 i 标签
Oct 17 HTML / CSS
HTML5中实现拖放效果无须借助javascript
Dec 26 HTML / CSS
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
Jul 15 HTML / CSS
使用HTML5进行SVG矢量图形绘制的入门教程
Feb 19 HTML / CSS
Html5新增标签有哪些
Apr 13 HTML / CSS
Html5页面播放M4a音频文件
Mar 30 HTML / CSS
详解CSS中postion和opacity及cursor的特性
Aug 14 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
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
Python如何定义有默认参数的函数
2020/08/10 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
韩国美国时尚服装和美容在线全球市场:KOODING
2018/11/07 全球购物
手机业务员岗位职责
2013/12/13 职场文书
聘任书模板
2014/03/29 职场文书
付款承诺函范文
2015/01/21 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js