You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.6 KiB
84 lines
1.6 KiB
<template>
|
|
<view v-if="tabs && tabs.length" class="app-tabs" :class="{'tabs-fixed': fixed}">
|
|
<view class="tabs-item">
|
|
<view class="tab-item" v-for="(tab, i) in tabs" :class="{'active': value===i}" :key="i" @click="tabClick(i)">
|
|
{{getTabName(tab)}}
|
|
</view>
|
|
</view>
|
|
<view class="tabs-line" :style="{left:lineLift}"></view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props:{
|
|
tabs: Array,
|
|
value: { // 当前显示的下标 (使用v-model语法糖: 1.props需为value; 2.需回调input事件)
|
|
type: [String, Number],
|
|
default(){
|
|
return 0
|
|
}
|
|
},
|
|
fixed: Boolean // 是否悬浮,默认false
|
|
},
|
|
computed: {
|
|
lineLift() {
|
|
return 100/this.tabs.length*(this.value + 1) - 100/(this.tabs.length*2) + '%'
|
|
}
|
|
},
|
|
methods: {
|
|
getTabName(tab){
|
|
return typeof tab === "object" ? tab.name : tab
|
|
},
|
|
tabClick(i){
|
|
if(this.value!=i){
|
|
this.$emit("input",i);
|
|
this.$emit("change",i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
.app-tabs{
|
|
position: relative;
|
|
height: 80rpx;
|
|
line-height: 80rpx;
|
|
font-size: 24rpx;
|
|
background-color: #fff;
|
|
border-bottom: 1rpx solid #eee;
|
|
}
|
|
.app-tabs .tabs-item{
|
|
display: flex;
|
|
text-align: center;
|
|
font-size: 28rpx;
|
|
}
|
|
.app-tabs .tabs-item .tab-item{
|
|
flex: 1;
|
|
}
|
|
.app-tabs .tabs-item .active{
|
|
color: red;
|
|
}
|
|
.app-tabs .tabs-line{
|
|
position: absolute;
|
|
bottom: 0;
|
|
width: 150rpx;
|
|
height: 4rpx;
|
|
transform: translateX(-50%);
|
|
border-radius: 4rpx;
|
|
transition: left .3s;
|
|
background: red;
|
|
}
|
|
|
|
/*悬浮*/
|
|
.app-tabs.tabs-fixed{
|
|
z-index: 9999;
|
|
position: fixed;
|
|
top: var(--window-top);
|
|
left: 0;
|
|
width: 100%;
|
|
}
|
|
</style>
|
|
|