Задать вопрос
uliyanov_maks
@uliyanov_maks
Новичок

Как узнать направление прокрутки при срабатывании события?

Подскажите пожалуйста, уже нервов не хватает..
Задача состоит в том, чтобы показать или скрыть любые элементы в зависимости от направления прокрутки.

Нужно, чтобы колбек срабатывал только при пересечении цели '.main' верхней границы вьюпорта.
Когда цель '.main' пересекает верхнюю границу вьюпорта:
- при прокрутке вниз не добавляется класс 'scroll-up',
- при прокрутке вверх добавляется класс 'scroll-up'

p.s. '.main' больше высоты вьюпорта

Нашел такой скрипт, но он работает при верхнем и нижнем пересечении

const element = document.querySelector('.navbar');
const target = document.querySelector('.main');
const thresholdArray = steps => Array(steps + 1).fill(0).map((_, index) => index / steps || 0);

let previousY = 0;
let previousRatio = 0;

const handleIntersect = entries => {
	entries.forEach(entry => {
		const currentY = entry.boundingClientRect.y;
		const currentRatio = entry.intersectionRatio;
		const isIntersecting = entry.isIntersecting;

		// Scrolling down/up
		if (currentY > previousY && isIntersecting) {
			if (currentRatio < previousRatio) {
				element.classList.add('scroll-up');
			} else {
				element.classList.add('scroll-up');
			}
		} else if (currentY < previousY) {
			if (currentRatio > previousRatio && isIntersecting) {
				element.classList.remove('scroll-up');
			} else {
				element.classList.remove('scroll-up');
			}
		}

		previousY = currentY;
		previousRatio = currentRatio;
	})
}

const observer = new IntersectionObserver(handleIntersect, {
	root: null,
	rootMargin: '0px',
	threshold: thresholdArray(20)
})

observer.observe(target)
  • Вопрос задан
  • 479 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
yarkov
@yarkov Куратор тега JavaScript
Помог ответ? Отметь решением.
Вложенные if/else бестолковые. Одно и то же действие выполняется.
Ответ написан
@Vefolio
В JavaScript существует несколько способов определения направления прокрутки при срабатывании события. Один из них - использование свойств scrollTop и scrollLeft элемента, на котором происходит прокрутка, и сравнение их значений с предыдущими значениями.

Например, можно определить направление прокрутки при событии scroll на элементе window следующим образом:

let lastScrollTop = 0;
window.addEventListener("scroll", function() {
  let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
  if (scrollTop > lastScrollTop) {
    console.log("Прокрутка вниз");
  } else {
    console.log("Прокрутка вверх");
  }
  lastScrollTop = scrollTop;
});

В этом примере мы определяем значение scrollTop на элементе window и сравниваем его со значением lastScrollTop, которое мы сохраняем в глобальной переменной. Если значение scrollTop больше, чем lastScrollTop, то происходит прокрутка вниз, иначе - прокрутка вверх.

Аналогичным способом можно определить направление прокрутки на любом другом элементе с прокруткой, например, на элементе с классом "scrollable":

javascript
let lastScrollTop = 0;
let scrollable = document.querySelector(".scrollable");

scrollable.addEventListener("scroll", function() {
  let scrollTop = scrollable.scrollTop;
  if (scrollTop > lastScrollTop) {
    console.log("Прокрутка вниз");
  } else {
    console.log("Прокрутка вверх");
  }
  lastScrollTop = scrollTop;
});

Здесь мы определяем значение scrollTop на элементе с классом "scrollable" и сравниваем его со значением lastScrollTop. Если значение scrollTop больше, чем lastScrollTop, то происходит прокрутка вниз, иначе - прокрутка вверх.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы