微信小程序案例 - 自定义 tabBar

一、前言

微信小程序原生的 tabBar 提供了底部导航栏的基础功能,但其样式和交互受限,难以满足日益增长的 UI 设计需求。因此,越来越多的小程序项目选择使用 自定义 tabBar 来实现更灵活、更美观的底部导航。

本文将带你从零开始,手把手实现一个完整的 微信小程序自定义 tabBar 案例,包括:

✅ tabBar 的结构设计
✅ 动态切换页面
✅ 图标与文字高亮状态管理
✅ 样式美化与响应式适配
✅ 页面跳转逻辑处理
✅ 完整代码示例

并通过图文结合的方式帮助你掌握如何在实际项目中灵活应用自定义 tabBar。

二、为什么需要自定义 tabBar?

原生 tabBar 局限自定义 tabBar 优势
样式固定,无法修改图标大小、颜色等可自由定制样式
最多只能配置 5 个 tab 页灵活扩展,可做横向滚动
不支持中间凸起按钮支持自定义布局
难以集成动态数据可绑定数据、响应事件

三、项目目标

我们将实现一个类似美团风格的自定义 tabBar,包含以下功能模块:

模块功能描述
底部导航栏包含首页、分类、购物车、我的 四个 tab
图标+文字每个 tab 显示图标与文字
高亮状态切换当前 tab 图标与文字变色
页面切换点击 tab 切换对应页面内容
样式统一管理使用公共样式文件控制主题

四、项目结构说明

project/ ├── app.js ├── app.json ├── app.wxss ├── components/ │ └── custom-tab-bar/ │ ├── tab-bar.js │ ├── tab-bar.json │ ├── tab-bar.wxml │ └── tab-bar.wxss ├── pages/ │ ├── index/ │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ ├── category/ │ ├── cart/ │ └── user/ └── utils/

我们通过封装一个组件 custom-tab-bar 实现底部导航栏,并在主页中调用该组件。

五、自定义 tabBar 组件实现

✅ 1. 创建组件目录

components/custom-tab-bar/ ├── tab-bar.js ├── tab-bar.json ├── tab-bar.wxml └── tab-bar.wxss

✅ 2. tab-bar.json(组件配置)

{ "component": true }

✅ 3. tab-bar.wxml(组件结构)

<view> <block wx:for="{{list}}" wx:key="index"> <viewactive' : ''}}" bindtap="switchTab" > <image src="{{currentIndex == index ? item.selectedIconPath : item.iconPath}}" mode="aspectFit"/> <text>{{item.text}}</text> </view> </block> </view>

✅ 4. tab-bar.wxss(组件样式)

.tab-bar { position: fixed; bottom: 0; left: 0; right: 0; height: 98rpx; display: flex; justify-content: space-around; align-items: center; background-color: #fff; border-top: 1rpx solid #eee; } .tab-bar-item { display: flex; flex-direction: column; align-items: center; justify-content: center; } .icon { width: 48rpx; height: 48rpx; margin-bottom: 6rpx; } .text { font-size: 24rpx; color: #666; } .tab-bar-item.active .text { color: #ff6600; }

✅ 5. tab-bar.js(组件逻辑)

Component({ properties: { list: { type: Array, value: [] }, currentIndex: { type: Number, value: 0 } }, methods: { switchTab(e) { const index = e.currentTarget.dataset.index; const path = e.currentTarget.dataset.path; this.triggerEvent('tabchange', { index, path }); } } });

六、在页面中使用自定义 tabBar

✅ 1. 引入组件

pages/index/index.json 中引入组件:

{ "usingComponents": { "custom-tab-bar": "/components/custom-tab-bar/tab-bar" } }

✅ 2. index.wxml 中使用组件

<view> <!-- 页面主体内容 --> <swiper current="{{currentTab}}" duration="300"> <swiper-item wx:for="{{tabPages}}" wx:key="index"> <block wx:if="{{currentTab == index}}"> <view wx:if="{{index == 0}}">首页内容</view> <view wx:if="{{index == 1}}">分类内容</view> <view wx:if="{{index == 2}}">购物车内容</view> <view wx:if="{{index == 3}}">我的内容</view> </block> </swiper-item> </swiper> <!-- 自定义 tabBar --> <custom-tab-bar list="{{tabList}}" currentIndex="{{currentTab}}" bind:tabchange="onTabChange" /> </view>

✅ 3. index.js 页面逻辑

Page({ data: { currentTab: 0, tabList: [ { text: '首页', iconPath: '/images/icon-home.png', selectedIconPath: '/images/icon-home-active.png', pagePath: 'index' }, { text: '分类', iconPath: '/images/icon-category.png', selectedIconPath: '/images/icon-category-active.png', pagePath: 'category' }, { text: '购物车', iconPath: '/images/icon-cart.png', selectedIconPath: '/images/icon-cart-active.png', pagePath: 'cart' }, { text: '我的', iconPath: '/images/icon-user.png', selectedIconPath: '/images/icon-user-active.png', pagePath: 'user' } ], tabPages: ['index', 'category', 'cart', 'user'] }, onTabChange(e) { const { index, path } = e.detail; this.setData({ currentTab: index }); // 可选:跳转到对应页面 // wx.navigateTo({ url: `/pages/${path}/${path}` }); } });

七、样式优化建议

✅ 1. 图标尺寸统一

  • 推荐使用 SVG 或 PNG 图标,统一尺寸为 48rpx x 48rpx
  • 高亮图标建议使用不同颜色区分

✅ 2. 文字颜色变化

  • 默认颜色 #666
  • 高亮颜色 #ff6600(橙色)或根据品牌色调整

✅ 3. 添加阴影效果(可选)

.tab-bar { box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.1); }

八、实战扩展:中间凸起按钮(如“发布”按钮)

如果希望实现类似小红书或抖音的中间凸起按钮,可以修改 tab-bar.wxml 如下:

<view> <block wx:for="{{list}}" wx:key="index"> <viewactive' : ''}}" bindtap="switchTab" > <image src="{{currentIndex == index ? item.selectedIconPath : item.iconPath}}" mode="aspectFit"/> <text>{{item.text}}</text> </view> </block> <!-- 中间按钮 --> <view bindtap="onCenterClick"> <image src="/images/icon-publish.png" mode="aspectFit"/> <text>发布</text> </view> </view>

并在 tab-bar.wxss 中添加样式:

.center-button { position: absolute; top: -20rpx; left: 50%; transform: translateX(-50%); width: 100rpx; height: 100rpx; background-color: #ff6600; border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center; color: #fff; z-index: 10; }

九、常见问题与解决方案

问题原因解决方案
tabBar 不显示组件未正确引入检查 usingComponents 配置
切换无反应未绑定 tabchange 事件检查事件监听是否正确
图标路径错误路径不正确使用绝对路径或检查层级关系
页面未更新数据未触发 setData检查数据绑定
无法点击中间按钮z-index 层级被遮挡设置更高 z-index

十、总结对比表:原生 vs 自定义 tabBar

特性原生 tabBar自定义 tabBar
样式灵活性
图标/文字自定义
中间凸起按钮
页面切换控制
多 tab 扩展能力
开发复杂度简单中等
维护成本中等

十一、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

Read more

打破藩篱:用HomeAssistant统一小米、美的、格力的智能家居江湖

清晨,你被小米闹钟唤醒,对着空气说“拉开窗帘”,美的空调悄然调整至舒适温度,格力的加湿器开始工作。这并非某个封闭生态系统,而是一位普通用户凭借开源力量构建的跨品牌智能生活。 当智能家居遍地开花,家中却堆满了不同品牌、无法互联的“智能孤儿”,那个你曾幻想中便捷的自动化生活,是否正被十几个割裂的APP所瓦解? 行业报告显示,中国家庭平均拥有超过7个智能设备,但跨品牌形成有效联动的比例不足15%。幸运的是,一个强大的开源解决方案正在终结这种混乱。 01 围城:品牌生态圈,智能家居的甜蜜与苦涩 智能家居行业已形成清晰的品牌阵营:以小米、华为、荣耀为代表的科技公司试图通过操作系统或生态链整合入口。 美的、海尔、格力等传统家电巨头则依托硬件制造和全屋场景深度布局。以小米AIoT平台为例,其已连接超过10亿台IoT设备。 这种格局下,消费者面临两难选择:或绑定单一品牌,接受其有限的产品线;或享受选择自由,却承受“协议孤岛、云端壁垒、功能阉割”的代价。 正如一位网友吐槽:“我控制小米的灯要用‘米家’,调节美的空调得开‘美的美居’,查看格力空气净化器又得切到‘格力+’。” 02

多模态动态融合模型Predictive Dynamic Fusion阅读与代码分析运行1-信度概念与基础参数指标

多模态动态融合模型Predictive Dynamic Fusion阅读与代码分析运行1-信度概念与基础参数指标

参考文:Cao B, Xia Y, Ding Y, et al. Predictive Dynamic Fusion[J]. arXiv preprint arXiv:2406.04802, 2024.[2406.04802] Predictive Dynamic Fusion 一、理论 今天就先看看论文中的各个指标含义和多模态训练代码的参数吧 文章中一个比较重要的概念就是置信度的概念了,在论文前段,对置信度的扩展比较多同时没有什么具体说明,不知道概念的话读着还是很混乱的; 置信度 在机器学习中,置信度表示模型对其预测结果“有多确定”。 它刻画的是:模型认为自己预测是正确的程度 例如,在分类任务中:“这是正类的概率是 0.92”,那么 0.92 就可以视为模型对该预测的置信度 在监督学习中,给定输入样本 xxx,模型预测类别为

传统VS 8MAV:无人机巡检效率对比实验

快速体验 1. 打开 InsCode(快马)平台 https://www.inscode.net 2. 输入框内输入如下内容: 开发一个电力线路巡检效率对比工具,功能包括:1. 模拟单无人机巡检过程 2. 模拟8MAV集群巡检 3. 自动计算两种模式的时间成本 4. 生成效率对比图表 5. 支持自定义巡检区域设置。要求使用Python,包含OpenCV图像处理库,输出详细的效率分析报告。 1. 点击'项目生成'按钮,等待项目生成完整后预览效果 传统VS 8MAV:无人机巡检效率对比实验 最近在做一个电力线路巡检的项目,发现传统单无人机巡检效率确实存在瓶颈。为了验证8MAV集群系统的优势,我开发了一个效率对比工具,记录下整个过程和发现。 项目背景与需求分析 电力线路巡检是个耗时耗力的工作。传统方式需要巡检员带着单台无人机,一段段线路慢慢飞,不仅效率低,遇到复杂地形还容易漏检。8MAV集群系统理论上可以多机协同作业,但具体能提升多少效率,

【AI绘画】DALL·E 3 绘图功能与 DALL·E API 探索

【AI绘画】DALL·E 3 绘图功能与 DALL·E API 探索

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]本文专栏: AI绘画 文章目录 * 💯前言 * 💯DALL·E 3 图像生成介绍 * 图像质量与分辨率 * 图像生成机制的解析 * 多图生成功能 * 💯使用 DALL·E 编辑器界面 * 实际应用 * 编辑器的实用建议 * 💯DALL·E API 的探索 * 获取API Key的基本步骤 * API 功能概览 * 实际应用场景 * 使用注意事项 * 最佳实践 * 💯小结 💯前言 DALL·E 3 是 OpenAI 最新的图像生成技术,通过对文本描述的深度理解和生成对抗网络(GANs)的应用,能够快速生成高质量、细节丰富的图像。本文将从图像生成机制、分辨率与格式选择、多图生成功能、编辑器界面操作及 API 的使用等多个方面,