Как можно плавно прокрутить веб-страницу, используя JavaScript, не прерывая прокрутку следующей командой прокрутки? - PullRequest
0 голосов
/ 20 января 2020

Этот вопрос касается использования колесика мыши на внешней мыши, а не на сенсорной панели.

Я работаю над программой, которая изменяет поведение мыши.
Я использую window.scrollBy, но window.scroll или window.scrollTo или что-то еще может также работать.

Я включил приведенный ниже код для тестовой страницы, которую можно скопировать и вставить.
Он отлично работает для одной прокрутки, но не для нескольких прокруток одновременно.

Одна прокрутка колесика мыши плавно перемещается вверх или вниз.
Но когда несколько прокруток отправляются быстро, страница на самом деле прокручивается медленнее при резком движении.
Проблема, как представляется, заключается в том, что перед Начальная прокрутка закончена, следующая прокрутка прерывает ее.

Например, в коде, который я напечатал ниже:
Если вы прокрутите 5 раз медленно, а затем 10 раз вверх, страница не переместится вверх.

Меня удивляет, как это нормально работает в Windows или Chrome ОС или других операционных системах.
Я уже пытался исследовать это, но не смог найти хорошее объяснение того, как оно работает. обычно работает.
Обычно несколько прокруток одновременно увеличивают плавную прокрутку, в то время как код ниже не делает.

Как это обычно работает?
Какой код можно использовать для правильной прокрутки страницы?

<html><head>
<title>Scroll Test</title>

<script>

window.addEventListener("mousewheel", processEvent, {passive: false});

function processEvent()
{

event.preventDefault();

var scrollAmount = event.deltaY < 0 ? -100 : 100;

window.scrollBy({left:0, top:scrollAmount, behavior:"smooth"});

}

</script>

</head><body align="center">
<b>Test Area:</b>
<p>
</body></html>

<script>
for (var i = 1; i <= 1000; i++) {document.body.innerHTML += i + "<br>";}
</script>

1 Ответ

0 голосов
/ 20 января 2020

Дросселируйте событие колесика мыши или колеса, используя что-то вроде loda sh:

window.addEventListener("mousewheel", _.debounce(processEvent, 500), {passive: false});

Еще одна вещь, которую стоит отметить, функция окна scrollBy может быть не такой плавной, как плагин GSAP ScrollTo:

gsap.to(window, {duration: 2, scrollTo: 400});

Некоторые потенциальные решения в зависимости от того, хорошо ли вы используете внешние библиотеки! :)

...