UniApp真全屏需三步:pages.json设navigationStyle:"custom"并关闭titleNView;onShow中调plus.navigator.setFullscreen(true)隐藏状态栏,必要时加hideSystemNavigation();横屏需manifest声明方向+onLaunch锁定。
pages.json 里 navigationStyle 必须设为 custom
不设这个,后面所有操作都白搭。它不是“美化选项”,而是把原生导航栏控制权交还给前端的开关。只改 navigationbarhidden 或只设 titlenview: false 都无效——前者在 app 平台被忽略,后者只关原生层绘制,但逻辑上导航栏上下文还在,页面仍会预留空间。
必须在目标页面的 style 节点下写:
"navigationStyle": "custom"
同时配套加:
"app-plus": { "titleNView": false }
否则部分 Android 机型(尤其厂商定制系统)会在顶部渲染一个空白 title 区域,造成不可见的留白。
onShow 中调 plus.navigator.setFullscreen(true)
这个 API 才是真正隐藏状态栏的关键动作,但它有硬性前提:
- 必须包裹
#ifdef APP-PLUS,否则 H5 和小程序运行时会报plus is not defined - 必须在
onShow(或onLaunch)中调用,不能放mounted或created—— Vue 生命周期早于 plus 环境就绪,调了也静默失败 - 单独调它只隐藏状态栏;若还要隐藏底部虚拟导航栏,得额外加
plus.navigator.hideSystemNavigation(),但注意:该方法在小米 HyperOS、OPPO ColorOS 14+ 等新系统上已失效,属系统限制
内容不顶上去?别用 uni.getSystemInfoSync().statusBarHeight
隐藏状态栏后,页面内容常被“顶上去”或底部露白,这不是 CSS 没写好,而是状态栏高度被移除后,布局没重新适配。JS 获取的 statusBarHeight 在不同平台返回值不稳定(iOS 返回真实像素,Android 常固定 24/25,全面屏机型可能不准),且 H5 和小程序环境直接不返回。
uni-app 在 App 端注入了可靠的 CSS 变量:--status-bar-height。直接在根容器写:
padding-top: var(--status-bar-height);
如果用 <uni-nav-bar></uni-nav-bar>,记得显式设 background-color="transparent",否则默认背景色会挡住状态栏区域。下拉刷新时内容会穿透透明导航栏,导致状态栏变黑——此时应临时禁用透明,比如用 :class="{ 'nav-transparent': !isPulling }" 配合 onPullDownRefresh 控制。
真机调试必须用正式打包的 IPA/APK
HBuilderX 自带模拟器对 --status-bar-height 渲染不准,也不触发原生窗口 flags 设置,测不出真实沉浸效果。很多“全屏失败”其实是调试阶段误判。iOS 15+ 上 setFullscreen(true) 可能失效,需补调 plus.navigator.setStatusBarStyle('light'),并确认 Info.plist 中已设 UIViewControllerBasedStatusBarAppearance = YES。横屏全屏还要在 manifest.json 的 orientation 显式声明方向,并在 onLaunch 锁定,否则系统自动切回竖屏会重绘状态栏。











