199 lines
4.9 KiB
Vue
199 lines
4.9 KiB
Vue
<template>
|
||
<!-- 商品分类 -->
|
||
<view>
|
||
<!-- #ifdef MP || APP-PLUS -->
|
||
<!-- <view style="visibility: hidden;" :style="{ height: navHeight + 'rpx' }"></view> -->
|
||
<!-- #endif -->
|
||
<view class="navTabBox" :class="{isFixed:isFixed}" :style="[boxStyle]">
|
||
<view class="longTab">
|
||
<scroll-view scroll-x="true" style="white-space: nowrap; display: flex;" scroll-with-animation
|
||
:scroll-left="tabLeft" show-scrollbar="true">
|
||
<view class="longItem"
|
||
:style="'width:'+isWidth+'px;color:' + (index == tabClick ? checkColor : fontColor)+';--color:'+checkColor"
|
||
:data-index="index" :class="index===tabClick?'click':''" v-for="(item,index) in tabList"
|
||
:key="index" :id="'id'+index" @click="longClick(index,item)">11{{ item.title }}
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
</view>
|
||
<view style="height: 70rpx"></view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
// +----------------------------------------------------------------------
|
||
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||
// +----------------------------------------------------------------------
|
||
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
|
||
// +----------------------------------------------------------------------
|
||
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||
// +----------------------------------------------------------------------
|
||
// | Author: CRMEB Team <admin@crmeb.com>
|
||
// +----------------------------------------------------------------------
|
||
import {
|
||
getCategoryFirst,
|
||
} from '@/api/api.js';
|
||
|
||
let app = getApp();
|
||
export default {
|
||
name: 'tabNav',
|
||
props: {
|
||
dataConfig: {
|
||
type: Object,
|
||
default: () => {}
|
||
},
|
||
//是否固定
|
||
isFixed: {
|
||
type: Boolean,
|
||
default: false
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
tabClick: 0, //导航栏被点击
|
||
isLeft: 0, //导航栏下划线位置
|
||
isWidth: 0, //每个导航栏占位
|
||
mainWidth: 0,
|
||
tabLeft: 0,
|
||
isTop: 0,
|
||
navHeight: 35,
|
||
tabItem: null //tab选中的对象
|
||
};
|
||
},
|
||
computed: {
|
||
//外部盒子
|
||
boxStyle() {
|
||
return {
|
||
borderRadius: this.dataConfig.bgStyle.val * 2 + 'rpx',
|
||
background: `linear-gradient(${this.dataConfig.bgColor.color[0].item}, ${this.dataConfig.bgColor.color[1].item})`
|
||
}
|
||
},
|
||
//标签文字颜色
|
||
fontColor() {
|
||
console.log(this.dataConfig.fontColor,"this.dataConfig.fontColor")
|
||
return this.dataConfig.fontColor.color[0].item
|
||
},
|
||
//选中颜色
|
||
checkColor() {
|
||
return this.dataConfig.checkColor.color[0].item
|
||
},
|
||
tabList() {
|
||
//type=0微页面,1分类,2首页
|
||
let tabList = this.dataConfig.listConfig.list;
|
||
tabList.unshift({
|
||
title: '首页',
|
||
type: 2,
|
||
val: 0
|
||
})
|
||
return tabList
|
||
},
|
||
},
|
||
created() {
|
||
let that = this
|
||
// 获取设备宽度
|
||
uni.getSystemInfo({
|
||
success(e) {
|
||
//that.mainWidth = e.windowWidth
|
||
that.isWidth = (e.windowWidth) / 5
|
||
}
|
||
})
|
||
setTimeout((e) => {
|
||
let statusHeight = uni.getSystemInfoSync().statusBarHeight;
|
||
const query = uni.createSelectorQuery().in(this);
|
||
query.select('.navTabBox').boundingClientRect(data => {
|
||
that.navHeight = (data.height + statusHeight) * 2;
|
||
}).exec();
|
||
}, 300)
|
||
that.$nextTick(function() {
|
||
uni.getSystemInfo({
|
||
success: function(res) {
|
||
that.windowHeight = res.windowHeight;
|
||
}
|
||
});
|
||
})
|
||
// #ifdef MP || APP-PLUS
|
||
this.isTop = (uni.getSystemInfoSync().statusBarHeight + 43) + 'px'
|
||
// #endif
|
||
// #ifdef H5
|
||
this.isTop = 0
|
||
// #endif
|
||
},
|
||
watch: {
|
||
tabClick: {
|
||
handler(newValue, oldValue) {
|
||
if (this.tabItem) this.$emit('changeTab', newValue, this.tabItem);
|
||
},
|
||
immediate: true
|
||
}
|
||
},
|
||
methods: {
|
||
// 导航栏点击
|
||
longClick(index, item) {
|
||
this.tabItem = item;
|
||
this.tabClick = index; //设置导航点击了哪一个
|
||
this.$nextTick(() => {
|
||
let id = 'id' + index;
|
||
this.tabLeft = (index - 2) * this.isWidth //设置下划线位置
|
||
//this.$emit('changeTab', index,item);
|
||
})
|
||
},
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.navTabBox {
|
||
width: 100%;
|
||
height: 70rpx;
|
||
color: rgba(255, 255, 255, 1);
|
||
position: fixed;
|
||
z-index: 99;
|
||
|
||
&.isFixed {
|
||
z-index: 10;
|
||
position: fixed;
|
||
left: 0;
|
||
width: 100%;
|
||
/* #ifdef H5 */
|
||
top: 0;
|
||
/* #endif */
|
||
}
|
||
|
||
.click {
|
||
color: white;
|
||
}
|
||
|
||
.longTab {
|
||
.longItem {
|
||
height: 70rpx;
|
||
display: inline-block;
|
||
line-height: 70rpx;
|
||
text-align: center;
|
||
font-size: 28rpx;
|
||
color: #333333;
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
|
||
&.click {
|
||
font-weight: bold;
|
||
font-size: 30rpx;
|
||
position: relative;
|
||
|
||
&::after {
|
||
content: '';
|
||
width: 40rpx;
|
||
height: 4rpx;
|
||
background: var(--color);
|
||
// background-color: #E93323;
|
||
position: absolute;
|
||
bottom: 0;
|
||
left: 50%;
|
||
transform: translateX(-50%);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</style>
|