Вместо прослушивания события прокрутки вы должны взглянуть на Intersection Observer (IO) . Это было разработано для решения таких проблем, как ваша. И это намного эффективнее, чем прослушивание событий прокрутки и последующее вычисление позиции самостоятельно.
Вот краткий пример того, как изменить список классов заголовка, как только секция прокручивается в поле зрения (или находится за пределами view)
Вы можете отрегулировать это, конечно, чтобы использовать правильные пороговые параметры для вашего IO, чтобы получить желаемый результат. И вам не нужно переключать список классов в заголовке, вы можете использовать любой элемент, который вам нравится. Я использовал простой Javascript в этом примере, но не стесняйтесь также использовать jQuery внутри обратного вызова ввода-вывода, если это облегчит вам задачу.
const sections = document.querySelectorAll('.products');
const config = {
rootMargin: '0px',
threshold: 0
};
const observer = new IntersectionObserver(function (entries, self) {
entries.forEach(entry => {
// Feel free to use jQuery here.
var headerEl = document.querySelector('header');
if (entry.isIntersecting) {
// if the section is intersecting with viewport
headerEl.classList.add(entry.target.dataset.header);
} else {
// section is not visible within viewport
headerEl.classList.remove('products-header');
}
});
}, config);
sections.forEach(section => {
observer.observe(section);
});
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.g-100vh {
height: 100vh
}
header {
min-height: 50px;
position: fixed;
background-color: green;
width: 100%;
}
header.products-header {
color: white;
background-color: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<header>
<p>Header Content </p>
</header>
<section class="g-100vh" style="background-color:darkblue;">
<h1> NOT PRODUCTS </h1>
</section>
<section class="g-100vh products" style="background-color:lightgrey;">
<h1> PRODUCTS </h1>
</section>
<section class="g-100vh" style="background-color:lightgrey;">
<h1> NOT PRODUCTS </h1>
</section>
<section class="g-100vh" style="background-color:lightgrey;">
<h1> NOT PRODUCTS </h1>
</section>