Как вычислить кинетический скролл без моря таймаутов?
Есть параллакс, и если сам по себе touch-скролл более-менее обрабатывается набором touchend, touchstart, touchcancel, touchmove событий, то ситуация «коснулся пальцем, быстро дернул и тут же отпустил, а экран проскроллся по инерции» у меня не обрабатывается корректно.
Из топорных методов, конечно, приходит в голову интервал на touchstart, но мне кажется это уродливым решением
боюсь, вы не так меня поняли. мне не надо «имитировать» кинетику, мне надо вычислить, когда срабатывает стандартная кинетика в мобильных устройствах, посчитать расстояние, на которое она прокручивает страничку, чтобы верно расставить параллакс элементы
да, но событие! КОГДА взять позицию прокрутки и пересчитать расположение параллакс слоёв? стандартный набор touchend, touchstart, touchcancel, touchmove завершается РАНЬШЕ, чем заканчивается плавная кинетическая прокрутка, т.е. по этим событиям я получаю положение ДО окончательной остановки прокрутки.
делать таймер мне кажется ОЧЕНЬ топорным решением, так как длительность кинетики зависит от силы «толчка».
естественно, сначала я делал параллакс для десктопов и использовал событие скролл. после этого при разработке мобильной версии я и наткнулся на проблему с тач эвентами. при тачах скролл НЕ СРАБАТЫВАЕТ.
Возможно, дело в том ,что у меня горизонтальная прокрутка сделана
По факту, сам параллакс при тачах нужен только для сенсорных устройств с большим экраном (на телефонах будет вертикальная прокрутка без параллакса), но проблема сама по себе интересная и неприятная
xmoonlight, ВЕРТИКАЛЬНЫЙ — конечно, да. И у меня в примере срабатывает при вертикальной прокрутке и тач и скролл события. ГОРИЗОНТАЛЬНЫЙ же тач-скролл не генерирует событие скролл у меня. Посмотрите мою ссылку и консоль. Точка переключения 500 пикселей. на экранах менее 500 пикселей у меня работают и тач и скролл события, вертикальная прокрутка. выше 500 пикселей переключается в горизонтальный режим и при тач событиях не срабатывает скролл
Далее вы открываете тач-режим с размером экрана более 500 пикселей и пробуете подвигать страницу горизонтально.
В консоли выскакивают уведомления о touch событиях, но ни одного о scroll событии
Вопрос: что, блин, должно измениться от взятия кода из примера с обращением к элементу, которого у меня в примере НЕ существует, если то же самое событие просто-напросто НЕ ВЫЗЫВАЕТСЯ в моем примере при описанном мною кейсе?
Алексей Рахе, событие scroll не всплывает. У тебя скролится document.body а событие ты ловишь на window, поэтому его там и нет. С этими скролами всегда какой-то подвох)
RAX7, ааа, всё, получилось, действительно. это меня mousewheel сбили, их я на window вешал.
Да, теперь отрабатывает скролл после остановки кинетики, параллакс пересчитывается. жаль, что с задержкой происходит, а не в реальном времени (т.е. сейчас «дернул экран, он проскроллился, потом уже анимировались слои», а не «дернул экран, просчиталась сила "толчка" и одновременно с браузерной кинетикой начали анимироваться слои»)
меня терзает смутное сомнение что где-то в тач событиях должна появляться эта самая сила толчка, на основе которой можно было бы предсказать кинетику (на сколько проскроллится экран), ведь вроде существуют плагины, отлавливающие свайпы. а такой толчок это практически и есть свайп
дорогой друг, если посмотрите мою ссылку, там в исходном файле есть строки
1. Мне за это не платят, чтобы я тартил время на изучение чужих исходников.
2. Когда Вам пытаются помочь бесплатно - следите за тоном общения.
3. Не нужно думать, что Вы - правы, если у Вас что-то не работает.
4. Проверяйте наличие/срабатывание событий в "чистом" виде (пустая страница + консоль). Читайте документацию чаще.
5. При вычислении инерции - используйте начальные и конечные события - АСИНХРОННО, вычисляя между ними временной интервал и другие изменившиеся свойства. На основе этого - строите график затухания и прогнозируете координаты останова (для инерционного скролла, например).
xmoonlight, спасибо, извините за тон, просто у меня была ситуация, что событие не отлавливалось, а вы предлагали попробовать то же самое, что у меня и так было в коде
выяснилось, что я отлавливал событие на window,а не на body, как было нужно