跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptWeChat大前端

微信小程序自定义 tabBar 开发实战

微信小程序自定义 tabBar 的实现方案。针对原生 tabBar 样式受限、数量限制等问题,通过封装自定义组件实现底部导航栏。内容包括组件结构设计、动态页面切换、图标文字高亮管理、样式美化及中间凸起按钮扩展。文章提供了完整的项目结构、WXML/WXSS/JS 代码示例,并总结了常见问题与解决方案,帮助开发者灵活构建美观的底部导航。

莫名其妙发布于 2026/4/6更新于 2026/9/677 浏览

一、前言

微信小程序原生的 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">
    <view class="{{currentIndex == index ? 'active' : ''}}" bindtap="switchTab" data-index="{{index}}" data-path="{{item.pagePath}}">
      <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">
    <view class="{{currentIndex == index ? 'active' : ''}}" bindtap="switchTab" data-index="{{index}}" data-path="{{item.pagePath}}">
      <image src="{{currentIndex == index ? item.selectedIconPath : item.iconPath}}" mode="aspectFit"/>
      <text>{{item.text}}</text>
    </view>
  </block>
  <!-- 中间按钮 -->
  <view class="center-button" 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 扩展能力❌✅
开发复杂度简单中等
维护成本低中等

目录

  1. 一、前言
  2. 二、为什么需要自定义 tabBar?
  3. 三、项目目标
  4. 四、项目结构说明
  5. 五、自定义 tabBar 组件实现
  6. 1. 创建组件目录
  7. 2. tab-bar.json(组件配置)
  8. 3. tab-bar.wxml(组件结构)
  9. 4. tab-bar.wxss(组件样式)
  10. 5. tab-bar.js(组件逻辑)
  11. 六、在页面中使用自定义 tabBar
  12. 1. 引入组件
  13. 2. index.wxml 中使用组件
  14. 3. index.js 页面逻辑
  15. 七、样式优化建议
  16. 1. 图标尺寸统一
  17. 2. 文字颜色变化
  18. 3. 添加阴影效果(可选)
  19. 八、实战扩展:中间凸起按钮(如“发布”按钮)
  20. 九、常见问题与解决方案
  21. 十、总结对比表:原生 vs 自定义 tabBar

更多推荐文章

查看全部
  • 开源客服智能体系统实战:从架构设计到生产部署
  • 从零构建并训练基于 BERT 架构的生成式大模型
  • Playwright 实战:打造绕过全维度前端反爬的无头浏览器爬虫
  • Unix AI 发布第三代黑豹机器人:全栈自研与真实场景落地能力解析
  • LLM 基础篇(一):大模型理念与演进
  • 自然语言处理在社交媒体分析中的应用与实战
  • ROS2 在 RViz 中可视化 URDF 机器人模型
  • DeepSeek-R1-Distill-Llama-8B 在线演示教程
  • Python Web 自动化:Selenium 基础操作与元素定位
  • 6GB 显存部署腾讯混元 Image-2.1 GGUF 版实现 2K 生图
  • DFS 算法详解:求解数组子集问题
  • C++ 进阶:从裸指针到智能指针的内存管理进化
  • 大语言模型(LLM)技术报告:背景、架构与应用
  • AI Agent 核心在于流程设计:Harness 才是决胜关键
  • OpenClaw 开源 AI 助手中文发行版部署指南:一键脚本/Docker/npm 安装
  • 商汤开源 SenseNova-MARS:多模态搜索推理模型突破性能瓶颈
  • 字节开源 DeerFlow 2.0:从深度研究到 Super Agent 基础设施
  • Python+AI 入门指南:环境搭建与实战案例
  • 提示工程、微调与 RAG 技术对比及选型指南
  • Python 环境配置与 pip 安装教程

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online