状态栏颜色需按平台、导航栏模式和运行时机分情况处理:pages.json中navigationBarBackgroundColor仅在navigationStyle为"default"时生效且仅影响导航栏;custom模式下须用uni.setNavigationBarColor(参数齐全、时机正确)或plus.navigator.setStatusBarStyle,并配合CSS模拟或原生配置。

状态栏颜色不能靠单一配置一劳永逸,必须按平台、导航栏模式、运行时机分情况处理。
pages.json 里 navigationBarBackgroundColor 不起作用?
这个字段只在 navigationStyle: "default" 时生效,且仅影响原生导航栏区域,不控制状态栏本身(尤其 iOS/Android 真机上)。它和状态栏颜色是两回事——很多人误以为设了这个就等于改了状态栏背景,实际只是导航栏底色。
- 如果页面启用了
"navigationStyle": "custom",navigationBarBackgroundColor完全被忽略 - App 端即使设了,状态栏仍为系统默认色(白底黑字或黑底白字),除非你同时关闭原生导航栏并调用
uni.setNavigationBarColor - 小程序端该字段只影响导航栏标题背景,状态栏背景需靠
uni.setNavigationBarColor单独设置
uni.setNavigationBarColor 调用无效的常见原因
这个 API 行为差异极大,不是写了就能生效。最常踩的坑是参数缺失、时机错误、平台不支持。
-
frontColor和backgroundColor必须**同时传**,缺一不可;frontColor只接受"white"或"black"字符串,不能写"#000000" - 不能在
onLoad早期调用:App 端需等plus对象就绪(建议放onReady+setTimeout(..., 100));小程序端建议延迟 50ms,否则基础库上下文未准备好 - H5 端完全不支持,调用会静默失败或报错,必须用
#ifdef MP-WEIXIN条件编译包裹 - uni-app x 项目中该 API 的
backgroundColor参数无效,状态栏背景恒为透明
自定义导航栏下怎么让状态栏“看起来”有颜色
一旦设 "navigationStyle": "custom",uni-app 就放弃状态栏控制权,你看到的“状态栏”其实是页面顶部一块区域,得自己画。
- 用
uni.getSystemInfoSync().statusBarHeight动态获取高度(不能写死,iPhone X 是 44px,安卓多为 24–30px) - 在
<template></template>顶部加一个<view class="status-bar"></view>,CSS 设position: fixed; top: 0; width: 100%; height: var(--status-bar-height); z-index: 999; - 背景色填你需要的颜色,文字色用普通 CSS 控制(如
color: #666),但这**不是真状态栏文字**,只是视觉模拟 - 滚动时容易移位,务必用
fixed定位,别依赖relative或absolute
App 端真正修改状态栏文字颜色只能靠 plus.navigator
想让状态栏文字变白或变黑,navigationBarTextStyle 在 custom 模式下完全失效,uni.setNavigationBarColor 的 style 参数也只在 App 端有效,且限制极多。
- 必须调
plus.navigator.setStatusBarStyle("light")(白字)或"dark"(黑字),不能传"gray"或十六进制值 - 必须在
onReady后调,onLoad里plus还没初始化 - iOS 需确保原生工程中
UIViewControllerBasedStatusBarAppearance为YES;Android 需在manifest.json中配android:windowLightStatusBar="true" - 厂商 ROM(如小米、华为)可能强制跟随系统深色模式,JS 设置会被覆盖,得监听系统主题变化后重调
最易被忽略的一点:状态栏颜色逻辑必须和导航栏模式严格对齐。设了 custom 却还指望 navigationBarTextStyle 生效,或在 H5 里调 uni.setNavigationBarColor,都是白忙活。跨端项目里,这部分几乎必然要条件编译 + 原生桥接配合。


















