Skip to content

n-navbar 自定义导航栏 ​

页面在 pages.json 配置 "navigationStyle": "custom" 隐藏系统导航栏后,用本组件替代:状态栏占位 + 返回箭头 + 标题 + 左右操作区。微信端自动避让右上角胶囊按钮;固定在顶部时可生成等高占位防止内容塌陷;标题、图标、文字、颜色、分隔线均可配置。

平台兼容性 ​

App Web 微信小程序
✓ ✓ ✓

微信端左右操作区自动对称避让胶囊按钮(左区让开胶囊右缘、右区让开胶囊左缘,与原生导航栏箭头位置对齐),其他端无胶囊不避让。init 事件在布局就绪时上报一次导航栏高度、状态栏高度与胶囊信息(非微信端胶囊字段为 -1/0),供页面内容区自行计算顶部偏移。使用前需在目标页面 style 中配置 "navigationStyle": "custom",并按需设置 "navigationBarTextStyle" 控制状态栏文字颜色(H5 无效)。

基本用法 ​

组件放页面内容流的最前面(与普通节点同层):fixed + placeholder 开启时,等高占位随组件落在文档流顶部,内容自然从导航栏下方开始;组件放内容之后占位推不动顶部内容,会被导航栏遮挡。

零配置:默认渲染返回箭头,点击自动返回上一页(页面栈只有当前页时不动作,leftClick 仍触发):

html
<template>
  <n-navbar title="个人中心" @rightClick="onRight" />
</template>

需要跳转到指定页面时关闭自动返回,在 leftClick 中按应用路由配置调用原生导航 API。目标路径必须已在应用 pages.json 注册;tabBar 页面使用 uni.switchTab,普通页面使用 uni.navigateTo。下面使用本工程 pages.json 中实际注册的 tabBar 页面:

html
<n-navbar title="个人中心" :auto-back="false" @leftClick="onLeftClick" />
ts
function onLeftClick(): void {
	uni.switchTab({ url: "/pages/tabbar/component" });
}

临时禁用左侧返回操作时使用 backable:内置图标和左侧文字降低透明度,点击不会自动返回,也不会触发 leftClick。自定义 left 插槽的视觉状态由插槽内容负责;auto-back 仍只决定启用时由组件自动返回还是交给调用方处理。

html
<n-navbar title="个人中心" :backable="false" />

左侧"返回"文字与右侧操作(文字 / 图标任选):

html
<n-navbar title="个人中心" left-text="返回" right-text="帮助" @rightClick="onRight" />
<n-navbar title="设置" right-icon="map" />

左侧图标样式通过 left-icon-style 透传到内置 n-icon,用于颜色以外的样式调整:

html
<n-navbar title="设置" left-icon-style="transform:scale(1.05);" />

left-icon-style 与 right-icon-style 左右对称,可调整对应侧图标外观;图标宽度、字号和行高始终由 left-icon-size / right-icon-size 控制。内置图标使用单字重字体,font-weight 不能保证字形变粗;需要指定粗细时,通过 left 插槽提供已具备目标粗细的图标。

固定顶部并生成等高占位、显示分隔线(通常页面主体从导航栏下方开始时开启):

html
<n-navbar title="导航栏" fixed placeholder border />

自定义左右与中部内容(具名插槽替换对应区域,default 插槽整行接管):

html
<n-navbar title="个人中心" left-text="返回">
  <template #left>
    <n-icon name="arrowleft" :size="19" />
  </template>
  <template #right>
    <n-icon name="home" :size="20" />
  </template>
</n-navbar>

深色背景导航栏:文字与图标颜色用 color 统一调整,标题细节用 title-style:

html
<n-navbar title="个人中心" bg-color="#007aff" color="#ffffff" />

title-style 接受 CSS 字符串或样式对象:

html
<n-navbar title="个人中心" :title-style="{ color: '#ffffff', fontSize: '16px', fontWeight: 600 }" />

API ​

属性 ​

属性 类型 默认值 说明
custom-class string "" 挂到根节点的额外 class(类须在组件样式表内定义,页面 class 打不进组件)
custom-style string "" 根节点行内样式
title string | number "" 标题文字或数字;空字符串/空值不渲染标题(中区仍占位居中)
left-text string "" 左侧返回箭头旁的提示文字,如"返回"
right-text string "" 右侧提示文字
left-icon string "left" 左侧图标名(n-icon 内置表或 registerIconFont 注册名);空字符串隐藏图标;默认为系统返回键同形细箭头
right-icon string "" 右侧图标名;空字符串不渲染
left-icon-size number | string 20 左侧图标尺寸,数字或 px/rpx 字符串
right-icon-size number | string 20 右侧图标尺寸,数字或 px/rpx 字符串
left-icon-color string "" 左侧图标颜色;空字符串跟随 color,color 也为空时用主题文字色
left-icon-style string "" 透传到内置左侧 n-icon 的 customStyle;图标宽度、字号、行高及 backable 禁用透明度由组件控制,不受此样式覆盖;内置字形只有常规字重,font-weight 不保证加粗;left 插槽接管时不生效
right-icon-style string "" 透传到内置右侧 n-icon 的 customStyle;图标宽度、字号、行高由组件控制,不受此样式覆盖;right 插槽接管时不生效
right-icon-color string "" 右侧图标颜色;空字符串跟随 color,color 也为空时用主题文字色
color string "" 导航栏文字与图标的统一颜色;空字符串用主题文字色(深浅自适应)
bg-color string "" 导航栏背景色,支持实色与渐变(如 linear-gradient(to right,#a,#b),App 端请用方向关键词形式);空字符串用主题表面色(深浅自适应)
title-style string | UTSJSONObject "" 标题文字外观样式;接受 CSS 字符串或样式对象
title-width number | string "400rpx" 标题最大宽度,超出省略号截断,数字或 px/rpx 字符串;标题与 center 插槽均受左右实测操作区和微信胶囊边界限制;0 或负值表示只按安全边界限宽
height number | string 44 导航行高度,数字或 px/rpx 字符串(不含状态栏高度,状态栏自动加上)
safe-area-inset-top boolean true 是否垫状态栏高度(自定义导航页应开启;页面仍有系统导航栏时关闭)
fixed boolean false 是否固定在页面顶部
placeholder boolean false 固定时是否生成等高占位元素防止内容塌陷
border boolean false 是否显示底部分隔线
backable boolean true 是否启用左侧返回操作;关闭后内置图标和文字半透明且不触发 leftClick;自定义 left 插槽外观由调用方处理
auto-back boolean true 点击左侧区域时是否自动返回上一页(页面栈只有当前页时不动作)
z-index number | string 996 层级;支持数字字符串
padding number | string 8 左右操作区基础内边距,数字或 px/rpx 字符串(微信端胶囊避让在此基础上叠加)
line-color string "" 底部分隔线颜色;空字符串使用主题分隔线色(深浅自适应)

事件 ​

事件 参数 说明
leftClick — 启用 backable 时点击左侧区域触发;auto-back 开启且存在上一页时组件已先执行返回。关闭 auto-back 后由调用方在此事件中执行自定义导航,包含 tabBar 跳转
rightClick — 点击右侧区域时触发
titleClick — 点击标题时触发(title 非空且未使用 center 插槽)
init 布局信息就绪时触发一次;height 为导航行高(不含状态栏),胶囊三字段非微信端为 -1/0

插槽 ​

名称 说明 参数
default 整行接管导航行内容(内置左中右全部不渲染,状态栏占位保留) —
left 替换左侧区域内容(返回图标与文字不再渲染;backable 启用时点击触发 leftClick) —
center 替换中部标题(title 与 title-style 不再生效,titleClick 不触发) —
right 替换右侧区域内容(右侧图标与文字不再渲染,点击仍触发 rightClick) —

实现说明(机制对照) ​

机制 参考做法 本库做法 分歧理由
布局结构 一参考左右区绝对定位 + 标题弹性居中;另一参考左右各 150rpx 定宽 + 标题弹性居中 左右区绝对定位盖在中区两端,中区弹性居中并按实测操作区收窄 标题保持屏幕居中,同时避开实际左右内容尺寸
胶囊避让 一参考组件内自动避让;另一参考 init 上报胶囊信息由使用者处理 微信端左右操作区按胶囊边界留空,标题按胶囊及实际操作区边界裁切;init 仍上报胶囊信息 内部避让零接线,上报保留页面自行布局入口
返回逻辑 一参考默认可返回、支持返回到指定路径;另一参考 autoBack 属性控制 autoBack 默认 true:页面栈深度大于 1 时 uni.navigateBack;关闭后由 leftClick 执行自定义导航 自动返回与工程路由解耦;页面路径和 tabBar 目标由调用方按项目配置选择原生 API
返回禁用 Cool 提供 backable,false 时返回图标半透明且阻止返回 backable=false 时内置左侧内容半透明并阻止导航和 leftClick;自定义 left 插槽外观由调用方处理;autoBack 独立控制自动返回或自定义事件 禁用反馈覆盖内置箭头及其提示文字,插槽内容由调用方控制
状态栏占位 三参考分别名 safeAreaTop / statusBar / safeAreaInsetTop safeAreaInsetTop,默认 true 跟随自定义导航场景的主流默认(自定义导航页必须垫状态栏)
固定与占位 一参考固定即自带占位;一参考 fixed + placeholder 两开关;一参考 isFixed + isOccupy fixed + placeholder 两开关(placeholder 默认 false) 占位独立可控:非滚动页可省一个占位节点
分隔线 border / splitLine border,默认 false;颜色走主题分隔线令牌 跟随语义化命名;深浅主题自适应
标题限宽 titleWidth 默认 400rpx,超出省略 同款默认与省略行为 标题与 center 插槽均受实测可用宽度约束,内置标题额外遵守 title-width
标题字号字重 一参考 size(17px)/ fontWeight 属性 默认 16px 常规字重(系统导航栏标题即默认字号不单设),不设专属属性,title-style 承接全部排版 行内样式可表达全部排版细节,避免属性面重复;字号对齐官方导航栏组件实现(标题继承默认字号)
标题类型 一参考元数据 title 允许数字 title 接受 string | number,内部统一字符串化判断 数字标题(计数等场景)直接可用,0 等 falsy 值不被误判为空
左侧图标字重 本地参考元数据列有 leftIconBold;在线属性表未列该项 当前内置字体只有常规字形,不提供无法由字体资产兑现的加粗承诺;left-icon-style 仅用于普通样式调整 单字重自定义字体不能依靠 CSS font-weight 跨平台保证加粗;需要增加经验证的粗体字形资产后才能提供此能力
渐变背景 一参考 background 传 linear-gradient(...) 演示 bgColor 兼容:含 gradient 走 background-image 变量类(节点重建),实色走 background-color 变量类 对齐参考渐变导航能力;App 端禁 background 简写与角度形式,示例用方向关键词
左右区内边距 一参考 padding 属性(默认 8px) padding 属性(数字或 px/rpx),微信端胶囊避让在其上叠加 padding 是左右区域唯一的基础内边距来源
分隔线颜色 一参考 lineColor 属性 line-color 属性,空值走主题分隔线令牌 实例级覆盖与主题自适应并存
自定义返回 一参考通过路由器 backPath 导航;另一参考提供 autoBack autoBack 默认返回上一页;关闭后通过 leftClick 事件由调用方选择 navigateTo、switchTab 等原生 API 组件不依赖应用路由表;自定义路径与 tabBar 目标交由调用方根据工程配置选择原生导航 API
init 事件 created 时上报 windowWidth / height(44) / statusBarHeight / 胶囊 left·width·height(非微信 -1/0) onMounted 同载荷上报一次 载荷与参考逐字段一致;供页面内容区自行计算顶部偏移
图标样式通道 三参考均未提供图标样式透传属性 left-icon-style / right-icon-style 左右对称透传到内置 n-icon 的 customStyle;宽度、字号、行高殿后守卫 同侧图标细调不必整区插槽替换;几何不开放覆盖,避免与 iconSize 形成双事实源
插槽 一参考 left/right/center 三具名;一参考 default 整行接管(custom 开关) left/right/center 三具名 + default 整行接管(有 default 即接管,无开关) 功能面并集;default 接管与本库整钮/整区替换惯例一致(如返回顶部组件)
图标默认值 左侧默认返回箭头(arrow-left,chevron 细箭头形) left-icon 默认 left(本库内置表中的同形细箭头) 与参考及系统返回键同形,不用带杆箭头;参考实现不可核实的加粗能力不收
颜色体系 文字色/背景色/图标色逐项属性 color 统一文字与图标色、bgColor 背景、leftIconColor/rightIconColor 逐侧覆盖;空值走主题令牌(深浅自适应) 深色背景一处改色全覆盖;需要精细区分时用逐侧覆盖

记录 · 思考 · 创作