必须删除 pages.json 中的 tabBar 配置,否则 custom: true 不生效;自定义 tabBar 需 fixed 定位、safe-area 适配、手动接管跳转与状态,凸起按钮须 absolute 居中且 z-index 足够高。
必须删掉 pages.json 里的 tabBar 配置,否则 custom: true 不生效
设置 "custom": true 后原生 tabbar 区域会被彻底隐藏,但如果你没手动删掉 pages.json 中整个 tabbar 块(或至少注释掉),uni-app 引擎仍会悄悄撑开一个 50px 高的不可见占位层——这会导致你自定义的 tabbar 容器被顶高、凸起按钮被遮挡、安全区计算错乱。
常见错误现象:custom-tab-bar/index.vue 渲染出来了,但底部总有一段“看不见的空白”,或者中间凸起按钮位置飘忽不定。
- 务必检查
pages.json,确认已移除或注释掉tabBar对象(包括list、color等所有字段) -
custom: true是全局开关,不能只对某一页启用;一旦开启,所有 tab 页面都需由你手动接管跳转逻辑 - HBuilderX 不会报路径或配置错误,静默失败是常态,删配置前建议备份
凸起按钮必须用 absolute + fixed 组合定位,别靠 margin 或 transform 模拟
安卓机型 bottom 值不一致,iOS 安全区高度动态变化,滚动时 transform: translateY() 或 margin-bottom 会让凸起按钮在真机上严重偏移,甚至随页面一起滚动。
正确做法是把整个自定义 tabBar 容器设为 position: fixed; bottom: 0; left: 0; right: 0;,再把凸起按钮单独抽离为 position: absolute; 子元素:
<view class="tabbar-container"><view class="tabbar-items">...</view><view class="tabbar-float-btn"></view></view>
- 容器加
padding-bottom: env(safe-area-inset-bottom),避免被刘海/圆角截断 - 凸起按钮用
bottom: 20px; left: 50%; transform: translateX(-50%);居中上浮 - 固定凸起区域总高度(如 60px),并在父容器设对应
height和z-index: 10 - 鸿蒙端
env(safe-area-inset-bottom)可能返回 0,建议 fallback 到padding-bottom: 34px
tab 点击状态和跳转必须手动接管,uni.switchTab 在 custom 模式下会静默失败
原生 tabBar 的高亮、禁用、页面跳转全部失效。uni.onTabItemTap 只响应底部常规 tab 项点击,不触发凸起按钮;而 uni.switchTab() 在 custom: true 后,若目标页未在原 tabBar.list 中(你已删了),就会静默失败且无报错。
- 当前激活项用 data / Pinia 存储,不要依赖 DOM class 切换或
uni.getTabBar()(H5 返回 undefined) - 每个 tab 项点击时,统一走
uni.getPages().find()查栈,存在则uni.navigateBack,否则用uni.reLaunch(H5 必须)或uni.switchTab(仅小程序/App) - 凸起按钮如果是发布功能,绑定
@click后应调用uni.navigateTo({ url: '/pages/publish/index' }),而非switchTab - H5 端
uni.onTabItemTap不触发,需监听uni.$on('tab-change')或路由onLoad/onShow主动通知 tabBar 组件
鸿蒙和微信小程序有平台特异性渲染问题,不是代码写错了
鸿蒙部分版本对 env(safe-area-inset-bottom) 支持不稳定;微信 iOS 版某些版本下 fixed 元素会“抖动”——这些是平台渲染机制差异,强行加 hack 很容易引发新问题。
- 鸿蒙端建议:放弃动态 safe-area,直接设
padding-bottom: 34px(比常规多 4px),并用app-harmony条件编译包裹样式 - 微信小程序 iOS 抖动问题:确保凸起按钮父容器有明确
height和overflow: hidden,避免内部内容重排触发重绘 - 所有图标必须用 80×80 PNG(原生 tabBar 限制仍在),SVG/字体图标需转为 canvas 或 base64 图片
- 别在
custom-tab-bar/index.vue里 import 其他非 H5 兼容的 API(如uni.getSystemInfo未做平台判断)











