最简单彻底的取消沉浸式方式是在 manifest.json 中设置 "statusbar": { "immersed": false },需重新打包 apk/ipa 才生效,且优先级高于 pages.json 和 js api。

直接在 manifest.json 里关掉沉浸式开关,是最简单、最彻底的取消方式。其他“绕路操作”(比如只改 pages.json 或只调 JS API)容易残留白边、状态栏错位或 H5 端失效。
manifest.json 中关闭 immersed 是最稳方案
UniApp App 端默认开启沉浸式(immersed: true),这是底层 WebView 的渲染行为,不靠 CSS 或 JS 能完全覆盖。必须从构建配置层禁用:
- 打开
manifest.json→ 切换到「源码视图」 - 在
"app-plus"节点下添加或修改:"statusbar": { "immersed": false } - 保存后**必须重新打包 APK/IPA**,热更新或 HBuilderX 模拟器不生效
- 该设置对 iOS 和 Android 均生效,且优先级高于
pages.json里的任何导航栏配置
pages.json 里 navigationStyle: "custom" 不等于取消沉浸式
很多人误以为设了 navigationStyle: "custom" 就能退出沉浸式——其实恰恰相反:它把控制权交给前端,反而更容易因 CSS 没写好导致内容顶进状态栏区域,看起来像“更沉浸”。取消沉浸式的关键是让系统恢复默认布局逻辑:
-
navigationStyle: "custom"+"titleNView": false是为自定义导航栏准备的,不是退沉浸式的开关 - 如果已设了
custom,又想取消沉浸式,**先删掉它**,改回默认(或显式设"default"),再配合manifest.json关immersed - 否则即使
immersed: false生效,页面仍可能因custom模式下未重置padding-top而出现顶部空白或错位
JS 调用 plus.navigator.setFullscreen(false) 无效且危险
这个 API 本意是切换全屏状态,但:
-
setFullscreen(false)并不能“还原”状态栏,它只是尝试退出全屏,而系统是否响应取决于当前窗口 flags,不可控 - 在部分 Android 厂商系统(如小米 HyperOS 2.0+)上,该调用会静默失败,甚至引发白屏
- 必须包裹
#ifdef APP-PLUS,否则 H5 和小程序运行时报plus is not defined - 真正需要的是布局回归标准模式,不是靠 JS 反向操作原生接口
注意:改完 manifest.json 后,iOS 上若仍看到状态栏文字颜色异常(比如白字看不清),是因为系统默认沿用前一次的 statusBarStyle 缓存;此时需在 onLaunch 中显式调用 plus.navigator.setStatusBarStyle("default") 清除残留状态。











