应优先读取当前页面运行时的navigationstyle配置值:若为"custom"则原生导航栏被移除,若为"default"或未声明则存在;需注意globalstyle中navigationstyle会覆盖页面级配置,且navigationbarhidden: true仅对小程序/h5有效、app端无效。

怎么在运行时知道页面有没有原生导航栏
不能靠猜,得用平台能力主动探测。uni-app 没有直接暴露 hasNavigationBar 这样的 API,但可以通过组合判断得出可靠结论。
检查 navigationStyle 配置值是否为 "custom"
这是最核心的判断依据。只要当前页面的 style 中 navigationStyle 显式设为 "custom",就代表原生导航栏被移除(无论平台);设为 "default" 或未声明,则原生导航栏存在(但可能被隐藏)。
- 该值可在
pages.json的页面级配置中读取,也可通过getCurrentPages()[0].$page.style.navigationStyle在页面内获取(仅 H5/小程序有效,APP 端不可靠) - 注意:全局设置
"navigationStyle": "custom"会覆盖所有页面,此时即使单页没配,实际也无原生导航栏 - 不要只看变量名或注释,必须读取真实运行时配置值——有些项目用条件编译写了不同平台的配置,
if (process.env.UNI_PLATFORM === 'mp-weixin')这类逻辑会导致值动态变化
区分 navigationBarHidden: true 和真隐藏
navigationBarHidden: true 在 H5 和小程序里确实能隐藏导航栏,但在 APP 端完全无效。所以光看这个字段不能断定“有没有”,只能说明“有没有尝试隐藏”。
- 若只设了
"navigationBarHidden": true,而navigationStyle是"default":H5/小程序无导航栏,APP 仍有 - 若同时设了
"navigationStyle": "custom"和"titleNView": false(APP 专用):三端都无原生导航栏 - 错误做法:用
uni.getSystemInfoSync().platform === 'ios'加navigationBarHidden判断——这漏掉了 APP 端根本无视该字段的事实
用 uni.getSystemInfoSync() 辅助推断高度占用
当无法准确读取配置时,可退而求其次,通过系统信息反推导航栏是否存在及是否占位。
- 调用
uni.getSystemInfoSync()获取statusBarHeight和screenHeight,再结合已知安全区或页面offsetTop做差值估算 - 例如:若
screenHeight - window.innerHeight ≈ 88(常见于 iOS + 导航栏),大概率有原生导航栏;若差值 ≈ 44(仅状态栏),则很可能已隐藏或 custom - 该方法不精确,仅作 fallback;尤其在横屏、折叠屏、刘海屏等场景下误差明显,不能用于关键逻辑分支
真正可靠的判断永远来自配置源头,而不是运行时测高或猜平台。最容易被忽略的是:全局 navigationStyle 设置会静默覆盖所有页面,哪怕你只在某个页面的 style 里写了 "navigationStyle": "default",只要 globalStyle 里是 "custom",它就无效。











