JS判断移动端横竖屏视口检测实现的几种方法

作者:流萤时间:2026-10-24 13:33:40浏览:492

本文详细解析移动端横竖屏检测与视口适配的多种实现方式。涵盖JavaScript通过window.orientation和resize事件监听屏幕方向,CSS利用@media媒体查询进行样式区分,以及Meta标签设置viewport-fit=cover以适配刘海屏和底部安全区域。同时对比了innerWidth、outerWidth及clientHeight等视口属性的差异,帮助开发者在不同场景下选择最优方案。

在移动端开发中,准确获取视口尺寸是适配的基础。可以通过JavaScript访问window对象下的不同属性来获取各类视口数据。例如,window.innerWidth和innerHeight返回的是包含垂直滚动条的视觉视口大小;window.outerWidth和outerHeight则返回包含浏览器窗口边框、侧边栏等元素的完整窗口大小;window.screen.width和height对应的是设备屏幕的理想视口大小,即屏幕分辨率;而screen.availWidth和availHeight表示浏览器可用窗口大小,不包含滚动条和边框。此外,document.documentElement.clientWidth和clientHeight返回的是文档元素的内容区域大小,不包含内边距、边框及滚动条。这些属性在不同浏览器和场景下表现各异,需根据实际需求选择。


// 获取视觉视口大小(包括垂直滚动条)
let iw = window.innerWidth,
 ih = window.innerHeight;
console.log(iw, ih);

// 获取视觉视口大小(内容区域大小,包括侧边栏、窗口镶边和调整窗口大小的边框)
let ow = window.outerWidth,
 oh = window.outerHeight;
console.log(ow, oh);

// 获取屏幕理想视口大小,固定值(屏幕分辨率大小)
let sw = window.screen.width,
 sh = window.screen.height;
console.log(sw, sh);

// 获取浏览器可用窗口的大小(包括内边距、但不包括垂直滚动条、边框和外边距)
let aw = window.screen.availWidth,
 ah = window.screen.availHeight;
console.log(aw, ah);

// 包括内边距、滚动条、边框和外边距
let dow = document.documentElement.offsetWidth,
 doh = document.documentElement.offsetHeight;
console.log(dow, doh);

// 在不使用滚动条的情况下适合视口中的所有内容所需的最小宽度和高度
let dsW = document.documentElement.scrollWidth,
 dsH = document.documentElement.scrollHeight;
console.log(dsW, dsH);

// 包含元素的内边距,但不包括边框、外边距或者垂直滚动条
let cw = document.documentElement.clientWidth,
 ch = document.documentElement.clientHeight;
console.log(cw, ch);

使用JavaScript检测横竖屏状态,主要依赖window.orientation属性结合resize事件监听。当屏幕方向改变时,触发resize事件。若window.orientation值为180或0,通常表示设备处于竖屏状态;若值为90或-90,则表示设备处于横屏状态。通过监听该事件并判断orientation的值,可以动态执行相应的逻辑或样式调整,从而实现对屏幕旋转的响应。


// window.orientation:获取屏幕旋转方向
window.addEventListener('resize', () => {
 // 正常方向或屏幕旋转180度
 if (window.orientation === 180 || window.orientation === 0) {
  console.log('竖屏')
 }

 // 屏幕顺时钟旋转90度或屏幕逆时针旋转90度
 if (window.orientation === 90 || window.orientation === -90) {
  console.log('横屏')
 }
});

CSS层面检测横竖屏,主要利用@media媒体查询中的orientation特性。当设备处于竖屏模式时,使用@media screen and (orientation:portrait)选择器,可以针对竖屏状态设置特定的样式,例如设置容器宽高为100vw和100vh,并赋予背景色。当设备处于横屏模式时,使用@media screen and (orientation:landscape)选择器,同样可以定义横屏下的布局样式,如调整宽高比例或背景色。这种方式无需JavaScript介入,性能更优,且能自动响应屏幕旋转。


/* css检测横竖屏 */
@media screen and (orientation:portrait) {

 /* 竖屏 */
 #app {
  width: 100vw;
  height: 100vh;
  background: red;
 }
}

@media screen and (orientation:landscape) {

 /* 横屏 */
 #app {
  width: 50vw;
  height: 100vh;
  background: green;
 }
}

通过HTML中的meta标签设置viewport,是控制移动端页面视口行为的标准做法。常见的设置包括<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />。该配置将视口宽度设置为设备宽度,初始缩放比例为1,最小和最大缩放比例均为1,并禁止用户手动缩放。这有助于保持页面布局的稳定性,防止因用户缩放导致的布局错乱,是移动端网页开发的基础配置。


<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />

针对现代智能手机的刘海屏、异形屏或底部小黑条(Home Indicator)设计,需要在viewport meta标签中设置viewport-fit属性。添加<meta name="viewport" content="viewport-fit=cover" />后,浏览器会将视口扩展到屏幕边缘,允许内容覆盖安全区域。这要求开发者在CSS中额外处理安全区域的边距,以避免内容被硬件遮挡。


<meta name="viewport" content="viewport-fit=cover" />

在viewport-fit=cover生效的情况下,需要为页面元素设置安全区域边距,特别是底部固定导航栏。可以通过CSS的constant()和env()函数来设置padding-bottom,值分别为safe-area-inset-bottom。这确保了内容在刘海屏或底部有手势条的设备上不会与硬件元素重叠,提升用户体验。


/* 当使用底部固定导航栏时,我们要为他们设置 padding值: */
body {
 padding-bottom: constant(safe-area-inset-bottom);
 padding-bottom: env(safe-area-inset-bottom);
}

需要注意的是,constant()函数在iOS 11.2之前的版本中生效,而env()函数在iOS 11.2及更高版本中生效。为了兼容不同版本的iOS系统,建议同时声明这两个函数,如先设置constant再设置env,利用CSS的覆盖特性确保兼容性。

综上所述,通过JavaScript、CSS及Meta标签的组合使用,可以实现全面的移动端横竖屏检测与视口适配。开发者可根据具体需求选择合适的方案,确保页面在不同设备和屏幕尺寸下均能良好显示。

作者最新文章