状态栏透明与文字可见需分别配置:背景透明靠CSS或manifest设置,文字颜色必须调用uni.setStatusBarStyle;custom导航栏不控制状态栏样式,需单独处理iOS/Android差异及下拉刷新异常。

状态栏能透明,但文字必须可见——这其实是两个独立控制项:背景透明靠 CSS 或原生配置,文字颜色则必须用 uni.setStatusBarStyle 主动设置。直接设 background-color: transparent 或关掉原生导航栏,不等于文字自动可读;iOS 尤其敏感,不调这个 API,状态栏文字大概率是白底白字或黑底黑字。
navigationStyle: "custom" 后状态栏背景透明了,但文字消失了
custom 模式只交出导航栏控制权,并不接管状态栏样式。状态栏本身仍是系统级 UI 元素,它的背景色和文字色默认由系统决定(比如 iOS 亮色模式下是深色文字 + 浅色背景)。你把自定义导航栏设为 transparent,只是让下方内容透上来,但状态栏文字仍按系统默认风格渲染,可能和背景同色而“隐形”。
- App 端必须在页面就绪后调
uni.setStatusBarStyle('light')或'dark',不能写在onLoad,推荐放在onReady里 - iOS 上该 API 是唯一可靠方式;Android 多数机型也支持,但部分旧版需配合
app-plus下的 manifest 配置 - 不要依赖
navigationBarTextStyle—— 它只对原生导航栏生效,navigationStyle: "custom"下完全无效
pages.json 里 titleNView 设 false 了,状态栏还是不透明
只关 titleNView 不够。App 端状态栏是否透明,取决于两层:一是系统状态栏本身的背景是否被覆盖(需要 manifest 配置),二是你的页面内容是否真的延伸进去了(需要 padding 和透明背景)。
- manifest.json 的
app-plus → ios → statusbar → style必须设为"transparent",否则 iOS 会强制加一层半透灰底 - Android 端还需在
app-plus → android → statusbar下加background字段,例如"#00000000"(全透明) - 即使配置正确,若页面根容器没加
padding-top: var(--status-bar-height),内容会被状态栏遮挡,看起来像“没透”
为什么 uni.getSystemInfo().statusBarHeight 不准,还经常是 0
JS 获取时机太早,且跨平台语义混乱。iOS 返回的是真实像素值(如 47),Android 常返回 24–25,但全面屏下系统可能动态拉高;H5 和小程序环境压根不返回该字段。更糟的是,onLoad 阶段 DOM 和系统信息都未就绪,statusBarHeight 极易为 0。
- App 端优先用 CSS 变量
var(--status-bar-height),它由 uni-app 运行时注入,已适配各刘海/挖孔屏 - 真需 JS 读取,等
onReady后调getComputedStyle(document.documentElement).getPropertyValue('--status-bar-height') - 小程序端别硬套 App 逻辑——它不支持状态栏透明,
--status-bar-height值为 0,应条件编译屏蔽相关样式
下拉刷新时状态栏变黑、文字闪一下就没了
这是 webview 整体下拉导致的渲染层错乱。透明导航栏下,内容被拖进状态栏区域,Android 渲染顺序异常,常把状态栏背景刷成黑色;iOS 则可能重置文字色。
- 根本解法不是修样式,而是行为隔离:下拉中临时关闭沉浸效果
- 给导航栏加 class 绑定:
:class="{ 'nav-no-trans': isPulling }",并在onPullDownRefresh中设isPulling = true,stopPullDownRefresh后设isPulling = false - class 内只需重置
background-color和必要时调一次uni.setStatusBarStyle('dark')强制回退
最易忽略的点:iOS 状态栏文字色切换不是“设置即生效”,它有延迟且受系统动画影响;若页面刚打开就快速滚动或下拉,setStatusBarStyle 可能被丢弃。稳妥做法是在 onReady 调一次,再在 onPageScroll 或下拉回调里补一次。


















