app端实现沉浸式导航栏需设navigationstyle: "custom"并配合"titlenview": false,用var(--status-bar-height)设置padding-top,导航栏背景透明,下拉刷新时临时禁用透明,真机调试须用正式包。

App 端实现沉浸式导航栏,关键不是“隐藏状态栏”,而是让内容自然延伸到状态栏下方,并确保自定义导航栏视觉上与之融合——navigationStyle: "custom" 只是交出控制权,不等于自动沉浸。
pages.json 里必须设 navigationStyle: "custom"
这是所有沉浸式操作的前提。不能只在 App 端配,要写在对应页面的 style 节点下(或全局 globalStyle),且需配合 "titleNView": false(尤其 App 端):
-
"titleNView": false才真正关闭原生导航栏,否则custom会被忽略 - 微信小程序也支持
custom,但不支持状态栏透明,需用#ifdef MP-WEIXIN条件编译绕过相关样式 - H5 端设
custom无实际效果,--status-bar-height值为 0,直接忽略该变量即可
CSS 中用 var(--status-bar-height) 占位,别调 uni.getSystemInfoSync()
这个 CSS 变量由 uni-app 在 App 端运行时注入,已适配 iOS/Android 各类刘海屏、挖孔屏,比 JS 获取更稳:
- 页面根容器加
padding-top: var(--status-bar-height),防止内容被状态栏遮挡 - 自定义导航栏(如
<view class="nav"></view>)必须设background-color: transparent,且不能有box-shadow或border,否则会破坏透明感 - 避免在
onLoad里调uni.getSystemInfoSync()取高度——此时 DOM 未就绪,statusBarHeight常为 0;真需 JS 读取,等onReady后用getComputedStyle(document.documentElement).getPropertyValue('--status-bar-height')
下拉刷新时内容穿透?加状态隔离逻辑
开启 "enablePullDownRefresh": true 后,webview 整体下拉,透明导航栏下的内容就会顶进状态栏区域,Android 尤其容易变黑或闪烁:
- 不要试图靠
z-index或重绘修复,这是原生层叠加顺序问题 - 正确做法是:下拉中临时禁用透明,比如绑定
class="{ 'nav-transparent': !isPulling }",并在onPullDownRefresh设isPulling = true,stopPullDownRefresh后设isPulling = false - 若导航栏内含输入框,软键盘弹出时同样会顶起内容,建议这类页面直接禁用
custom模式,或改用原生输入组件
最易被忽略的一点:真机调试必须用正式打包的 IPA/APK,HBuilderX 模拟器对 --status-bar-height 渲染不准,且不触发原生窗口 flags 设置,测不出真实沉浸效果。











