<template>
<div>
<ul class="louplus-nav">
<li
v-for="(item, index) in nav"
:key="index"
:class="{'active':activeKey === item.key}"
@click="roll(item.key)"
>
<span>
{{ item.value }}
</span>
</li>
<li v-if="nav.length">
<a href="#">
<i class="fa fa-chevron-up" />
</a>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
nav: [],
nodeList: [],
activeKey: '',
timer: 0,
}
},
mounted() {
this.initNav()
this.initNodeList()
window.addEventListener('scroll', this.listenScroll)
},
destroyed() {
window.removeEventListener('scroll', this.listenScroll)
},
methods: {
// 初始化定位按钮元素
initNav() {
switch (this.$route.name) {
case 'louplus-python':
this.nav = this.$LouplusLandEnum.pythonNav
break
case 'louplus-ml':
this.nav = this.$LouplusLandEnum.mlNav
break
case 'louplus-dm':
this.nav = this.$LouplusLandEnum.dmNav
break
case 'louplus-bigdata':
this.nav = this.$LouplusLandEnum.bigdataNav
break
case 'louplus-linux':
this.nav = this.$LouplusLandEnum.linuxNav
}
},
// 初始化定位目标元素
initNodeList() {
for (let i = 0; i < this.nav.length; i++) {
const node = document.querySelector(`.louplus-${this.nav[i].key}`)
this.nodeList.push({
key: this.nav[i].key,
node,
})
}
},
roll(key) {
this.activeKey = key
// 获取目标区域元素
const node = document.querySelector(`.louplus-${key}`)
// 获取当前区域的位置
const windowScrollHeight = document.documentElement.scrollTop
// 获取目标区域相对于当前窗口的位置
const nodeOffsetTop = node.getClientRects()[0].top
// 滚动到相应位置(目标区域位置)
document.documentElement.scrollTop =
windowScrollHeight + nodeOffsetTop - 120
},
// 屏幕滚动事件回调
listenScroll() {
if (this.timer) {
return
}
// 设置延时器,保证100ms最多执行一次
this.timer = setTimeout(() => {
for (let i = 0; i < this.nodeList.length; i++) {
const item = this.nodeList[i]
const nodeOffsetTop =
item.node.getClientRects()[0] && item.node.getClientRects()[0].top
// 设置当前距离可视区小于380的元素为active状态
if (nodeOffsetTop < 380) {
this.activeKey = item.key
}
}
// 如果是第一个元素,并且距离可视区顶部已经大于380,则取消其active状态
if (
this.nodeList[0].node.getClientRects()[0] &&
this.nodeList[0].node.getClientRects()[0].top > 380 &&
this.activeKey === this.nodeList[0].key
) {
this.activeKey = ''
}
this.timer = 0
}, 100)
},
},
}
</script>
<style lang="scss" scoped>
.louplus-nav {
position: fixed;
top: calc(50% - 235px);
left: 0;
margin: 0;
padding: 5px 0;
border-bottom-right-radius: 5px;
border-top-right-radius: 5px;
list-style: none;
background-color: #fff;
box-shadow: 0 10px 15px 0 rgba(0, 0, 0, 0.1);
font-size: 12px;
z-index: 9;
li {
margin: 3px 0;
padding: 0 10px 0 7px;
color: #999;
cursor: pointer;
border-left: 3px solid #fff;
list-style: none;
&:last-child {
border: unset !important;
a {
display: block;
padding: 10px 0;
border-bottom: 1px solid #eee;
text-align: center;
border: unset;
i {
font-size: 16px;
}
}
}
&:hover {
border-left: 3px solid #6ea6ed;
color: #6ea6ed;
}
span {
display: block;
padding: 10px 0;
border-bottom: 1px solid #eee;
text-align: center;
}
}
li.active {
border-left: 3px solid #6ea6ed;
color: #6ea6ed;
}
}
</style>
页面锚点滚动导航【详细版】
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 这几天刚好要做产品的宣传官网的UI,因为准确的文案还没给定,而后续开发需要跟还没合作过的程序员合作~为了提升后续与...
- jQuery下实现锚点链接的平滑滚动(带浮动侧边栏)css+html+js JQuery实现简单的平滑过渡效果 J...
- 大多数网站都有导航吸附效果,即导航栏固定在网页顶部,不随鼠标滚动而移动;还有就是锚点滚动效果,即点击某个按钮,页面...