dl_mer_uniapp/components/homeIndex/cateNav.vue
2025-03-04 16:03:38 +08:00

199 lines
4.9 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>