结论:uni-app 不支持滑动隐藏 tabbar 的原生 api,需手动监听页面滚动并调用 uni.hidetabbar()/uni.showtabbar() 控制显隐,仅 app 和 h5 端可靠,小程序端因滚动事件不可用或 tabbar 无法动态隐藏而实际不可行。

直接说结论:uni-app 本身不提供「滑动隐藏 tabBar」的原生能力,必须手动监听滚动 + 调用 uni.hideTabBar() / uni.showTabBar() 控制显隐,且仅在 App 和 H5 端可靠;小程序端因限制无法触发滚动事件或 tabBar 动态隐藏失败,实际不可行。
为什么 uni-app 没有内置滑动隐藏 tabBar 的 API
uni-app 的 tabBar 是原生容器级组件(App 端由 native 渲染,H5 端模拟,小程序端由微信/支付宝框架强管控),它不随页面滚动而联动。所谓“滑动隐藏”,本质是监听页面内容滚动,再根据位移方向和阈值主动控制 tabBar 显隐 —— 这不是配置项,而是需你手写逻辑的交互行为。
常见错误现象:
-
onPageScroll在小程序中不触发(尤其 tabbar 页面),导致监听失效 - 在 App 端未加
animation: true,隐藏/显示突兀、卡顿 - 滚动方向判断只看
scrollTop增减,没加防抖或阈值,导致频繁切换、闪烁
App 和 H5 端:用 onPageScroll + 状态机控制显隐
这是目前唯一稳定可行的方案,适用于使用 scroll-view 或页面自带滚动的场景。
实操建议:
- 在需要该交互的页面(如首页 feed 流)启用页面滚动监听:
"enablePullDownRefresh": false, "onReachBottomDistance": 50不影响,但必须确保页面可滚动 - 在
data中定义状态:tabBarVisible: true,并用lastScrollTop记录上一次位置 - 在
onPageScroll中判断:- 若
scrollTop > this.lastScrollTop + 10(向下滚动且超阈值),调用uni.hideTabBar({ animation: true }) - 若
scrollTop (向上滚动且超阈值),调用 <code>uni.showTabBar({ animation: true }) - 更新
this.lastScrollTop = scrollTop
- 若
- 注意:App 端首次进入页面时,
onPageScroll可能不触发,建议在onShow中先显式调用一次uni.showTabBar()确保初始可见
小程序端:基本不可行,别硬刚
微信/支付宝小程序对 tabBar 的控制极其严格:
-
onPageScroll在 tabBar 页面中默认不执行(除非页面禁用 tabBar,但那就失去意义) -
uni.hideTabBar()在非 tabBar 页面调用会报错"errMsg": "hideTabBar:fail not TabBar page" - 即使绕过限制强行调用,微信也会在切换 tab 后自动恢复 tabBar,无法维持隐藏状态
所以如果你的目标平台包含小程序,这个交互应直接放弃,或降级为:点击顶部按钮手动隐藏/显示,而非滑动触发。
容易被忽略的关键点
滑动隐藏不是“加个样式就完事”,它牵扯到底层渲染机制:
- App 端隐藏后,页面内容会顶到屏幕底部,但原生 tabBar 占位区仍存在(只是不可见),需确认你的内容区域没有被意外裁切
- H5 端
uni.hideTabBar()实际是通过 CSS 把 tabBar 元素transform: translateY(100%),若你自定义了 tabBar 样式或用了 fixed 定位,可能冲突 - 用户快速上下反复滑动时,
uni.hideTabBar()和uni.showTabBar()是异步操作,没加节流会导致调用堆叠、状态错乱 —— 必须加 150ms 防抖
真正在意体验的话,得把滚动监听、状态判断、API 调用、防抖、边界恢复全串起来,而不是只贴几行代码。










