navigationstyle设为custom后标题栏不透明,因custom仅交出控制权而非自动透明;需手动设置padding-top:var(--status-bar-height)、background-color:transparent,并避免下拉刷新时内容穿透。

navigationStyle: "custom" 后标题栏为啥还是不透明
不是配置没生效,而是 custom 只是交出控制权,并不自动设透明。你写的 <view class="nav"></view> 默认仍渲染在普通层,会被状态栏遮挡或与原生栏重叠,视觉上像“没变”。
- 必须在
pages.json中对目标页面设"navigationStyle": "custom" - 页面根容器(如
<view></view>)加padding-top: var(--status-bar-height),不是固定20px -
<view class="nav"></view>的background-color必须显式设为transparent,不能带阴影、边框或半透叠加 - 若用
<uni-nav-bar></uni-nav-bar>,它默认有背景色,需绑定:background-color="transparent"
为什么不能用 uni.getSystemInfo().statusBarHeight
iOS 和 Android 对 statusBarHeight 的定义不同:iOS 返回真实像素高度(如 47),Android 多数返回 24 或 25,但全面屏/刘海屏下系统可能动态拉高;H5 和小程序环境甚至不返回该字段。
-
--status-bar-height是 uni-app 在 App 端注入的 CSS 运行时变量,仅在navigationStyle: "custom"下可用,且已跨平台适配 - 不要在
onLoad里调uni.getSystemInfo,此时值常为0 - 样式中直接写
height: calc(var(--status-bar-height) + 44px)或padding-top: var(--status-bar-height) - JS 中需用
onReady后取getComputedStyle(document.documentElement).getPropertyValue('--status-bar-height')
下拉刷新时内容穿透、安卓状态栏变黑怎么办
这是原生 webview 下拉机制导致的:开启 "enablePullDownRefresh": true 后,整个 webview 被拖动,透明导航栏下的内容直接顶入状态栏区域,Android 渲染顺序错乱易引发闪烁或黑屏。
- 根本解法不是调样式,而是约束行为边界:下拉期间临时关闭透明效果,例如加 class:
:class="{ 'nav-transparent': !isPulling }" - 配合
onPullDownRefresh设isPulling = true,stopPullDownRefresh后设isPulling = false - 避免在自定义导航栏内放可滚动/弹窗类交互(如搜索框聚焦弹软键盘),否则键盘顶起会破坏沉浸布局
iOS 状态栏文字颜色切不了?
uni.setNavigationBarColor 在 navigationStyle: "custom" 下完全无效 —— 它只作用于原生导航栏。你看到文字颜色没变,是因为状态栏文字由系统独立控制。
- iOS 必须用
uni.setStatusBarStyle('light')或'dark'主动切换 - 切换时机要联动导航栏背景:比如当渐变栏变浅时,立刻调
uni.setStatusBarStyle('dark') - Android 不支持该 API,务必用
uni.getSystemInfoSync().platform === 'ios'包一层判断
transparent 就完事,核心在于三件事同步:CSS 变量取高、JS 控制状态栏文字、行为边界兜底(如下拉/键盘场景)。漏掉任意一环,都会在某台真机上突然失效。











