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.
 
 
 
 
 
 

160 lines
4.5 KiB

<template>
<!-- 滚动容器 -->
<scroll-view class="scroll_navs" :scroll-into-view="nav_id" scroll-x scroll-with-animation>
<!-- 最左边用来定位的导航 -->
<view id="nav0"></view>
<!-- 正常的导航按钮 -->
<view class="ul box" :style="'border-color:'+color+';'">
<block v-for="(item,index) in list" :key="index">
<!-- 判断nav的id是否相同添加类型active 通过index给nav添加id -->
<view class="li" :class="[nav.id==item.id?'active':'']" :id="'nav'+(index+1)" @click="change_fun(item,index)">
<view class="li_section dis_f_c_c">
<text>{{item[item_key]}}</text>
</view>
</view>
</block>
</view>
</scroll-view>
</template>
<script>
export default {
props: {
// nav的列表数据
list: {
type: Array,
default: null,
},
// 当前nav
nav: {
type: Object,
default: "",
},
// item的key值
item_key: {
type: String,
default: "name",
},
// 滚动时,当前导航前面的可视导航数量
num: {
type: [String, Number],
default: 1,
},
// 下边框的颜色
color: {
type: String,
default: "transparent",
},
},
data() {
return {
// 公用的js
$: this.$,
// 当前nav的下标
index: 0,
// 当前nav的下标
}
},
created() {
// 获取当前nav的下标
this.get_index_fun();
},
methods: {
// 获取当前nav的下标
get_index_fun() {
// nav的列表数据
let list = this.list;
// 循环匹配当前nav的下标index
for (var i = 0; i < list.length; i++) {
let obj = list[i];
if (this.nav.id == obj.id) {
this.index = i;
break;
}
}
},
// nav改变时触发,更新下标,把点击的nav传给父组件
change_fun(item, index) {
this.index = index;
this.$emit('change', item);
},
},
computed: {
// 计算当前的nav_id
nav_id() {
// 当前nav的下标
let index = this.index - 0;
let nav_id = "";
// 如果下标是正数
if (index > 0) {
nav_id = "nav" + (index - this.num + 1);
} else {
nav_id = "nav0";
}
return nav_id;
}
},
watch: {
// 当nav改变时,更新下标
nav(e) {
// 获取当前nav的下标
this.get_index_fun();
}
}
}
</script>
<style lang="scss" scoped>
/* 滚动导航部分 */
.scroll_navs {
background: #fff;
white-space: nowrap;
width: 100%;
height: 100%;
.ul {
display: inline-block;
height: 100%;
padding: 0 5rpx;
vertical-align: top;
border-bottom: 1px solid transparent;
.li {
display: inline-block;
height: 100%;
padding: 0 20rpx;
margin: 0 15rpx;
position: relative;
font-size: 32rpx;
color: #323232;
transition: color 0.4s;
.li_section {
height: 100%;
}
}
.li:after {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: 0px;
margin: auto;
width: 0;
transition: width 0.4s;
border-bottom: 2px solid #00BD9A;
box-sizing: border-box;
}
.li.active {
color: #00BD9A;
}
.li.active:after {
width: 76%;
}
}
}
</style>