Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Сброс длинного скрола mousewheel (https://javascript.ru/forum/jquery/43463-sbros-dlinnogo-skrola-mousewheel.html)

nvp2 06.12.2013 15:00

Сброс длинного скрола mousewheel
 
Приветствую.
Есть обработчик на jquery.mousewheel, который при скроле мыши пролистывает страницу к предыдущему/следующему диву.
Неудобство в том, что при резком (длинном) прокручивании скрола происходит переход сразу на несколько элементов: следующий/предыдущий + еще несколько, в зависимости от интенсивности прокручивания.

Как можно это побороть, чтобы при одном прокручивании скрола переходило к следующему элементу, и последующие скролы блокировались?

Есть идея отслеживать время между скролами и если оно меньше секунды - то обработчик перехода не выполнять. Но как это реализовать - что-то никак не соображу

mi.rafaylik 06.12.2013 18:16

Как вариант:
1. до скроллинга:
1.a. запомнить текущую позицию $(document).scrollTop()
1.b. запомнить текущий div, скажем это $('#old-div-id') (сделать это можно разными способами)
2. после скроллинга:
2.a. получить новую позицию $(document).scrollTop()
3. понять в какую сторону двигались (сравнить пункты 1.a и 2.a)
4. смотря в какую сторону движемся (вверх или вниз):
4.a. если вверх, то найти div, который находился перед уже посещённым (пункт 1.b): $('#old-div-id').prev()
4.b. если вниз, то найти следующий: $('#old-div-id').next()
5. получить позицию этого нового div, $('#new-div-id').offset().top
6. если пункт 2.a меньше (или больше, зависит от пункта 3), чем пункт 5, значит мы проскроллили дальше чем нужно. значит смотрим пункт 7.
7. принудительно переместиться к div, найденному в пункте 4.
8. установить новые данные для пунктов 1.a и 1.b.

Для события $(window).scroll() этот метод тоже будет работать.
.


Часовой пояс GMT +3, время: 05:48.