Следующий код находит индекс i
первой вкладки, который на дальше , чем позиция экрана, и выбирает вкладку , предшествующую ей.
Если после позиции экрана нет вкладки, используется индекс последней вкладки.
const articles = ['#one', '#two', '#three']
function onScroll() {
const screenPos = window.pageYOffset + 20
const i = articles.findIndex((el) => $(el).offset().top > screenPos)
const j = (i === -1) ? articles.length-1 : i-1
const previous = $('nav a.active')
const current = $(`nav a[href="${articles[j]}"]`)
if(current[0] === previous[0]) return
$('nav').find('a.active').removeClass('active')
$(`nav a[href="${articles[j]}"]`).addClass('active')
}
window.addEventListener('scroll', onScroll)
onScroll()
* {
box-sizing: border-box;
font-family: sans-serif;
}
nav {
width: 100px;
height: 135px;
position: fixed;
top: 20px;
left: 350px;
z-index: 1;
}
article {
width: 330px;
height: 600px;
box-shadow: 0 0 0 1px silver inset;
padding: 10px;
margin-left: 5px;
}
nav a.active {
background-color: rgba(0,200,200,1);
}
nav a {
color: black;
margin: 0 0 5px 0;
font-size: 1rem;
line-height: 40px;
text-align: center;
width: 100px;
height: 40px;
box-shadow: 0 0 0 1px silver inset;
border-radius: 5px;
display: inline-block;
text-decoration: none;
transition: background-color .5s ease-out 0s
}
main {
position: absolute;
top: 20px;
z-index: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<nav>
<a href="#one">One</a>
<a href="#two">Two</a>
<a href="#three">Three</a>
</nav>
<main>
<article id="one">Article 1</article>
<article id="two">Article 2</article>
<article id="three">Article 3</article>
</main>