我们通常在开发H5页面时除了100%宽度适配可能也需要做横竖屏版差异。这里就涉及到如何检测移动设备是横竖屏的情况。下面列出几种检测的方法。
JavaScript方法检测
在 iOS 平台以及大部分 Android 手机都有浏览器提供的 window.orientation 这个属性。它返回一个与默认屏幕方向偏离的角度值:
- 0°:代表此时是默认屏幕方向
- 90°:代表顺时针偏离默认屏幕方向90度
- -90°:代表逆时针偏离默认屏幕方向90度
- 180°:代表偏离默认屏幕方向180度
由此可以知道当设备的旋转角度为:0 或 180° 为竖屏 90° 或 -90° 为横屏。
代码如下:
if (Math.abs((window.orientation) as unknown as number) === 90) {
// 横屏
return 'landscape'
} else {
// 竖屏
return 'portrait'
}
css媒体查询
内联样式
@media screen and (orientation:portrait) {
// 竖屏
}
@media screen and (orientation:landscape) {
// 横屏
}
外联样式
<!-- 竖屏 -->
<link rel="stylesheet" media="all and (orientation:portrait)" href="..." />
<!-- 横屏 -->
<link rel="stylesheet" media="all and (orientation:landscape)" href="..." />
window.matchMedia()
CSS Object Model(CSSOM)Views 规范增加了对 JavaScript 操作 CSS Media Queries 的原生支持,它在 window 对象下增加了 matchMedia() 方法,让我们能够通过脚本的方式来实现媒体查询。
window.matchMedia() 方法接受一个 Media Queries 语句的字符串作为参数,返回一个 MediaQueryList 对象。该对象有 media 和 matches 两个属性:
- media:返回所查询的 Media Queries 语句字符串
- matches:返回一个布尔值,表示当前环境是否匹配查询语句
同时,它还包含了两个方法,用来监听事件:
- addListener(callback):绑定回调 callback 函数
- removeListener(callback):注销回调 callback 函数
那么,通过 window.matchMedia() 的方法,我们可以这样判断横竖屏:
var mql = window.matchMedia("(orientation: portrait)");
function onMatchMeidaChange(mql){
if(mql.matches) {
// 竖屏
}else {
// 横屏
}
}
onMatchMeidaChange(mql);
mql.addListener(onMatchMeidaChange);
注:通过 Can I Use - matchMeida可以知道,该API在移动端得到良好的支持,并无兼容性问题。