uni-app底部导航栏怎么做 uni-app自定义tabBar实现教程【详解】

星明吖_3113

星明吖_3113

2026-03-23

1179人浏览

原创

uni-app 不能直接用原生 tabbar 实现自定义图标和文字,因其仅支持 80×80 png 图标、不支持 svg/字体图标及动态样式,文字样式完全不可控,且 h5 端降级为 div 模拟导致行为不一致;必须设置 "tabbar": {"custom": true} 并手动实现 custom-tab-bar/index.vue。

uni-app底部导航栏怎么做 uni-app自定义tabbar实现教程【详解】

uni-app 里为什么不能直接用原生 tabBar 做自定义图标和文字?

因为 uni-app 的 tabBar 配置只支持微信小程序、App 和 H5 的基础能力,图标必须是 80×80 PNG,不支持 SVG、字体图标或动态颜色;文字样式(如加粗、行高、间距)完全不可控,且 H5 端会 fallback 成 div 模拟,行为不一致。

真正要“自定义”,就得关掉原生 tabBar,自己手写一个——也就是设置 "tabBar": {"custom": true},然后在项目根目录放 custom-tab-bar/index.vue。

  • 必须在 pages.json 中显式关闭:"tabBar": {"custom": true},否则自定义组件不会被加载
  • custom-tab-bar/index.vue 路径不能错,大小写敏感,uni-app 不会报错提示路径不存在
  • H5 端需额外处理:position: fixed 容易被页面滚动内容盖住,得加 z-index 和 bottom: 0

custom-tab-bar/index.vue 怎么响应页面切换并高亮当前项?

uni-app 不会自动把当前页面路径传给自定义 tabBar 组件,得自己监听 onTabItemTap 或用 getCurrentPages() 推断。

推荐做法是:在 tabBar 组件的 mounted 钩子中调用 uni.getTabBar()(仅 App 和小程序有效),但 H5 不支持;更稳妥的是在每个 tab 页面的 onShow 里触发全局事件,或用 uni.$emit 通知 tabBar 更新 currentIndex。

  • 别依赖 uni.getTabBar() 在 H5 使用,它返回 undefined,会直接报错
  • 用 getCurrentPages().pop().route 可以拿到当前页面路径,但要注意路由带参数时(如 pages/user/user?id=1)需截取 ? 前部分再匹配
  • 高亮状态建议用 class 切换,而不是内联 style,避免 SSR 或多端渲染不一致

点击 tab 时怎么跳转页面又不重复 push?

直接 uni.navigateTo({ url: 'xxx' }) 会导致栈里堆叠多个相同页面;而 uni.switchTab() 只对 tabBar 配置里的页面生效——但你已经关了原生 tabBar,所以它会静默失败,控制台也不报错。

正确做法是:先用 uni.getPages() 查找目标页面是否已在栈中,有则 uni.navigateBack 回退到它;没有则 uni.switchTab(仅小程序/App)或 uni.reLaunch(H5 兼容性更好)。

  • 小程序端 uni.switchTab 仍可用,即使 custom: true,只要目标页在 tabBar.list 配置里
  • H5 必须用 uni.reLaunch,否则 URL 不刷新,页面状态也不会重置
  • 不要在 tabBar 组件里直接调用 uni.navigateTo,容易导致页面栈混乱

图标用 iconfont 或 svg 时为什么在小程序里不显示?

微信小程序不支持直接引用外部字体文件(如 iconfont.css),也不支持 <svg></svg> 标签渲染(除非用 canvas 或 base64 内联);App 端对字体支持较好,但需要把 ttf 文件放进 static 并在 css 中用 @font-face 声明。

最稳方案是:所有图标转成 base64 图片,或使用 uni-app 官方推荐的 uni-icons 组件(它内部做了多端兼容处理)。

  • 别在 custom-tab-bar/index.vue 里用 @import 引入 iconfont.css,小程序编译后失效
  • 如果坚持用字体图标,App 端需确认 ttf 文件放在 static/fonts/,且 css 中 src: url('~@/static/fonts/iconfont.ttf') 写法在 HBuilderX 3.9+ 才支持
  • SVG 推荐用 <image src="data:image/svg+xml;base64,..."></image>,但注意 base64 字符串不能换行,需压缩

自定义 tabBar 表面只是个导航栏,实际牵扯路由控制、跨端差异、生命周期同步、图标资源管理——最容易被忽略的是 H5 和小程序在 switchTab 行为上的根本分歧,以及图标资源在不同平台的加载机制。这些地方一动就出问题,但错误信息往往不明确,得靠日志和真机反复验证。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2503

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5403

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6430

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6058

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

863

5

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

0

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

0

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

0

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习