美文网首页
移动端沉浸式探测

移动端沉浸式探测

作者: yibuyisheng | 来源:发表于2018-12-18 21:43 被阅读16次

背景

有时候我们的 H5 应用既要能运行在各种容器内,也要能运行在浏览器中,并且在容器中尽量采用沉浸式方式呈现。

在容器中,是需要根据不同容器来设置不同的状态栏背景色的,不然就很可能看不见系统展示在状态栏上的文字了。而在浏览器中,不采用沉浸式方式呈现,因此是不需要理会的。

方案

可以借助 window.innerHeight 和 window.screen.height 来判断,关于这俩的含义,可以在 MDN 上查到。

实际上,在移动端,H5 页面中,window.screen.height 拿到的是逻辑像素值,window.innerHeight 拿到的是物理像素值或者逻辑像素值。并且,在页面初始化过程中,window.innerHeight 有可能会发生变化(最后稳定的值才是正确的)。

为了应对上述情况,必须要在初始化的时候不停地检查,直到最终拿到稳定结果。

《First, Understand Your Screen》

代码

async function isImmersion() {
  const check = () => {
    // windowHeight 是期望存储视口的逻辑像素值
    let windowHeight = window.innerHeight / window.devicePixelRatio;
    if (
      // 如果 window.screen.height 比 window.innerHeight 大,
      // 说明 window.innerHeight 肯定是逻辑像素值。
      window.screen.height - window.innerHeight > 0
      && window.screen.height - window.innerHeight < 130
    ) {
      windowHeight = window.innerHeight;
    }

    // iPhone X 飞猪下面 window.screen.height 和 windowHeight 差一丢丢(其余场景都可以用相等来判断)。
    return window.screen.height - windowHeight < 1;
  };

  if (document.readyState !== 'complete') {
    await new Promise((resolve) => {
      document.addEventListener('DOMContentLoaded', resolve);
    });
  }

  return new Promise((resolve, reject) => {
    const checkResults = [];
    setTimeout(() => {
      checkResults.push(check());
      const length = checkResults.length;
      if (
        length >= 3
        && checkResults[length - 1] === checkResults[length - 2]
        && checkResults[length - 2] === checkResults[length - 3]
      ) {
        resolve(checkResults[length - 1]);
      }
    }, 100);

    setTimeout(() => {
      reject(new Error('Check immersion timeout.'));
    }, 1000);
  });
}

相关文章

  • 移动端沉浸式探测

    背景 有时候我们的 H5 应用既要能运行在各种容器内,也要能运行在浏览器中,并且在容器中尽量采用沉浸式方式呈现。 ...

  • 学习笔记TF066:TensorFlow移动端应用,iOS、An

    TensorFlow对Android、iOS、树莓派都提供移动端支持。 移动端应用原理。移动端、嵌入式设备应用深度...

  • 25 / 关于电子书的阅读

    在移动交互的时代,移动端的电子化阅读已经成为一种趋势。 而Kindle 在电子书阅读领域却是行业领先者。 沉浸式体...

  • CSS-移动端页面(响应式)

    CSS-移动端页面(响应式) 媒体查询

  • Android 沉浸式状态栏的多种样式

    小菜最近正在处理客户端顶部沉浸式展示图片,借此整理了一下小菜自己研究测试的沉浸式状态栏。沉浸式状态栏大家都很熟悉,...

  • angular8 + ionic 如何集成px to viewp

    移动端 响应式 px转rem px转vw 移动端app,ionic脚手架搭建的angular框架,版本angula...

  • 超走心!APP 动效设计必备知识

    如今丰富细腻的 App 动效遍布移动端优秀应用界面中,为用户提供了良好的动态沉浸式体验,动效设计在产品研发过程中也...

  • 前端框架

    如果是纯移动端的话,zepto加frozenui加seajs挺好的。感觉bootstrap的响应式不适合纯移动端开...

  • 再识移动端开发(动态REM)

    前言:之前写过一篇博客介绍响应式移动端开发,而本文会介绍一种非响应式的移动端开发技术:动态REM。看了这两篇文章,...

  • CSS新手向的知识点<三>

    关于移动端页面 通常来讲做移动端页面适配一般有三种方式 前端方向:移动页面响应式,用媒体查询(media quer...

网友评论

      本文标题:移动端沉浸式探测

      本文链接:https://www.haomeiwen.com/subject/imerkqtx.html