uni-app 官方 tabBar 支持原生 midButton 配置,需 HBuilderX 3.9.10+/CLI 3.9.0+,midButton 必须直写在 tabBar 对象下、pagePath 必为 tabBar.list 中已注册页面,iconPath 须本地静态资源,H5 不支持需降级自定义组件。

uni-app 官方 tabBar 支持原生 midButton 配置,无需手写自定义组件——这是最简、最稳、跨端兼容的方案。但前提是确认你用的是 HBuilderX 3.9.10+ 或 CLI 3.9.0+(2026 年主流版本均已内置),否则 midButton 不生效或行为异常。
pages.json 中正确配置 midButton 的关键字段
必须把 midButton 直接写在 tabBar 对象下,不是 list 里,也不是子项里。常见错误是把它当做一个 tab 写进 list 数组,结果按钮不显示或点击无响应。
-
pagePath必须是已注册的 tabBar 页面路径(即该页面需出现在tabBar.list中),不能是普通页面(如发布页若非 tabBar 页,需先加到 list 再隐藏文字) -
iconPath和selectedIconPath路径必须是本地静态资源,不能是网络地址或变量拼接 -
width和height建议设为固定值(如"80rpx"、"70rpx"),避免不同端计算差异导致偏移 -
textAlign推荐"bottom",让文字贴在按钮底部;设"center"会导致文字悬浮,和闲鱼风格不符
为什么真机上按钮“凸不起来”或被截断
凸起效果依赖平台原生渲染逻辑,midButton 本身不提供 transform 或 shadow 控制权。视觉“凸起感”实际由三部分组成:按钮自身高度 > tabBar 高度、系统自动添加的阴影、以及 iOS/Android 原生层叠层级。如果没看到凸起,大概率是:
- 未关闭原生 tabBar 占位:检查
pages.json中是否还保留了空的"tabBar": { "list": [] },这会撑开一个不可见区域,压住midButton - iOS 安全区干扰:App 端需在
manifest.json → iOS 设置 → 启动图勾选“使用”,否则midButton可能被安全区裁剪 - H5 端不支持:截至 2026 年 6 月,
midButton在 H5 端仍不生效,必须降级为自定义组件方案,且需监听window.onresize动态调整定位
midButton 点击后跳转非 tabBar 页面的处理
闲鱼的“发布”按钮点开的是普通页面,不进 tabBar 栈。但 midButton.pagePath 强制要求是 tabBar 页面——所以得绕一下:
- 先把发布页加进
tabBar.list,设"text": ""、"iconPath"为空图标,让它“存在但不可见” - 在该页面的
onLoad中立即执行uni.switchTab({url: '/pages/home/home'})回首页,再uni.navigateTo({url: '/pages/publish/publish'}) - 或者更干净的做法:用
uni.showTabBarRedDot({index: 2})触发原生 tabBar 的“中间项点击”事件,然后在uni.onTabItemTap回调里拦截并跳转到非 tabBar 页面
自定义组件仍是 fallback 必选项
哪怕你用了 midButton,也得准备一套自定义 custom-tab-bar 组件备用——因为微信小程序基础库低于 2.28.1、iOS App 微信 WebView、以及所有 H5 环境都不认这个配置。真正上线前必须实测三端:mp-weixin、app-plus、h5。最容易被忽略的是:H5 端的 midButton 无效时,自定义组件里的 pointer-events: auto 若漏写,按钮就完全点不动。



















