更新记录
1.0.0(2025-05-18) 下载此版本
这是一个支持点击和滑动的标签组件,适用于uni-app项目。
平台兼容性
Vue2 | Vue3 |
---|---|
√ | √ |
App | 快应用 | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 |
---|---|---|---|---|---|---|
app-vue | × | √ | × | × | × | × |
钉钉小程序 | 快手小程序 | 飞书小程序 | 京东小程序 | 鸿蒙元服务 |
---|---|---|---|---|
× | × | × | × | × |
H5-Safari | Android Browser | 微信浏览器(Android) | QQ浏览器(Android) | Chrome | IE | Edge | Firefox | PC-Safari |
---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ | × | × |
CustomTab 滑动标签组件
这是一个支持点击和滑动的标签组件,适用于uni-app项目。
特性
- 点击标签项时,背景指示器会平滑滑动到该项
- 支持无限数量的标签项
- 标签过多时自动支持横向滚动
- 点击标签时自动滚动到视图中心
- 高度可定制的样式
- 支持手动控制标签切换
- 兼容各平台(H5、App、各种小程序)
- 支持设置标签等宽
- 支持自定义组件宽度
- 内部样式使用rpx单位,自动适配不同尺寸屏幕
- 滚动条隐藏,视觉更加整洁
使用方法
基本用法
<template>
<custom-tab :items="tabItems" @change="onTabChange" />
</template>
<script>
import CustomTab from '@/components/CustomTab/CustomTab.vue';
export default {
components: {
CustomTab
},
data() {
return {
tabItems: ['标签1', '标签2', '标签3']
}
},
methods: {
onTabChange(event) {
console.log('当前选中:', event.index, event.name);
}
}
}
</script>
自定义样式和宽度
<template>
<custom-tab
:items="tabItems"
:tab-style="customTabStyle"
:tab-bg-style="customTabBgStyle"
:active-tab-item-style="customActiveTabStyle"
:tab-item-style="customTabItemStyle"
item-width="160rpx"
scroll-view-width="300px"
/>
</template>
<script>
export default {
data() {
return {
tabItems: ['标签1', '标签2', '标签3'],
// 整个标签栏样式
customTabStyle: {
backgroundColor: '#f0f0f0',
borderRadius: '24rpx'
},
// 背景指示器样式
customTabBgStyle: {
backgroundColor: '#ffffff',
boxShadow: '0 4rpx 16rpx rgba(0, 0, 0, 0.15)'
},
// 选中标签样式
customActiveTabStyle: {
color: '#ff6600',
fontWeight: 'bold'
},
// 普通标签样式
customTabItemStyle: {
color: '#666666'
}
}
}
}
</script>
与其他元素并排使用
<template>
<view class="cell">
<view class="cell-title">标题</view>
<custom-tab
:items="tabItems"
scroll-view-width="auto"
ref="customTab"
@scroll="onTabScroll"
/>
</view>
</template>
<script>
export default {
data() {
return {
tabItems: ['标签1', '标签2', '标签3']
}
},
methods: {
onTabScroll(e) {
console.log('滚动信息:', e);
}
}
}
</script>
<style>
.cell {
display: flex;
align-items: center;
}
.cell-title {
flex-shrink: 0;
margin-right: 20rpx;
}
</style>
方法调用
<template>
<custom-tab
:items="tabItems"
ref="customTab"
/>
<button @click="nextTab">下一个</button>
</template>
<script>
export default {
methods: {
nextTab() {
this.$refs.customTab.setActiveTab(2); // 切换到第三个标签
},
refreshTabs() {
this.$refs.customTab.refresh(); // 刷新标签布局
}
}
}
</script>
属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
items | Array | [] | 标签项数组 |
defaultActive | Number | 0 | 默认选中项索引 |
tabStyle | Object | {} | 整个标签栏的样式 |
tabItemStyle | Object | {} | 标签项的样式 |
activeTabItemStyle | Object | {} | 选中标签项的样式 |
tabBgStyle | Object | {} | 背景指示器的样式 |
autoScroll | Boolean | true | 是否自动滚动到选中项 |
itemWidth | String | '' | 标签项宽度,如设置则所有标签项等宽(推荐使用rpx单位,如:'160rpx') |
scrollViewWidth | String | '100%' | 滚动视图宽度,可设置百分比或具体值(如:'70%'、'300px'或'auto') |
事件
事件名 | 说明 | 参数 |
---|---|---|
change | 标签切换时触发 | { index: 当前索引, name: 当前标签名称 } |
scroll | 滚动时触发 | event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY} |
方法
方法名 | 说明 | 参数 |
---|---|---|
setActiveTab(index) | 手动切换到指定标签 | index: 标签索引 |
refresh() | 刷新标签布局 | 无 |
单位说明
组件内部样式使用rpx单位,这是uni-app推荐的响应式单位,可以根据屏幕宽度自动缩放,使组件在不同设备上有一致的视觉效果。在自定义样式时,也推荐使用rpx单位:
- 1rpx = 屏幕宽度/750像素
- 在750px宽的设计稿上,1rpx = 1px
- 在375px宽的屏幕上,750rpx = 375px,1rpx = 0.5px
详细说明可参考uni-app官方文档
实现细节
-
跨平台滚动实现:
- 组件使用uni-app的
scroll-into-view
属性实现滚动,确保在所有平台上可靠工作 - 无需依赖DOM的
scrollIntoView
方法,避免不同平台的兼容性问题 - 滚动动画通过
scroll-with-animation
属性保证平滑
- 组件使用uni-app的
-
滚动条隐藏:组件使用了多种CSS技术确保在各平台上都不显示滚动条,同时保留滚动功能:
:show-scrollbar="false"
属性用于uni-app原生控制- 使用CSS选择器
::-webkit-scrollbar
解决WebKit浏览器问题 - 使用
scrollbar-width: none
解决Firefox浏览器问题 - 使用
-ms-overflow-style: none
解决IE和Edge浏览器问题
-
自适应宽度:设置
scroll-view-width="auto"
可以让组件宽度自适应,方便与其他元素并排放置 -
滚动事件监听:提供scroll事件回调,方便上层组件获取滚动状态和实现高级功能