2024-03-21 17:52:58 +08:00
< template >
< view :style ="viewColor" >
< view class = "navTabBox" >
< view class = "longTab" >
< scroll -view scroll -x = " true " style = "white-space: nowrap; display: flex;height: 60rpx;" scroll -with -animation :scroll-left ="tabLeft"
show - scrollbar = "true" >
< view class = "longItem" : style = '"width:"+isWidth+"px"' :data-index ="index" :class ="index===tabClick?'click':''"
v - for = "(item,index) in tabTitle" : key = "index" : id = "'id'+index" @ click = "longClick(index,item.store_category_id)" > { { item . cate _name } }
< / view >
< view class = "underlineBox" : style = '"transform:translateX("+isLeft+"px);width:"+isWidth+"px"' >
< view class = "underline bg-color-white" > < / view >
< / view >
< / s c r o l l - v i e w >
< view class = 'iconfont icon-xiangxia' style = "padding: 8rpx 0 0 8rpx;" @ click = "tabsOpen = true" > < / view >
< / view >
< view class = "tabs-box" v-if ="tabsOpen" >
< view class = "box-top" >
< view class = "" >
切换分类
< / view >
< view class = "" >
< view class = 'iconfont icon-xiangshang' @ click = "tabsOpen = false" > < / view >
< / view >
< / view >
< view class = "all-tabs" >
< view class = "tabs-style" :class ="index===tabClick?'active':''" v-for ="(tab,index) in tabTitle" :key='index' @click="longClick(index,tab.store_category_id)" >
< text class = "line1" > { { tab . cate _name } } < / text >
< / view >
< / view >
< / view >
< / view >
< view class = 'mask' v-if ="tabsOpen" @click="tabsOpen = false" > < / view >
< / view >
< / template >
< script >
2024-03-21 18:05:36 +08:00
2024-03-21 17:52:58 +08:00
import { mapGetters } from "vuex" ;
let app = getApp ( ) ;
export default {
name : 'navTab' ,
props : {
tabTitle : {
type : Array ,
default : ( ) => {
[ ]
}
}
} ,
computed : mapGetters ( [ 'viewColor' ] ) ,
data ( ) {
return {
tabClick : 0 , //导航栏被点击
isLeft : 0 , //导航栏下划线位置
isWidth : 0 , //每个导航栏占位
tabLeft : 0 ,
swiperIndex : 0 ,
childIndex : 0 ,
childID : 0 ,
window : false ,
tabsOpen : false
} ;
} ,
created ( ) {
var that = this
// 获取设备宽度
uni . getSystemInfo ( {
success ( e ) {
that . isWidth = e . windowWidth / 5
}
} )
} ,
methods : {
// 导航栏点击
longClick ( index , id ) {
this . childIndex = 0 ;
if ( this . tabTitle . length > 5 ) {
var tempIndex = index - 2 ;
tempIndex = tempIndex <= 0 ? 0 : tempIndex ;
this . tabLeft = ( index - 2 ) * this . isWidth //设置下划线位置
}
this . tabClick = index //设置导航点击了哪一个
this . isLeft = index * this . isWidth //设置下划线位置
let obj = {
index : index ,
pid : id
}
this . parentEmit ( obj ) ;
this . tabsOpen = false
} ,
parentEmit ( obj ) {
this . $emit ( 'changeTab' , obj ) ;
}
}
}
< / script >
< style lang = "scss" >
@ keyframes bounce - in {
0 % {
opacity : 0 ;
}
100 % {
opacity : 1 ;
}
}
. navTabBox {
width : 750 rpx ;
box - sizing : border - box ;
padding : 0 40 rpx ;
color : rgba ( 255 , 255 , 255 , 1 ) ;
position : relative ;
. tabs - box {
position : absolute ;
top : 0 ;
display : flex ;
flex - direction : column ;
width : 90 % ;
background - color : # FFFFFF ;
border - radius : 24 rpx ;
z - index : 999 ;
animation : bounce - in .3 s ;
. box - top {
padding : 30 rpx 20 rpx 10 rpx 20 rpx ;
display : flex ;
justify - content : space - between ;
color : # 666 ;
font - size : 28 rpx ;
}
. all - tabs {
display : flex ;
flex - wrap : wrap ;
padding : 20 rpx 0 ;
font - size : 24 rpx ;
. tabs - style {
display : flex ;
justify - content : center ;
background : # F2F2F2 ;
border - radius : 29 px ;
color : # 282828 ;
width : 22 % ;
padding : 10 rpx 20 rpx ;
white - space : nowrap ;
border - radius : 30 px ;
margin : 10 rpx ;
}
. active {
background : var ( -- view - minorColor ) ;
color : var ( -- view - theme ) ;
border : 1 px solid var ( -- view - theme ) ;
}
}
}
. nav _toggle {
position : absolute ;
top : 8 rpx ;
right : 20 rpx ;
}
. click {
color : white ;
}
. longTab {
display : flex ;
width : 95 % ;
/* #ifdef H5 */
padding - bottom : 20 rpx ;
/* #endif */
/* #ifdef MP */
padding - top : 12 rpx ;
padding - bottom : 12 rpx ;
/* #endif */
. longItem {
height : 50 upx ;
display : inline - block ;
line - height : 50 upx ;
text - align : center ;
font - size : 30 rpx ;
color : rgba ( 255 , 255 , 255 , .8 ) ;
max - width : 160 rpx ;
white - space : nowrap ;
overflow : hidden ;
text - overflow : ellipsis ;
overflow - x : scroll ;
overflow - y : hidden ;
/*解决ios上滑动不流畅*/
- webkit - overflow - scrolling : touch ;
& . click {
font - weight : bold ;
font - size : 30 rpx ;
color : # FFFFFF ;
}
}
. underlineBox {
height : 3 px ;
width : 20 % ;
display : flex ;
align - content : center ;
justify - content : center ;
transition : .5 s ;
. underline {
width : 60 rpx ;
height : 4 rpx ;
}
}
}
}
. bg - color - white {
background - color : # fff ;
}
. child - box {
width : 100 % ;
position : relative ;
background - color : # fff ;
/* #ifdef H5 */
box - shadow : 0 2 px 5 px 1 px rgba ( 0 , 0 , 0 , 0.02 ) ;
/* #endif */
/* #ifdef MP */
box - shadow : 0 2 rpx 3 rpx 1 rpx # f9f9f9 ;
/* #endif */
. wrapper {
display : flex ;
align - items : center ;
padding : 20 rpx 0 ;
background : # fff ;
}
. child - item {
flex - shrink : 0 ;
width : 140 rpx ;
display : flex ;
flex - direction : column ;
align - items : center ;
justify - content : center ;
margin - left : 10 rpx ;
image {
width : 90 rpx ;
height : 90 rpx ;
border - radius : 50 % ;
}
. txt {
font - size : 24 rpx ;
color : # 282828 ;
text - align : center ;
margin - top : 10 rpx ;
}
& . on {
image {
border : 1 px solid $theme - color - opacity ;
}
. txt {
color : $theme - color ;
}
}
}
}
. brand - wrapper {
flex : 1 ;
overflow : hidden ;
width : 690 rpx ;
margin : 0 auto ;
background : # ffffff ;
border - radius : 12 rpx ;
padding : 25 rpx ;
. wrapper {
display : flex ;
flex - wrap : wrap ;
padding - bottom : 20 rpx ;
}
. item {
display : block ;
width : 146 rpx ;
height : 58 rpx ;
line - height : 58 rpx ;
text - align : center ;
background : rgba ( 242 , 242 , 242 , 1 ) ;
border - radius : 28 rpx ;
margin - top : 25 rpx ;
padding : 0 10 rpx ;
margin - right : 19 rpx ;
color : # 282828 ;
font - size : 24 rpx ;
& : nth - child ( 4 n ) {
margin - right : 0 ;
}
& . on {
background : rgba ( 255 , 244 , 243 , 1 ) ;
border : 1 px solid rgba ( 233 , 51 , 35 , 1 ) ;
color : rgba ( 233 , 51 , 35 , 1 ) ;
}
}
. btns {
display : flex ;
align - items : center ;
justify - content : center ;
padding - top : 10 rpx ;
font - size : 22 rpx ;
color : # 999 ;
. iconfont {
margin - left : 10 rpx ;
margin - top : 5 rpx ;
font - size : 20 rpx ;
}
}
. mask {
z - index : 300 ! important ;
}
. icon - xiangxia {
font - size : 20 px ;
}
}
< / style >