<template> <view class="tui-tabs-view" :class="[isFixed ? 'tui-tabs-fixed' : 'tui-tabs-relative', unlined ? 'tui-unlined' : '']" :style="{ width: tabsWidth + 'px', height: height + 'rpx', padding: `0 ${padding}rpx`, background: backgroundColor, top: isFixed ? top + 'px' : 'auto', zIndex: isFixed ? zIndex : 'auto' }" > <view v-for="(item, index) in tabs" :key="index" class="tui-tabs-item" :style="{ width: itemWidth }" @tap.stop="swichTabs(index)"> <view class="tui-tabs-title" :class="{ 'tui-tabs-active': currentTab == index, 'tui-tabs-disabled': item.disabled }" :style="{ color: currentTab == index ? selectedColor : color, fontSize: size + 'rpx', lineHeight: size + 'rpx', fontWeight: bold && currentTab == index ? 'bold' : 'normal' }" > <view :class="[item.isDot ? 'tui-badge-dot' : 'tui-badge']" :style="{ color: badgeColor, backgroundColor: badgeBgColor }" v-if="item.num"> {{ item.isDot ? '' : item.num }} </view> {{ item.name }} </view> </view> <view class="tui-tabs-slider" :style="{ transform: 'translateX(' + scrollLeft + 'px)', width: sliderWidth + 'rpx', height: sliderHeight + 'rpx', borderRadius: sliderRadius, bottom: bottom, background: sliderBgColor, marginBottom: bottom == '50%' ? '-' + sliderHeight / 2 + 'rpx' : 0 }" ></view> </view> </template> <script> export default { name: 'tuiTabs', props: { //标签页 tabs: { type: Array, default() { return []; } }, //tabs宽度,不传值则默认使用windowWidth,单位px width: { type: Number, default: 0 }, //rpx height: { type: Number, default: 80 }, //rpx 只对左右padding起作用,上下为0 padding: { type: Number, default: 30 }, //背景色 backgroundColor: { type: String, default: '#FFFFFF' }, //是否固定 isFixed: { type: Boolean, default: false }, //px top: { type: Number, // #ifndef H5 default: 0, // #endif // #ifdef H5 default: 44 // #endif }, //是否去掉底部线条 unlined: { type: Boolean, default: false }, //当前选项卡 currentTab: { type: Number, default: 0 }, //滑块宽度 sliderWidth: { type: Number, default: 68 }, //滑块高度 sliderHeight: { type: Number, default: 6 }, //滑块背景颜色 sliderBgColor: { type: String, default: '#5677fc' }, sliderRadius: { type: String, default: '50rpx' }, //滑块bottom bottom: { type: String, default: '0' }, //标签页宽度 itemWidth: { type: String, default: '25%' }, //字体颜色 color: { type: String, default: '#666' }, //选中后字体颜色 selectedColor: { type: String, default: '#5677fc' }, //字体大小 size: { type: Number, default: 28 }, //选中后 是否加粗 ,未选中则无效 bold: { type: Boolean, default: false }, zIndex: { type: [Number, String], default: 996 } }, watch: { currentTab() { this.checkCor(); }, tabs() { this.checkCor(); }, width(val) { this.tabsWidth = val; this.checkCor(); } }, created() { // 高度自适应 setTimeout(() => { uni.getSystemInfo({ success: res => { this.winWidth = res.windowWidth; this.tabsWidth = this.width == 0 ? this.winWidth : this.width; this.checkCor(); } }); }, 0); }, data() { return { winWidth: 0, tabsWidth: 0, scrollLeft: 0 }; }, methods: { checkCor: function() { let tabsNum = this.tabs.length; let padding = (this.winWidth / 750) * this.padding; let width = this.tabsWidth - padding * 2; let left = (width / tabsNum - (this.winWidth / 750) * this.sliderWidth) / 2 + padding; let scrollLeft = left; if (this.currentTab > 0) { scrollLeft = scrollLeft + (width / tabsNum) * this.currentTab; } this.scrollLeft = scrollLeft; }, // 点击标题切换当前页时改变样式 swichTabs: function(index) { let item = this.tabs[index]; if (item && item.disabled) return; if (this.currentTab == index) { return false; } else { this.$emit('change', { index: Number(index) }); } } } }; </script> <style scoped> .tui-tabs-view { width: 100%; box-sizing: border-box; display: flex; align-items: center; justify-content: space-between; } .tui-tabs-relative { position: relative; } .tui-tabs-fixed { position: fixed; left: 0; } .tui-tabs-fixed::before, .tui-tabs-relative::before { content: ''; position: absolute; border-bottom: 1rpx solid #eaeef1; -webkit-transform: scaleY(0.5) translateZ(0); transform: scaleY(0.5) translateZ(0); transform-origin: 0 100%; bottom: 0; right: 0; left: 0; } .tui-unlined::before { border-bottom: 0 !important; } .tui-tabs-item { display: flex; align-items: center; justify-content: center; } .tui-tabs-disabled { opacity: 0.6; } .tui-tabs-title { display: flex; align-items: center; justify-content: center; position: relative; z-index: 2; } .tui-tabs-active { transition: all 0.15s ease-in-out; } .tui-tabs-slider { position: absolute; left: 0; transition: all 0.15s ease-in-out; z-index: 0; transform: translateZ(0); } .tui-badge { position: absolute; font-size: 24rpx; color: #fff; height: 32rpx; min-width: 20rpx; padding: 0 6rpx; border-radius: 50%; background-color: #F34B0B; right: -10rpx; top: -10rpx; transform: translateX(70%); display: flex; align-items: center; justify-content: center; } .tui-badge-dot { position: absolute; height: 16rpx; width: 16rpx; border-radius: 50%; right: -4rpx; top: -4rpx; } </style>