更新记录
1.0.1(2026-04-09)
下载此版本
优化滑动效果
修复已知问题
更新使用文档
1.0.0(2024-08-22)
下载此版本
首次发布
平台兼容性
uni-app(4.36)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
- |
√ |
√ |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
√ |
√ |
√ |
√ |
√ |
- |
√ |
√ |
- |
√ |
- |
zero-tabs 组件
zero-tabs 是一个支持滚动、自动居中、胶囊高亮、徽章和吸顶的标签选项卡组件,符合 easycom 规范,使用 uni_modules 引入后可直接使用。
一. 组件特性
- 兼容
line、capsule、none 三种模式
- 选中项自动滚动到可视区域中间
- 支持少量 tab 自动均分布局
- 支持图标、禁用态和 badge 徽章
- 支持异步切换和吸顶占位
- 支持
lineOptions、capsuleOptions 两类高亮配置
- 内部不再直接修改传入的
tabs 数据
二. 参数说明
| 参数 |
类型 |
默认值 |
说明 |
| tabs |
Array |
[] |
标签数组,元素至少包含 name 字段,可选 icon、iconSize、disabled、badge |
| currentIndex |
Number |
0 |
当前选中项索引 |
| backgroundColor |
String |
'transparent' |
背景色 |
| height |
Number |
80 |
组件高度,单位 rpx |
| padding |
String |
'0 32rpx' |
每个 tab 的内边距 |
| defaultColor |
String |
'#333333' |
默认文字颜色 |
| selectColor |
String |
'#0396FF' |
选中文字颜色,line 模式下同时作为滑块颜色 |
| size |
Number |
32 |
文字字号,单位 rpx |
| iconSize |
Number |
16 |
默认图标尺寸,单位 px |
| customLineWidth |
Number |
0 |
旧版兼容字段,等价于 lineOptions.width,单位 px,建议优先使用 lineOptions |
| lineGap |
Number |
0 |
旧版兼容字段,等价于 lineOptions.gap,单位 rpx,建议优先使用 lineOptions |
| lineOptions |
Object |
{} |
line 模式配置,见下方说明 |
| autoJustify |
Boolean |
false |
当所有 tab 总宽度小于容器宽度时是否自动均分 |
| needSticky |
Boolean |
false |
是否启用吸顶 |
| offsetTop |
Number |
0 |
吸顶距离,单位 rpx |
| fixedHolder |
Boolean |
true |
吸顶时是否渲染占位盒子 |
| async |
Boolean |
false |
是否启用异步切换,开启后需由父组件更新 currentIndex |
| showSlider |
Boolean |
true |
是否显示滑块 |
| slider |
String |
'line' |
滑块模式,可选 line、capsule、none |
| capsuleOptions |
Object |
{} |
胶囊模式配置,见下方说明 |
| zIndex |
Number |
1 |
吸顶层级 |
| showBadge |
Boolean |
false |
是否显示 badge |
| badgeOptions |
Object |
{} |
badge 配置,见下方说明 |
capsuleOptions
| 参数 |
类型 |
默认值 |
说明 |
| width |
Number |
0 |
胶囊宽度,单位 px,0 表示跟随当前项宽度 |
| height |
Number |
0 |
胶囊高度,单位 rpx,0 表示默认使用组件高度减去上下边距 |
| radius |
Number |
0 |
胶囊圆角,单位 rpx,0 表示使用全圆角 |
| color |
String |
'#0396FF' |
胶囊背景色 |
lineOptions
| 参数 |
类型 |
默认值 |
说明 |
| width |
Number |
0 |
线条宽度,单位 px,0 表示跟随当前项宽度 |
| height |
Number |
6 |
线条高度,单位 rpx |
| radius |
Number |
999 |
线条圆角,单位 rpx |
| bottom |
Number |
6 |
线条距离 tab 底部的偏移,单位 rpx |
| color |
String |
'' |
线条颜色,不传则使用 selectColor |
| gap |
Number |
0 |
文字内容额外向上让出的距离,单位 rpx |
badgeOptions
| 参数 |
类型 |
默认值 |
说明 |
| mode |
String |
'number' |
number 数字模式,dot 圆点模式 |
| color |
String |
'rgba(255, 255, 255, 0.3)' |
默认背景色 |
| activeColor |
String |
'' |
选中时背景色,不传则沿用 color |
| textColor |
String |
'#ffffff' |
文字颜色 |
| size |
Number |
20 |
文字字号,单位 rpx |
| dotSize |
Number |
12 |
圆点模式尺寸,单位 rpx |
三. 事件
| 事件名 |
返回值 |
说明 |
| change |
(index, item) |
点击 tab 后触发。默认会先执行居中滚动,再触发 change |
四. 使用示例
<template>
<view class="tabs">
<view class="zero-nav-title">基础使用</view>
<zero-tabs
:currentIndex="currentIndex"
:tabs="categoryList"
:lineOptions="{ width: 36, height: 8, bottom: 8, gap: 12 }"
@change="handleTabsChange"
/>
<view class="zero-nav-title">胶囊模式</view>
<zero-tabs
:currentIndex="currentIndex"
:tabs="categoryList"
slider="capsule"
selectColor="#ffffff"
:capsuleOptions="{ color: '#465CFF', radius: 40 }"
@change="handleTabsChange"
/>
<view class="zero-nav-title">无滑块 + badge</view>
<zero-tabs
:currentIndex="currentIndex"
:tabs="badgeTabs"
slider="none"
:showBadge="true"
@change="handleTabsChange"
/>
</view>
</template>
<script setup lang="ts">
import { ref } from "vue";
const currentIndex = ref(0);
const categoryList = ref([
{ name: "推荐" },
{ name: "手机数码" },
{ name: "家用电器", disabled: true },
{ name: "电脑办公" },
{ name: "家居家装" },
{ name: "美妆个护" },
{ name: "服饰鞋包" },
{ name: "母婴童装" },
]);
const badgeTabs = ref([
{ name: "消息", badge: 3 },
{ name: "通知", badge: 18 },
{ name: "系统", badge: 0 },
]);
const handleTabsChange = (index: number) => {
currentIndex.value = index;
};
</script>
<style scoped lang="scss">
.zero-nav-title {
margin: 40rpx 0 20rpx 20rpx;
}
</style>
五. 注意事项
- 默认点击流程是“先滚动居中,再切换高亮并触发
change”
- 当
async 为 true 时,组件不会自动更新选中态,需要父组件在 change 后自行更新 currentIndex
lineOptions.width、capsuleOptions.width 的单位是 px,其他尺寸配置默认使用 rpx
插件预览:

小程序搜索: 零技术
预览的小程序不一定能及时更新当前插件