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实现毛玻璃效果示例源码
Sep 25 HTML / CSS
css3模拟jq点击事件的实例代码
Jul 06 HTML / CSS
今天学到的CSS最新技术(与图片背景相关)
Dec 24 HTML / CSS
HTML5中的postMessage API基本使用教程
May 20 HTML / CSS
HTML5是什么 HTML5是什么意思 HTML5简介
Oct 26 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
May 08 HTML / CSS
Html5实现二维码扫描并解析
Jan 20 HTML / CSS
处理HTML5新标签的浏览器兼容版问题
Mar 13 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
Apr 20 HTML / CSS
AmazeUI 单选框和多选框的实现示例
Aug 18 HTML / CSS
CSS filter 有什么神奇用途
May 25 HTML / CSS
纯CSS如何禁止用户复制网页的内容
Nov 01 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中获取url与物理路径的总结
2013/06/21 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
详解如何用babel转换es6的class语法
2018/04/03 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
python实现斐波那契递归函数的方法
2014/09/08 Python
python实现的文件夹清理程序分享
2014/11/22 Python
python批量修改文件编码格式的方法
2018/05/31 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
python爬取股票最新数据并用excel绘制树状图的示例
2021/03/01 Python
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
广场舞大赛策划方案
2014/05/31 职场文书
医学生求职自荐书
2014/06/12 职场文书
小学教代会开幕词
2016/03/04 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书