必须在每个页面的pages.json style节点显式配置"navigationstyle":"custom",因该属性为页面级开关,globalstyle配置仅对未单独声明style的页面生效;漏配任一页面(如tabbar页、登录页)将导致原生导航栏残留、--status-bar-height变量未注入,内容被状态栏遮挡。

必须在每个页面的 pages.json style 节点里显式写 "navigationStyle": "custom",再配合 CSS 变量 var(--status-bar-height) 占位——没有“自动全局生效”的捷径,漏配一个页面就会遮挡。
为什么 globalStyle 里设了 custom 还不行?
因为 "navigationStyle": "custom" 是页面级开关,globalStyle 中配置只对未单独声明 style 的页面生效。一旦某个页面在 pages.json 的 page 节点下写了自己的 style(哪怕只配了 navigationBarTitleText),它就会完全忽略 globalStyle 里的 navigationStyle,退回到默认原生导航栏,状态栏区域就不再注入 --status-bar-height 变量。
- 检查你所有页面路径是否都明确写了
"navigationStyle": "custom",包括子目录页、tabBar 页面、登录页等 - 特别注意:微信小程序虽然支持
custom,但--status-bar-height值恒为0,不能靠它占位;H5 同理 - App 端必须同时配
"app-plus": {"titleNView": false},否则部分安卓机型仍会预留空白标题区
怎么用 CSS 变量安全占位?
别调 uni.getSystemInfoSync(),那个值在 onLoad 阶段常为 0,且跨平台返回不稳定。uni-app 在 App 端运行时已注入可靠的 --status-bar-height,直接用即可。
- 根容器(如
<view class="root"></view>)加padding-top: var(--status-bar-height); - 若用了
<uni-nav-bar></uni-nav-bar>,必须显式设background-color="transparent",否则默认色会盖住状态栏 - H5 和小程序环境该变量为
0px,无需条件编译,直接写不会出错
真机调试时状态栏没占位?
这是最常被忽略的一环:HBuilderX 自带的模拟器和云真机不触发原生窗口 flags 设置,--status-bar-height 渲染不准,甚至为 0。只有正式打包的 IPA/APK 才能拿到真实值。
- Android 真机测试务必用签名后的 APK,iOS 必须用 Ad Hoc 或 App Store 包
- 调试阶段可临时加 fallback:
padding-top: calc(var(--status-bar-height, 24px) + 0px); - 别信控制台打印的
getComputedStyle(...).getPropertyValue('--status-bar-height'),那是在 DOM 就绪后读的,但样式可能还没被注入
复杂点在于:状态栏占位不是纯前端样式活,它依赖原生层是否真正释放了顶部空间。漏掉 titleNView: false、误用 JS 获取高度、或在非正式包里验证,都会让占位失效——而这些错误在开发机上几乎看不出问题。











