Js
20200422 vue自定義錨點定位
<template>
<div>
<!-- 內容區域 -->
<div class="content">
<div>
content-0
</div>
<div>
content-1
</div>
<div>
content-2
</div>
<div>
content-3
</div>
<div>
content-4
</div>
</div>
<!-- 導航區域 -->
<ul class="navs">
<li :class="{active: active===0}" @click="scrollTo(0)">
content-0
</li>
<li :class="{active: active===1}" @click="scrollTo(1)">
content-1
</li>
<li :class="{active: active===2}" @click="scrollTo(2)">
content-2
</li>
<li :class="{active: active===3}" @click="scrollTo(3)">
content-3
</li>
<li :class="{active: active===4}" @click="scrollTo(4)">
content-4
</li>
</ul>
</div>
</template>
<script>
export default {
props: {},
data() {
return {
active: 0
}
},
mounted() {
window.addEventListener('scroll', this.onScroll, false)
},
destroy() {
window.removeEventListener('scroll', this.onScroll)
},
methods: {
onScroll() {
const navContents = document.querySelectorAll('.content div')
const offsetTopArr = []
navContents.forEach(item => {
offsetTopArr.push(item.offsetTop)
})
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
let navIndex = 0
for (let n = 0; n < offsetTopArr.length; n++) {
if (scrollTop >= offsetTopArr[n]) {
navIndex = n
}
}
this.active = navIndex
},
scrollTo(index) {
const targetOffsetTop = document.querySelector(`.content div:nth-child(${index + 1})`).offsetTop
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop
const STEP = 50
if (scrollTop > targetOffsetTop) {
smoothUp()
} else {
smoothDown()
}
function smoothDown() {
if (scrollTop < targetOffsetTop) {
if (targetOffsetTop - scrollTop >= STEP) {
scrollTop += STEP
} else {
scrollTop = targetOffsetTop
}
document.body.scrollTop = scrollTop
document.documentElement.scrollTop = scrollTop
requestAnimationFrame(smoothDown)
}
}
function smoothUp() {
if (scrollTop > targetOffsetTop) {
if (scrollTop - targetOffsetTop >= STEP) {
scrollTop -= STEP
} else {
scrollTop = targetOffsetTop
}
document.body.scrollTop = scrollTop
document.documentElement.scrollTop = scrollTop
requestAnimationFrame(smoothUp)
}
}
}
}
onScroll() {
const navContents = document.querySelectorAll('.content div')
const offsetTopArr = []
navContents.forEach(item => {
offsetTopArr.push(item.offsetTop)
})
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
let navIndex = 0
for (let n = 0; n < offsetTopArr.length; n++) {
if (scrollTop >= offsetTopArr[n]) {
navIndex = n
}
}
this.active = navIndex
}
},
mounted() {
window.addEventListener('scroll', this.onScroll)
},
destroy() {
window.removeEventListener('scroll', this.onScroll)
},
</script>