必须设 navigationstyle: "custom" 才能交还导航栏控制权,否则页面预留空白;配套 app-plus.titlenview: false 防止安卓留白;用 css 变量 --status-bar-height 替代 js 获取状态栏高度,真机调试才准确。

pages.json 必须设 navigationStyle: "custom"
不设这个,后面所有操作都白搭。它不是“美化选项”,而是把原生导航栏控制权交还给前端的开关。只改 navigationBarHidden 或只设 titleNView: false 都无效——前者在 App 平台被忽略,后者只关原生层绘制,但逻辑上导航栏上下文还在,页面仍会预留空间。
必须在目标页面的 style 节点下写:
"navigationStyle": "custom"
同时配套加:
"app-plus": { "titleNView": false }
否则部分 Android 机型(尤其厂商定制系统)会在顶部渲染一个空白 title 区域,造成不可见的留白。
用 CSS 变量 --status-bar-height 替代 JS 获取
uni.getSystemInfoSync().statusBarHeight 在不同平台返回值不稳定:iOS 返回真实像素,Android 常固定 24/25,全面屏机型可能不准;H5 和小程序环境直接不返回。而 uni-app 在 App 端运行时注入了可靠的 CSS 变量:--status-bar-height,已适配各类刘海屏、挖孔屏。
在根容器(如 <page></page> 或最外层 <view class="container"></view>)加:
padding-top: var(--status-bar-height);
如果用了 <uni-nav-bar></uni-nav-bar>,记得显式设 background-color="transparent",否则默认背景色会挡住状态栏区域。
下拉刷新时内容会穿透透明导航栏,导致状态栏变黑——此时应临时禁用透明,比如用 :class="{ 'nav-transparent': !isPulling }" 配合 onPullDownRefresh 控制。
真机调试必须用正式打包的 IPA/APK
HBuilderX 自带模拟器对 --status-bar-height 渲染不准,也不触发原生窗口 flags 设置,测不出真实沉浸效果。很多“占位没消失”的问题,其实是在模拟器里误判的。
另外注意:plus.navigator.setFullscreen(true) 必须在 onShow(或 onLaunch)中调用,不能放 mounted 或 created——Vue 生命周期早于 plus 环境就绪,调了也静默失败。且必须包裹 #ifdef APP-PLUS,否则 H5 和小程序运行时会报 plus is not defined。
小程序端 content 被砍掉一截?别漏了状态栏高度补偿
微信小程序在 navigationStyle: "custom" 下,会直接移除系统导航栏和状态栏占位,但不会自动帮你留空。页面 <view></view> 默认从 y=0 开始渲染,而状态栏(约 20–44px 高)就压在上面。
不能靠 margin-top: -44px 这类硬写数值的方式修复,容易在不同机型错位。稳妥做法是:
- 在页面
<template></template>顶部加一层空<view class="status-bar"></view>,并用 CSS 设置height: var(--status-bar-height) - 或直接在
page上设padding-top: var(--status-bar-height)(H5 端该变量为 0,可安全忽略) - 若需兼容 iOS 安全区,可在
::root注入:--status-bar-height: env(safe-area-inset-top, 20px)
最易被忽略的一点:H5 端启用 navigationStyle: "custom" 后,<page></page> 元素会从 viewport 顶部开始渲染,但内容可能被状态栏遮挡(尤其 iOS Safari),必须手动重置 page { margin: 0; padding: 0; } 并补足安全区。











