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

一、前言:为什么需要自定义 tabBar?

微信小程序原生 tabBar 虽然简单易用,但存在明显限制:

  • ❌ 不支持中间“+”号等凸起按钮
  • ❌ 图标和文字样式无法高度自定义(如选中态动画)
  • ❌ 无法动态隐藏/显示 tabBar
  • ❌ 不能嵌入徽标(Badge)、红点等业务元素

解决方案使用自定义 tabBar

本文将带你从零实现一个支持中间凸起按钮、带动画、可扩展的自定义 tabBar,并封装为通用组件。


二、最终效果预览

✅ 底部 5 个 tab(中间为“+”发布按钮)
✅ 点击 tab 平滑切换页面
✅ 中间按钮跳转独立功能页(如发布内容)
✅ 支持徽标、选中高亮、图标切换


三、实现原理

由于小程序页面是全屏渲染,我们无法像 H5 那样用 fixed 布局直接覆盖原生 tabBar。

正确做法

  1. 关闭原生 tabBarapp.json 中不配置 tabBar
  2. 每个页面底部手动引入自定义 tabBar 组件
  3. 通过 wx.switchTab 或 wx.navigateTo 模拟 tab 切换
⚠️ 注意:自定义 tabBar 不是全局组件,需在每个 tab 页面中手动引入!

四、第一步:创建自定义 tabBar 组件

1. 目录结构

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

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

{ "component": true, "usingComponents": {} }

3. 定义数据与方法(custom-tab-bar.js)

// components/custom-tab-bar/custom-tab-bar.js Component({ properties: { current: { type: Number, value: 0 } }, data: { // tab 配置(可抽离为常量) tabs: [ { pagePath: "/pages/home/index", text: "首页", icon: "home", selectedIcon: "home-fill" }, { pagePath: "/pages/category/index", text: "分类", icon: "category", selectedIcon: "category-fill" }, { pagePath: "/pages/publish/index", text: "", icon: "add", isCenter: true }, // 中间按钮 { pagePath: "/pages/cart/index", text: "购物车", icon: "cart", selectedIcon: "cart-fill" }, { pagePath: "/pages/my/index", text: "我的", icon: "my", selectedIcon: "my-fill" } ] }, methods: { switchTab(e) { const { index } = e.currentTarget.dataset; const item = this.data.tabs[index]; if (item.isCenter) { // 中间按钮:跳转非 tab 页(如发布页) wx.navigateTo({ url: '/pages/publish/index' }); return; } // 普通 tab:切换页面 wx.switchTab({ url: item.pagePath }); // 可选:触发父页面更新 current this.triggerEvent('change', { index }); } } });
💡 提示:图标建议使用字体图标(如 IconFont)或本地 PNG

4. 编写模板(custom-tab-bar.wxml)

<!-- components/custom-tab-bar/custom-tab-bar.wxml --> <view> <view wx:for="{{tabs}}" wx:key="index"center-btn' : ''}} {{current === index ? 'active' : ''}}" bindtap="switchTab" > <view> <image src="/assets/icons/{{current === index ? item.selectedIcon : item.icon}}.png" mode="aspectFit" /> <!-- 示例:购物车徽标 --> <view wx:if="{{index === 3 && cartCount > 0}}">{{cartCount}}</view> </view> <text wx:if="{{!item.isCenter}}">{{item.text}}</text> </view> </view>

5. 编写样式(custom-tab-bar.wxss)

/* components/custom-tab-bar/custom-tab-bar.wxss */ .tab-bar { position: fixed; bottom: 0; left: 0; right: 0; height: 100rpx; display: flex; justify-content: space-around; align-items: center; background: white; border-top: 1px solid #eee; padding-bottom: env(safe-area-inset-bottom); z-index: 999; } .tab-item { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; position: relative; } .center-btn { position: relative; top: -40rpx; /* 凸起效果 */ width: 120rpx; height: 120rpx; background: #007aff; border-radius: 50%; box-shadow: 0 4rpx 12rpx rgba(0,122,255,0.3); } .center-btn .icon-img { width: 56rpx; height: 56rpx; } .icon-img { width: 48rpx; height: 48rpx; } .tab-text { font-size: 20rpx; margin-top: 8rpx; color: #888; } .active .tab-text { color: #007aff; } .badge { position: absolute; top: -8rpx; right: -8rpx; background: #ff3b30; color: white; border-radius: 50%; min-width: 24rpx; height: 24rpx; font-size: 16rpx; display: flex; align-items: center; justify-content: center; padding: 0 2rpx; }

五、第二步:在页面中使用 tabBar

1. 页面 JSON 引入组件

// pages/home/index.json { "usingComponents": { "custom-tab-bar": "/components/custom-tab-bar/custom-tab-bar" } }

2. 页面 WXML 使用

<!-- pages/home/index.wxml --> <view> <!-- 页面内容 --> <view>首页内容</view> </view> <!-- 底部 tabBar --> <custom-tab-bar current="0" bindchange="onTabChange" />
⚠️ 注意:每个 tab 页面都要引入,并传入对应的 current(0,1,3,4)

3. 页面 JS 处理(可选)

// pages/home/index.js Page({ data: { cartCount: 5 // 示例:从全局状态获取 }, onTabChange(e) { // 如果需要同步 current(一般不需要) console.log('切换到 tab:', e.detail.index); } });

六、关键问题解答

Q1:中间按钮为什么用 navigateTo 而不是 switchTab

A:因为 switchTab 只能跳转到 app.json 中配置的 tabBar 页面,而发布页通常不是 tab 页面,所以用 navigateTo

Q2:如何动态更新徽标(如购物车数量)?

A:可通过全局状态(如 globalData、Event Bus 或 Store)传递数据到 tabBar 组件。

Q3:页面内容被 tabBar 遮挡怎么办?

A:在页面最外层加 padding-bottom: 100rpx + safe-area
.page-container { min-height: 100vh; padding-bottom: calc(100rpx + env(safe-area-inset-bottom)); box-sizing: border-box; }

七、进阶优化建议

  1. 图标使用字体图标:减少图片请求,支持颜色动态修改
  2. 动画效果:点击时添加 scale 动画(transform: scale(0.9)
  3. 状态管理:将 cartCount 等数据通过 Store 统一管理
  4. 适配 iPhone X:使用 env(safe-area-inset-bottom) 避免遮挡

八、结语

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

Read more

技术拆解:《从音频到动效:我是如何用 Web Audio API 拆解音乐的?》

技术拆解:《从音频到动效:我是如何用 Web Audio API 拆解音乐的?》

🎵 从音频到动效:我是如何用 Web Audio API 拆解音乐的? 「家人们谁懂啊!写完音乐可视化项目后,我终于搞懂了电脑是怎么『听懂』音乐的!今天就把最硬核的『音频解析』部分扒得干干净净,连代码带原理一起唠明白~」 做这个 HTML5 实时音频可视化项目时,参考了 ZEEKLOG 上《基于 HTML5 Canvas 与 Web Audio API 的实时音频可视化工具开发》这篇文章的核心技术框架,主要借鉴了 Web Audio API 中 AnalyserNode 的基础使用、FFT 频域转换的流程以及 Canvas 实时渲染的基础思路,帮我快速搭好了项目的底层骨架。 但在实际开发中,我在原基础上做了不少可视化效果的扩展和细节设计的打磨,新增了自己想要的可视化表现形式,也针对实际使用中的小问题做了定制化优化,让整个工具的视觉效果和使用体验更贴合自己的设计需求,下面具体说说我做的这些扩展和优化。 一、先看效果:

Clawdbot(Moltbot)源码部署全实测:从环境搭建到 WebChat 验证,避坑指南收好

Clawdbot(Moltbot)源码部署全实测:从环境搭建到 WebChat 验证,避坑指南收好

一、为啥折腾 Clawdbot? 最近刷技术圈总刷到 Clawdbot(后来也叫 Moltbot),说是能搭私人 AI 助手,支持 WhatsApp、Telegram 这些常用通道,还能跑在自己设备上,不用依赖第三方服务 —— 想着拉下来测试一下功能,顺便研究一下其源码的实现。 于是拉上 GitHub 仓库https://github.com/openclaw/openclaw,打算从源码部署试试,过程里踩了不少坑,干脆整理成记录,给同样想折腾的朋友避避坑。 二、源码部署前的准备:Windows 环境优先选 WSL2 一开始想直接用 Windows CMD 部署,结果装依赖时各种报错,查仓库文档才发现 Windows 推荐用 WSL2(Ubuntu/Debian 镜像就行),后续操作全在 WSL2 里完成: 1.

Chatbox AI|多模型多模态交互+MCP,一个工具打造你的全能私人助手

Chatbox AI|多模型多模态交互+MCP,一个工具打造你的全能私人助手

ChatBoxAI集成GPT-4、Claude等顶尖模型,支持Windows/macOS/Linux多平台,具备隐私加密、文件智能解析(PDF/代码/图片)及开发者友好特性。其应用覆盖自媒体创作、代码实时预览、AI绘图(封面/表情包)及联网搜索,通过MCP协议扩展能力。未来将深化多模态交互,整合边缘计算与AR技术,构建教育、医疗等行业解决方案,推动“增强智能”革命。作为打破数据孤岛的工具,ChatBoxAI不仅是效率助手,更象征人机协作新范式——普通人可调度AI集群资源,开发者快速构建微服务,开启智能普惠时代。 Chatbox AI|多模型多模态交互+MCP,一个工具打造你的全能私人助手 * 1. 前言 * 2. ChatboxAI介绍 * 2.1 什么是ChatboxAI? * 2.2 ChatboxAI的优势 * 2.3 安装使用 * 3.

本地AI自由!OpenClaw + Ollama 全离线部署实战手册 (Windows版)

厌倦了云端AI的Token计费焦虑和隐私泄露风险?想拥有一位完全听命于你的本地AI助手?本文将手把手教你,无需深厚编程基础,只需跟随步骤执行命令,即可在个人电脑上搭建属于你的全功能AI Agent。 核心优势:零费用:无需API Key,彻底告别按量付费。强隐私:数据全程本地处理,断网也能流畅使用。高自由:随心切换Qwen、GLM等顶尖开源模型。 ️ 第一阶段:环境准备(地基搭建) 在开始之前,请以管理员身份打开 PowerShell (按下 Win + X 选择)。这是我们接下来的操作中心。 1. 安装 Node.js (v18+) Node.js 是 OpenClaw 的运行环境,安装它时 npm 会自动就位。 1. 访问 Node.js 官网,下载 LTS (长期支持)