移动端横竖屏适配应监听 resize 事件并结合 screen.orientation.type 与宽高比判断方向,辅以 CSS 媒体查询和正确 viewport 配置,避免依赖失效的 orientationchange 事件。

移动端横竖屏切换时的布局重构,核心不是等设备“说它转了”,而是盯住视口真实尺寸变化,并据此触发适配逻辑。orientationchange 事件已基本失效,尤其在 iOS Safari 15+ 和多数 WebView 中,常漏触发、返回恒定值或完全静默。真正可靠的做法是监听 resize,结合 screen.orientation.type 与宽高比双重判断,再配合 CSS 媒体查询和合理 viewport 配置,实现稳定重构。
用 resize + screen.orientation 实现方向感知
视口尺寸变化才是布局需要响应的真实信号。仅靠 orientationchange 容易错过关键时机,比如锁屏后解锁、PWA 切后台再切回等场景。
- 监听
window.addEventListener('resize', handler),并在 handler 中加防抖(如 100ms),避免连续 resize 导致重复计算和重排 - 首次加载必须手动执行一次检测,不能只等 resize 触发——否则白屏期就错过初始方向
- 优先读取
screen.orientation.type,值为portrait-primary、portrait-secondary、landscape-primary或landscape-secondary,可区分正/倒置横竖屏 - 对不支持
screen.orientation的老旧环境(如 Android 4.x WebView),降级为比值判断:window.innerWidth / window.innerHeight > 1.2视为横屏,
用 CSS 媒体查询做轻量样式层适配
媒体查询适合处理字体、间距、图片比例等非结构性调整,响应快、无需 JS 干预,是布局重构的第一道防线。
- 竖屏下启用紧凑布局:
@media screen and (orientation: portrait) { .video-wrap { width: 100%; height: 60vh; } } - 横屏下扩展展示空间:
@media screen and (orientation: landscape) { .video-wrap { width: 80vw; height: 90vh; } } - 注意:媒体查询依赖浏览器对 orientation 的识别,iOS 在「锁定竖排方向」开关开启时可能始终返回 portrait,所以不能单独依赖它做关键逻辑
JS 控制 DOM 结构与状态重构
当横竖屏差异大(如游戏、表单、仪表盘),仅靠 CSS 不够,需 JS 主动调整 DOM 结构、隐藏/显示模块、重设 Canvas 尺寸或更新渲染参数。
- 横屏时移除竖屏专属按钮,插入横屏专用控制栏;竖屏时还原
- Canvas/WebGL 场景下,必须重新设置
canvas.width和canvas.height,并调用ctx.scale()或重置投影矩阵 - 若页面含输入框,需监听软键盘弹出(
focusin/focusout)并临时禁用 resize 处理,避免键盘引发二次 resize 扰乱方向判断 - 建议将重构逻辑封装为函数,如
rebuildForLandscape()和rebuildForPortrait(),便于复用和测试
viewport 配置与边界兜底不可省略
没有正确的 viewport,所有方向检测和重构都可能错位或失效。它不是“写了就行”,而是要写对、写全、写稳。
-
是现代移动端必需配置 -
viewport-fit=cover对 iPhone X 及以后、安卓刘海屏至关重要,否则安全区域留白或挤压内容 -
user-scalable=no能防止用户双击缩放导致视口宽高失真,让 innerWidth/innerHeight 值更可信 - 搭配
可提升 PWA 全屏模式下的行为一致性
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











