нужна помощь с setInterval в JS

У меня есть функция:

window.addEventListener("scroll",function(){
a = pageYOffset;
    b = setInterval(function(){
        if(a>=115 && topp<1) {
            topp = topp + 0.05;
            console.log(topp);
            navigation.style.opacity = topp;
        }
        else if(a<115 && topp>0){
            console.log(topp);
            topp = topp - 0.05;
            navigation.style.opacity = topp;
        }
    },100);});

topp изначально равен 0; Суть которой плавно проявлять меню. Когда наше 'a' больше или меньше 115 код выполняется корректно с интервалом 0.1s. Проблема в том, что когда это же 'a' проходит рубеж в 115 в одну или другую сторону меню появляется без задержки в 0.1s, а сразу. Он просто делает мой topp=1/0


Ответы (1 шт):

Автор решения: qwabra

доки

демонстрация проблемы

во время прокрутки очень много раз срабатывает событие scroll поэтому создаётся множество setInterval.

i = 0
window.addEventListener("scroll", function () {
  i++
  console.log({ i })
})
<br><br><br><br><br><br><br><br>-,-
<br><br><br><br><br><br><br><br>-,-
<br><br><br><br><br><br><br><br>-,-
<br><br><br><br><br><br><br><br>-,-
<br><br><br><br><br><br><br><br>-,-
<br><br><br><br><br><br><br><br>-,-

решение

const navigation = document.querySelector('.navigation');
let a, b, topp = 0;
window.addEventListener("scroll", function () {
    clearInterval(b); // перед созданием нового интервала необходимо удалить старый
    a = pageYOffset;
    b = setInterval(function () {
        if (a >= 115 && topp < 1) {
            topp = topp + 0.05;
            console.log(topp);
            navigation.style.opacity = '' + topp;
        }
        else if (a < 115 && topp > 0) {
            console.log(topp);
            topp = topp - 0.05;
            navigation.style.opacity = '' + topp;
        } else clearInterval(b); // не забываем удалить интервал после того как он отработает
    }, 100);
});
.navigation {
  position: fixed;
  opacity: 0;
}
<div class="navigation">navigation</div>
<br><br><br><br>-,-
<br><br><br><br>-,-
<br><br><br><br>-,-
<br><br><br><br>-,-
<br><br><br><br>-,-
<br><br><br><br>-,-

→ Ссылка