app端状态栏透明需设navigationstyle: "custom"并关闭titlenview,根容器用padding-top: var(--status-bar-height),导航栏背景设transparent,下拉刷新时临时禁用透明,ios需调uni.setstatusbarstyle控制文字颜色。

App 端状态栏背景透明,本质不是“隐藏状态栏”,而是让页面内容延伸到状态栏下方,并确保自定义导航栏视觉上与之融合——navigationStyle: "custom" 是前提,但光设这个远远不够。
pages.json 必须关闭原生标题栏
只写 navigationStyle: "custom" 不生效,必须同时禁用 titleNView,否则原生栏仍会叠加在自定义内容之上:
- 在对应页面的
pages.jsonstyle节点下,加"titleNView": false - App 端需在
app-plus子节点里配,例如:{"app-plus": {"titleNView": false}} - 微信小程序也认
navigationStyle: "custom",但不支持状态栏透明,建议用#ifdef APP-PLUS条件编译包裹相关配置
根容器和导航栏都要手动处理高度与透明
--status-bar-height 是 uni-app 在 App 端注入的 CSS 变量,已适配刘海屏/挖孔屏,比 JS 获取更稳:
- 页面根容器(如最外层
<view></view>)加padding-top: var(--status-bar-height),防止内容被遮挡 - 自定义导航栏元素(比如
<view class="nav"></view>或<uni-nav-bar></uni-nav-bar>)必须显式设background-color: transparent - 若用
<uni-nav-bar></uni-nav-bar>,默认有背景色,得绑定:background-color="transparent",不能只靠 class - 避免加
box-shadow、border或半透叠加层,否则破坏透明感
下拉刷新时状态栏变黑?临时关透明是正解
开启 "enablePullDownRefresh": true 后,webview 整体下拉,透明导航栏下的内容会顶入状态栏区域,Android 渲染顺序错乱易导致黑屏或闪烁:
- 不要试图用
z-index或重绘修复,这是原生层叠加逻辑问题 - 正确做法:下拉中临时禁用透明,例如用
:class="{ 'nav-transparent': !isPulling }" - 在
onPullDownRefresh里设isPulling = true,stopPullDownRefresh后设isPulling = false - 真机调试务必用正式打包的 IPA/APK,HBuilderX 模拟器对状态栏渲染有偏差
别在 onLoad 里调 getSystemInfoSync()
uni.getSystemInfoSync().statusBarHeight 在 onLoad 阶段常返回 0 或错误值,尤其 Android 全面屏机型:
- CSS 中直接用
var(--status-bar-height)即可,无需 JS 计算 - 若真需 JS 读取(比如动态控制某元素),等
onReady后用getComputedStyle(document.documentElement).getPropertyValue('--status-bar-height') - iOS 和 Android 对
statusBarHeight定义不同,且 H5/小程序环境可能不返回该字段,--status-bar-height是唯一跨平台可靠的方案
最容易被忽略的是:iOS 状态栏文字颜色无法通过 uni.setNavigationBarColor 控制,它只作用于原生导航栏;你用了 custom 模式,就得用 uni.setStatusBarStyle('light') 或 'dark' 主动切换。











