navigationStyle 必须在目标页面 style 节点单独设为 "custom",否则状态栏样式无效;APP端还需配 app-plus.titleNView: false、plus.navigator.setFullscreen(true) 及 --status-bar-height CSS 变量。

pages.json 里 navigationStyle 没设对,后面全白搭
“状态栏样式无效”八成卡在这一步。不是写在 globalStyle 里就完事了,必须在**目标页面的 style 节点下单独声明**:"navigationStyle": "custom"。否则 uni-app 仍走原生导航栏逻辑,你写的 CSS、JS 全部被绕过。
常见错误:
- 只在
globalStyle里写了"navigationStyle": "custom",但某个页面的style里没重申——该页面会继承全局配置?不,它会被忽略,因为原生导航栏未真正释放控制权 - 写成了
"navigationStyle": "default"或拼错成"navigationstyle"(大小写敏感) - 配了
"app-plus": {"titleNView": false}却漏掉navigationStyle: "custom"——这俩必须成对出现,缺一不可
APP 端没调 plus.navigator.setFullscreen(true)
光关原生导航栏还不够,状态栏本身还得手动隐藏。这个动作只能在真机或打包后的 APK 中生效,且有硬性前提:
- 必须用
#ifdef APP-PLUS包裹,否则 H5 和小程序环境会报plus is not defined - 必须放在
onShow或onLaunch里,mounted或created都太早,plus环境还没初始化好 - 只调这一句只能隐藏状态栏;若还想隐藏底部虚拟导航栏,得额外加
plus.navigator.hideSystemNavigation(),但注意:小米 HyperOS、OPPO ColorOS 14+ 已禁用该 API,系统级限制,无解
CSS 里没用 --status-bar-height,而是依赖 JS 获取值
uni.getSystemInfoSync().statusBarHeight 在不同平台返回极不稳定:iOS 返回真实像素(如 44),Android 常返回 24/25,全面屏机型可能不准,H5 和小程序直接不返回。而 uni-app 在 App 端注入的 --status-bar-height CSS 变量是可靠的,且自动适配。
正确姿势:
- 在根容器上写:
padding-top: var(--status-bar-height); - 如果用了
,记得设background-color="transparent",否则默认背景色会挡住状态栏区域 - 下拉刷新时内容会穿透透明导航栏导致状态栏变黑,此时应临时关闭透明,比如用
:class="{ 'nav-transparent': !isPulling }"配合onPullDownRefresh控制
调试用的是 HBuilderX 模拟器,结果不准
HBuilderX 自带模拟器不会真正设置原生窗口 flags,也不注入准确的 --status-bar-height 值,测出来的“沉浸失败”大概率是假象。真机调试必须用正式打包的 APK,否则所有判断都建立在错误前提上。
顺带提醒:很多开发者反复改 pages.json 后没效果,其实是编译缓存没清——删掉 unpackage 目录,重启 HBuilderX 再试。











