<template> <div id="appp" class="app" > <header> <a href="javascript:void(0);" :class="active == '#home' ? 'active' : ''" @click="toTarget('#home')">首页</a> <a href="javascript:void(0);" :class="active == '#team' ? 'active' : ''" @click="toTarget('#team')">团队</a> <a href="javascript:void(0);" :class="active == '#contact' ? 'active' : ''" @click="toTarget('#contact')">联系</a> <a href="javascript:void(0);" :class="active == '#join' ? 'active' : ''" @click="toTarget('#join')">加入我们</a> </header> <div id="apply1"> <div id="home"> 首页 </div> <div id="team"> 团队 </div> <div id="contact"> 联系 </div> <div id="join"> 加入我们 </div> </div> </div> </template> <script> export default { data() { return { active: '#home', scrollIntoViewOptions: { block: 'start', behavior: 'smooth' }, distance_team:0, distance_contact:0, distance_join:0 } }, mounted() { // 一次性计算赋值,减少滚动计算节点位置次数 this.distance_team = document.querySelector('#team').offsetTop - 60 this.distance_contact = document.querySelector('#contact').offsetTop - 60 this.distance_join = document.querySelector('#join').offsetTop - 60 this.$nextTick(function() { document.querySelector('#appp').addEventListener('scroll', this.onScroll); }); window.addEventListener('scroll', this.onScroll,true); }, methods: { toTarget(target) { this.active = target; const toElement = document.querySelector(target); toElement.scrollIntoView(this.scrollIntoViewOptions); }, onScroll() { let scrolled =Math.abs(document.getElementById("appp").getBoundingClientRect().top); if (scrolled < this.distance_team) { this.active = '#home' } else if (scrolled >= this.distance_team && scrolled < this.distance_contact) { this.active = '#team' } else if (scrolled >= this.distance_contact && scrolled < this.distance_join) { this.active = '#contact' } else { this.active = '#join' } } }, destroyed() { window.removeEventListener('scroll', this.onScroll, false) }, } </script> <style scoped> *{ margin: 0; padding: 0; } #appp { /* 关键代码,需要给容器添加高度 */ position: relative; width: 100%; height: 100vh; padding-right: 200px; } header{ width: 150px; height: auto; position: fixed; top: 100px; right: 130px; z-index: 1; background: #f6f6f6; /* display: flex; display: -webkit-flex; justify-content: center; */ } header a{ display: block; width: 100%; height: 60px; text-align: center; line-height: 60px; color: #333333; text-decoration: none; } header a:hover,header a:active{ color:blue; } header a.active{ color: red; } #home,#team,#contact,#join{ width: 100%; height: 500px; color: #FFFF; font-size: 30px; text-align: center; line-height: 500px; } #home{ background: #ccc; } #team{ background: #888; } #contact{ background: #999; } #join { height: 1000px; background: #f2f2f2; } </style>