Skip to content
返回

检测设备是否是水平状态

手头有一个需求,要求当手机从竖屏旋转到横屏的时候需要做些处理。设备旋转时可以使用 resize 或是 orientationchange 事件得到通知,但判断当前设备是否是水平状态就有一些麻烦了。

一开始我使用的是 window.innerWidthwindow.innerHeight 来判断,但在 Android 手机里,当输入法弹出来的时候,会导致 window.innerHeight 变小并触发 resize 事件,此时 window.innerWidth 就会大于 window.innerHeight,但这并不是我想要的。

后来,我开始使用 window.outerWidthwindow.outerHeight,但在 iOS 下,这两个属性的值始终是 0。

谷歌一番之后,看到有人说使用 window.matchMedia("(orientation: landscape)").matches 来判断,但从 MDN 的文档上得知这个方法会产生跟 innerWidthinnerHeight 同样的问题。

同样的,还可以判断 window.orientation,但这个属性已经被弃用了。

还有一个 window.screen.orientation 属性,但是还没有标准化,各家浏览器的实现都不一致,所以也没法用。

思来想去,最后只能尝试一挨个检测了:

let isLandspace

if ('orientation' in window) {
  isLandspace = function () {
    return window.orientation === 90 || window.orientation === -90
  }
} else if (window.outerHeight && window.outerWidth) {
  isLandspace = function () {
    return window.outerWidth > window.outerHeight
  }
} else {
  isLandspace = function () {
    return window.innerWidth > window.innerHeight
  }
}

分享这篇文章:

上一篇
奇怪的缓存策略
下一篇
在 Webpack 中分离 vendor 与 app