<!--
* @Author: ex-jinming002
-->
<script>
import jQuery from 'jquery'
export default {
data() {
return {
allMenuList: [
{ id: 1, name: '导航', children: [] },
{ id: 2, name: '导航1' },
{ id: 3, name: '导航2' },
{ id: 4, name: '导航3' },
],
activeMenu: 0,
}
},
created() {},
mounted() {
const that = this
// 获取滚动dom元素
this.scrollBox = document.getElementById('scrollBox')
const jump = jQuery('.do-jump')
console.log(jump)
const topArr = []
for (let i = 0; i < jump.length; i++) {
topArr.push(jump.eq(i).position().top)
}
// 监听dom元素的scroll事件
this.scrollBox.addEventListener(
'scroll',
() => {
const current_offset_top = that.scrollBox.scrollTop
for (let i = 0; i < topArr.length; i++) {
if (current_offset_top <= topArr[i]) {
// 根据滚动距离判断应该滚动到第几个导航的位置
that.activeMenu = i
break
}
}
},
true,
)
},
methods: {
// 跳转
jump(index) {
this.activeMenu = index // 当前导航
const jump = jQuery('.do-jump').eq(index)
const scrollTop = jump.position().top + this.scrollBox.scrollTop // 获取需要滚动的距离
// Chrome
this.scrollBox.scrollTo({
top: scrollTop,
behavior: 'smooth', // 平滑滚动
})
},
},
}
</script>
<template>
<div class="NavScroll">
<div class="all-title">
全部应用
<p class="fr">
<span
v-for="(item, index) in allMenuList"
:key="item.id"
:class="[index === activeMenu ? 'active' : '']"
@click="jump(index)"
>{{ item.name }}</span
>
</p>
</div>
<div id="scrollBox" class="applications-content">
<div v-for="val in allMenuList" :key="val.id" class="all-list do-jump">
<p class="applications-title">{{ val.name }}</p>
<ul class="applications-list">
<li
v-for="item in val.children"
:key="item.id"
class="applications-item"
@click="changeRouterForRight(item.pathName, item.menuCode)"
>
<img src="" />
<span>{{ item.name }}</span>
<template v-if="showEdit">
<i
v-if="addOrRemove(item.menuCode) == 0"
class="el-icon-circle-plus add-btn"
@click="addMenu(item.menuCode)"
/>
<i
v-if="addOrRemove(item.menuCode) == 1"
class="el-icon-remove remove-btn"
@click="removeMenu(item.menuCode)"
/>
</template>
</li>
</ul>
</div>
</div>
</div>
</template>
<style scoped lang="less">
.NavScroll {
width: 800px;
margin: 20px auto;
.all-title {
height: 45px;
line-height: 45px;
background-color: red;
.fr {
float: right;
margin: 0 30px;
> span {
float: left;
text-align: center;
margin-left: 20px;
cursor: pointer;
}
.active {
&::after {
content: '';
display: block;
height: 0;
border-bottom: 1px solid black;
}
}
}
}
.applications-content {
width: 100%;
height: 300px;
overflow: hidden;
overflow-y: scroll;
.all-list {
height: 200px;
margin: 10px 0;
// background-color: blue;
border: 1px solid #ccc;
}
}
}
</style>