Не работает window.scrollY

Всем привет. Проблемы две:

  1. Не работает addeventlistener scroll - вообще не срабатывает. Из-за этого пришлось сделать конструкцию ниже - она работает.
  2. Основная проблема - при попытке вызвать window.scrollY я всегда получаю 0.

Пробовал ставить общему блоку высоту auto, пробовал везде убирать height: 100% и в целом попробовал все доступные решения из интернета. Если нужна будет какая-то дополнительная информация, то я скину.

function userScrolling(event) {
  let scrollDistance = window.scrollY;
  console.log(window.scrollY)
}

function disableScroll() {
  if (window.addEventListener) // older FF
    window.addEventListener('DOMMouseScroll', userScrolling, false);
  window.onwheel = userScrolling; // modern standard
  window.onmousewheel = document.onmousewheel = userScrolling; // older browsers, IE
  window.ontouchmove = userScrolling; // mobile
}
disableScroll();


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

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

for (let i = 0; i < 30; i++) document.body.insertAdjacentHTML('beforeend', `<div>${i}</div>`);

const $span = document.querySelector(`span`);

addEventListener(`scroll`, () => $span.innerHTML = `x:${window.scrollX}, y:${window.scrollY}`);
div {
  margin-bottom: 1rem;
  background-color: lightgray;
  padding: 1rem;
  width: 200%;
}

span {
  position: fixed;
  top: 1rem;
  left: 1rem;
  padding: 1rem;
  background-color: white;
  border: 1px dashed purple;
}
<span></span>

→ Ссылка
Автор решения: VenZell

Описанная вами конструкция

window.addEventListener('scroll', function(e) {});

точно рабочая. У нее широкая совместимость, согласно документации: Document: событие scroll. Ниже пример, демонстрирующий работу этого события.

window.addEventListener('scroll', function(e) {
  document.querySelector('p').innerText = 'window.scrollY: ' + window.scrollY;
});
body {
  background-color: #ccffff;
  border: 1px dashed #ccc;
  height: 800px;
  position: relative;
}

p {
  position: fixed;
  top: 0;
  left: 16px;
}
<p>window.scrollY: 0</p>

Теперь к вопросу о том, почему вы всегда получаете 0. Это может происходить в том случае, если никакой документа прокрутки на самом деле не происходит. Например, в вашем примере в консоли всегда будет 0, так как при скроле не происходит смещения документа по вертикали. Смещения по вертикали не происходит, так как у документа не задана высота, больше чем отображаемая область и документ не содержит никакого контента, который мог бы его растянуть автоматически.

Пробовал ставить общему блоку высоту auto

Это наталкивает на мысль о том, что вам нужно считать количество пикселей, прокрученных от верха элемента, а не документа. Для этого есть свойство scrollTop.

Разницу между scrollY и scrollTop вы можете наблюдать в примере ниже. Обратите внимание, что во время прокрутки содержимого контейнера, scrollY не меняется, так как документ не смещается по вертикали.

let p = document.querySelector('p'),
  span = document.querySelector('span'),
  container = document.querySelector('.container');

window.addEventListener('scroll', function(e) {
  p.innerText = 'window.scrollY: ' + window.scrollY;
});

container.addEventListener('scroll', function(e) {
  span.innerText = 'container.scrollTop: ' + container.scrollTop;
});
body {
  background-color: #ccffff;
  border: 1px dashed #ccc;
  height: 800px;
  position: relative;
}

p {
  position: fixed;
  bottom: 16px;
  left: 16px;
  margin: 0;
}

span {
  position: fixed;
  bottom: 16px;
  right: 16px;
}

.container {
  background-color: cyan;
  max-height: 80px;
  padding: 8px;
  overflow-y: scroll;
}

.content {
  background-color: lightgreen;
  width: 80px;
  height: 160px;
}
<p>window.scrollY: 0</p>
<span>container.scrollTop: 0</span>
<div class="container">
  <div class="content">
  </div>

→ Ссылка