Скроллинг страницы с остановкой в определенных точках
Добрый день!
Мучает следующая зада: предположим, задана точка 500px по у как сделать так, что бы при скроллинге страницы (прокрутка колесика мыши) осуществлялся скроллинг страницы, а при попадании значения scrollY в диапазон 400-500px скроллинг прекращался и запускался лишь при реальной повторной прокрутке колесика мыши. |
как отличить повторную реальную прокрутку?
|
Скорее, как в моменте выявить факт повторного поворота колесика мыши
|
предположу что наверное нужно засекать время между возникновениями события
|
j0hnik,
Не возможно! Колесико можно крутить 3 раза в секунду, а при скроллинге событие автоматически повторяется, в зависимости от "резкости нажатия" до 2 сек От того не возможно. |
j0hnik,
Представтье себе как замечательно было бы при прокрутке страницы иметь возможность акцентировать внимание на определенных блоках или заголовках, посредством остановки скроллинга Смотришь страницу, скроллишь и она сама останавливается на выбранном элементе |
тогда я не понимаю что такое
Цитата:
|
j0hnik,
Как я понял, при повороте колесика мыши возникает событие onwheel, а потом еще раз возникает и еще и еще, пока значение deltaY не приблизится к 0. Фактически после поворота колесика мыши имитируются повторные повороты |
Пример:
window.onwheel = procedure(e) { var delta = e.deltaY; window.scrollBy(delta); document.title = window.delta; } посмотрите. Очень наглядно. Эффект "затухания" и событие onwheel возникает многократно |
j0hnik,
А можно как то очистить очередь событий? |
j0hnik,
Как я понял, при прокрутке колесика генерируются события onwheel и встают они в очередь событий. Быть может можно почистить ? |
Цитата:
|
Цитата:
|
?)
как тогда объяснить нижеследующее: var onWheelCount = 0; window.onwheel = function(e) { var delta = e.deltaY; onWheelCount++; document.title = onWheelCount; window.scrollBy(0, delta); } Попробуйте "крутануть" колесико мыши. Значение onWheelCount у меня получается 20-70 Следовательно onwheel возникает 20-70 раз Или я не прав?) |
значение все время увеличивается, каждая единичка это сработавший обработчик, это да, но никакой очереди нет.
|
alexkirsanov850@gmail.com,
комп слишком быстр чтобы такую простую функцию не успевать выполнять на лету. |
j0hnik,
Я не разработчик на js и моя работа даже близко не связана с разработкой в принципе, но мне интересно разобраться в вопросе. Я в совершенстве владею Delphi и выполнить могу практически любую задачу. Не плохо C++ от того, мы с вами можем спокойно говорить на одном языке |
j0hnik,
мне абсолютно ясно, что просто так значения deltaY возникать не могут очередь событий не быть просто не может и поскольку язык монопоточный она есть |
j0hnik,
и судя по всему, поворот колесика, в зависимости от длительности нажатия или прочих критериев, генерирует события, которые выполняются последовательно |
j0hnik,
Попробуйте решить задачу: При скроллинге страницы с целью акцентирования внимания на определенных блоках остановить прокрутку страницы. Эта задача должна просто решаться у меня не хватает знаний и понимания именно языка. |
Цитата:
|
Цитата:
или сразу отменять родное действие и скроллить блоками. |
сейчас поясню
window.onwheel = function(e) { var delta = e.deltaY; //получили значение "смещения" var isScrollDown = true; if (delta<0) { isScrollDown = false; }//направление прокрутки var posScroll = window.scrollY + delta; //определили новое положение //далее пусть например якорный интервал 500-600 if ((posScroll>500)&&(posScroll<600)) { posScroll = 600; } window.scrollTo(0, posScroll); } А далее происходит следующее: все работает ОК, пока не дойдет до 500. Потом переносимся на 600 как и хотелось, а вот потом... долетают новые значения deltaY и скроллинг продолжается))) все сползает Не пойму как решить |
j0hnik,
пытался скроллить блоками window.onwheel = function(e) { return false; } elems = document.getElementsByClassName('cnt'); elems[0].onwheel = function(e){ var delta = e.deltaY; var posScroll = window.scrollY + delta; if ((posScroll>500)&&(posScroll<600)){ elems[1].scrollIntoView(); } else {window.scrollTo(0, posScroll);} } elems[1].onwheel = function(e){ var delta = e.deltaY; var posScroll = window.scrollY + delta; if ((posScroll>500)&&(posScroll<600)){ elems[2].scrollIntoView(); } else {window.scrollTo(0, posScroll);} } Все тоже самое как и в первом случае перешла на 2 блок и далее догоняет новое deltaY и блок смещается! |
alexkirsanov850@gmail.com,
https://javascript.ru/forum/dom-wind...tml#post312682 |
Цитата:
мб у вас еще где то в коде какие то фичи для скролла? |
Часовой пояс GMT +3, время: 08:28. |