Чтобы определить, что пользователь прокрутил, вы можете прослушать событие scroll
в контейнере, который прокручивается.В этом случае это будет корневой элемент, поэтому вы можете использовать window
для добавления прослушивателя событий.
Один из способов добиться этого - добавить и удалить scroll
прослушиватель в created
и destroyed
ловушки жизненного цикла, как упоминалось в этом ответе .
Обратите внимание, что событие прокрутки также будет запускаться при запуске прокрутки с помощью window.scroll({...})
, а не только прокрутки пользователем,Итак, вам нужно позаботиться об этом.
Я бы порекомендовал добавить какой-нибудь газ в прослушиватель событий scroll
, а затем реагировать на все события scroll
, после газа, изменив значение currentSection
.
ДляНапример, ваш обработчик события scroll
может быть:
...,
onScroll(e) {
if(this.throttle) {
clearTimeout(this.throttle);
}
this.throttle = setTimeout(() => (this.currentSection = this.findCurrentSection(e)), 300);
},
...
Где throttle
- просто элемент данных, используемый для хранения значения тайм-аута.Логика поиска значения currentSection
будет активирована только через 300 мс после последнего события scroll
.Вы также можете использовать requestAnimationFrame
, чтобы сделать это, как уже упоминалось здесь .
findCurrentSection
- это просто базовый метод, который перебирает массив secs
, чтобы найти, ну, в общем, текущийраздел на основе текущего значения прокрутки.
...,
findCurrentSection(e) {
const curTop = document.documentElement.scrollTop;
for(let i=0, len=this.secs.length; i < len; ++i) {
const secTop = this.secs[i].offsetTop;
if(curTop === secTop) {
return i;
} else if(curTop < secTop) {
return Math.max(i-1, 0);
}
}
},
...
Обратите внимание, что, поскольку в данном конкретном случае контейнер прокрутки является корневым элементом, я использую document.documentElement.scrollTop
, но в зависимости от контекста вы можете получитьтребуемое значение из соответствующего ScrollEvent
(e
в данном случае).
Вот рабочая скрипка в зависимости от вашего вопроса.Также обратите внимание, что я изменил функцию move
в соответствии с внесенными изменениями.