优先选 titleNView: false 用于仅 H5/APP 隐藏导航栏;navigationStyle: “custom” 需全平台适配状态栏,否则小程序内容被状态栏遮挡。

pages.json 里该配 titleNView 还是 navigationStyle?
要看你只针对 H5,还是需要兼容小程序或 App。如果只在 H5 上隐藏导航栏,titleNView: false 是最干净的选择;它只影响 H5 和 App,完全绕过小程序的限制,不会导致小程序白屏或状态栏遮挡问题。navigationStyle: "custom" 则是全平台生效的“硬开关”,一旦设了,所有端都会去掉原生导航栏——包括微信小程序,但小程序会立刻把页面内容顶到屏幕最顶部,不预留状态栏空间,结果就是标题被时间、信号图标盖住。
常见错误现象:H5 看着好好的,一真机调试小程序,首页第一行文字看不见,点开调试器才发现 view 已经贴着屏幕顶边了。
-
titleNView: false→ 推荐用于「仅 H5/APP 隐藏」场景,副作用小,无需额外处理状态栏 -
navigationStyle: "custom"→ 必须搭配自定义导航栏 + 状态栏高度计算,否则小程序必出视觉问题 - 二者不能混用在同一页面 style 中,
navigationStyle优先级更高,会覆盖titleNView的行为
小程序端隐藏后,为什么内容被“砍掉一截”?
因为微信小程序在 navigationStyle: "custom" 下,会直接移除系统导航栏和状态栏占位,但不会自动帮你留空。页面 <view> 默认从 y=0 开始渲染,而状态栏(约 20–44px 高)就压在上面。
实操建议:必须手动读取并应用状态栏高度。
- 用
uni.getSystemInfoSync().statusBarHeight拿高度(注意:H5 返回 0,小程序返回真实值) - 在页面
<template>顶部加一层空<view class="status-bar"></view>,并用 CSS 设置height: var(--status-bar-height) - 更稳妥的做法是用 CSS 变量注入:
:root {--status-bar-height: env(safe-area-inset-top, 20px); },兼容 iOS 安全区
自定义导航栏要不要用第三方组件?
没必要。uni-app 自带的 titleNView 配置已支持按钮、背景色、字体等基础定制,且在 H5 和 App 端渲染为原生视图,性能比纯 <view> 更稳。只有当你需要在导航栏里嵌入搜索框、下拉菜单、复杂交互时,才值得手写一个 <view> 导航栏。
使用场景举例:
- 只需改颜色、加返回按钮 → 直接配
app-plus.titleNView,H5 也认 - 要放搜索框、用户头像、多 tab 切换 → 手写
<view class="custom-nav">,配合position: fixed和状态栏适配 - 用了 uView 或 uni-ui → 它们的
<uni-nav-bar>组件本质也是<view>实现,没性能优势,还多一层封装逻辑
H5 端隐藏后,页面标题还显示吗?
不显示。只要 titleNView: false 或 navigationStyle: "custom" 生效,H5 页面的 <title> 标签不会受影响,但页面内顶部的标题栏 DOM 就彻底没了。如果你仍需展示标题文字,得自己加 <view class="page-title"> 首页 </view>,并控制样式对齐。
容易忽略的一点:H5 的浏览器标签页标题(即 HTML 的 <title>)和 uni-app 导航栏标题是两回事。前者由 globalStyle.navigationBarTitleText 控制,后者只是渲染在页面上的一个 DOM 元素,隐藏导航栏不影响前者。
真正麻烦的是 SEO 场景——如果靠 JS 渲染的导航栏标题是唯一标识,而你又关了它,H5 页面可能丢失关键语义信息。这时候得在 <head> 里手动同步更新 <title>,用 uni.setNavigationBarTitle() 不起作用。