• H5 设备方向及运动API


    传送门:https://blog.csdn.net/Panda_m/article/details/57515195

    入门的demo:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- Vue -->
        <script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>
        <style>
          b { font-size: 24px; }
        </style>
        <body>
           <div id="app">
              <p>alpha(z): 手机在水平面上旋转的角度,当设备的顶部指向正北时其值为 0°。 当设备逆时针旋转时值增加。【0 -360】: <b>{{ alpha }}</b></p>
              <p>beta(x): 围绕x轴上下翻转的角度,当设备的顶部和底部与地球表面等距时其值为 0。【向上翻为负值,-180 - 180】: <b>{{ beta }}</b></p>
              <p>gamma(y): 围绕y轴左右翻转的角度,当设备的左侧和右侧与地球表面等距时 其值为 0。【向左翻为负值, -180 - 180】: <b>{{ gamma }}</b></p>
           </div>
        </body>
        <script>
          var vue = new Vue({
              el: '#app',
              data: {
                  alpha: "",
                  beta: "",
                  gamma: "",
              },
              beforeMount: function () {
                  window.addEventListener('deviceorientation', (orientData) => {
                      this.alpha = orientData.alpha || 'null';
                      this.beta =  orientData.beta || 'null';
                      this.gamma = orientData.gamma || 'null';
                  });
              }
          })
        </script>
    </html>

    展示效果:

     

    节流版demo(强烈推荐):

     事件触发的太快,频繁的触发函数与界面渲染太浪费性能,这里我演示函数节流,参数为1000ms

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- Vue -->
        <script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>
        <style>
          b { font-size: 24px; }
        </style>
        <body>
           <div id="app">
              <p>alpha(z): 手机在水平面上旋转的角度,当设备的顶部指向正北时其值为 0°。 当设备逆时针旋转时值增加。【0 -360】: <b>{{ alpha }}</b></p>
              <p>beta(x): 围绕x轴上下翻转的角度,当设备的顶部和底部与地球表面等距时其值为 0。【向上翻为负值,-180 - 180】: <b>{{ beta }}</b></p>
              <p>gamma(y): 围绕y轴左右翻转的角度,当设备的左侧和右侧与地球表面等距时 其值为 0。【向左翻为负值, -180 - 180】: <b>{{ gamma }}</b></p>
           </div>
        </body>
        <script>
          // 函数节流(throttle)
          var throttle = function(func, wait, options) {
              var timeout, context, args, result;
              // 标记时间戳
              var previous = 0;
              // options可选属性 leading: true/false 表示第一次事件马上触发回调/等待wait时间后触发
              // options可选属性 trailing: true/false 表示最后一次回调触发/最后一次回调不触发
              if (!options) options = {};
    
              var later = function() {
                previous = options.leading === false ? 0 : +(new Date());
                timeout = null;
                result = func.apply(context, args);
                if (!timeout) context = args = null;
              };
    
              var throttled = function() {
                // 记录当前时间戳
                var now = +(new Date());
                // 如果是第一次触发且选项设置不立即执行回调
                if (!previous && options.leading === false)
                // 将记录的上次执行的时间戳置为当前
                previous = now;
                // 距离下次触发回调还需等待的时间
                var remaining = wait - (now - previous);
                context = this;
                args = arguments;
    
                // 等待时间 <= 0或者不科学地 > wait(异常情况)
                if (remaining <= 0 || remaining > wait) {
                  if (timeout) {
                      // 清除定时器
                    clearTimeout(timeout);
                    // 解除引用
                    timeout = null;
                  }
                  // 将记录的上次执行的时间戳置为当前
                  previous = now;
    
                  // 触发回调
                  result = func.apply(context, args);
                  if (!timeout) context = args = null;
                }
                // 在定时器不存在且选项设置最后一次触发需要执行回调的情况下
                // 设置定时器,间隔remaining时间后执行later
                else if (!timeout && options.trailing !== false)    {
                  timeout = setTimeout(later, remaining);
                }
               return result;
              };
    
              throttled.cancel = function() {
                clearTimeout(timeout);
                previous = 0;
                timeout = context = args = null;
              };
    
              return throttled;
          };
    
          var vue = new Vue({
              el: '#app',
              data: {
                  alpha: "",
                  beta: "",
                  gamma: "",
              },
              methods: {
                render (orientData) {
                    this.alpha = orientData.alpha || 'null';
                    this.beta =  orientData.beta || 'null';
                    this.gamma = orientData.gamma || 'null';
                }
              },
              beforeMount: function () {
                  const throttle_render = throttle(this.render, 1000);
                  window.addEventListener('deviceorientation', throttle_render);
              }
          })
        </script>
    </html>

     展示效果:

  • 相关阅读:
    [Go] Slice
    [Go] Array
    [Go] if scoped variable
    AcWing 345 牛站 【BellmanFord算法,非正解】
    AcWing 345 牛站
    P1962 斐波那契数列
    【Oracle】Oracle的回滚段和同时读写的处理
    【Mybatis】Mybatis的批量执行SQL语句 与 返回值问题
    @RestController的依赖包
    【ObjectMapper/Json】Json转字符串数组和对象数组
  • 原文地址:https://www.cnblogs.com/CyLee/p/9706601.html
Copyright © 2020-2023  润新知