Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Скроллинг страницы с остановкой в определенных точках (https://javascript.ru/forum/misc/75490-skrolling-stranicy-s-ostanovkojj-v-opredelennykh-tochkakh.html)

alexkirsanov850@gmail.com 14.10.2018 20:50

Скроллинг страницы с остановкой в определенных точках
 
Добрый день!

Мучает следующая зада:

предположим, задана точка 500px по у

как сделать так, что бы при скроллинге страницы (прокрутка колесика мыши) осуществлялся скроллинг страницы, а при попадании значения scrollY в диапазон 400-500px скроллинг прекращался и запускался лишь при реальной повторной прокрутке колесика мыши.

j0hnik 14.10.2018 20:53

как отличить повторную реальную прокрутку?

alexkirsanov850@gmail.com 14.10.2018 21:00

Скорее, как в моменте выявить факт повторного поворота колесика мыши

j0hnik 14.10.2018 21:02

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

alexkirsanov850@gmail.com 14.10.2018 21:05

j0hnik,
Не возможно!
Колесико можно крутить 3 раза в секунду, а при скроллинге событие автоматически повторяется, в зависимости от "резкости нажатия" до 2 сек

От того не возможно.

alexkirsanov850@gmail.com 14.10.2018 21:07

j0hnik,
Представтье себе как замечательно было бы при прокрутке страницы иметь возможность акцентировать внимание на определенных блоках или заголовках, посредством остановки скроллинга

Смотришь страницу, скроллишь и она сама останавливается на выбранном элементе

j0hnik 14.10.2018 21:08

тогда я не понимаю что такое
Цитата:

Сообщение от alexkirsanov850@gmail.com
при реальной повторной прокрутке колесика мыши.


alexkirsanov850@gmail.com 14.10.2018 21:15

j0hnik,

Как я понял, при повороте колесика мыши возникает событие onwheel, а потом еще раз возникает и еще и еще, пока значение deltaY не приблизится к 0.

Фактически после поворота колесика мыши имитируются повторные повороты

alexkirsanov850@gmail.com 14.10.2018 21:18

Пример:
window.onwheel = procedure(e) {
     var delta = e.deltaY;
     window.scrollBy(delta);

     document.title = window.delta;
}

посмотрите. Очень наглядно. Эффект "затухания" и событие onwheel возникает многократно

alexkirsanov850@gmail.com 14.10.2018 21:33

j0hnik,
А можно как то очистить очередь событий?

alexkirsanov850@gmail.com 14.10.2018 21:36

j0hnik,
Как я понял, при прокрутке колесика генерируются события onwheel и встают они в очередь событий.
Быть может можно почистить ?

j0hnik 14.10.2018 21:38

Цитата:

Сообщение от alexkirsanov850@gmail.com
посмотрите. Очень наглядно. Эффект "затухания" и событие onwheel возникает многократно

где тут затухание?

j0hnik 14.10.2018 21:39

Цитата:

Сообщение от alexkirsanov850@gmail.com
onwheel и встают они в очередь событий.

нет у вас никакой очереди, обработчик ловит событие и выполняет функцию =)

alexkirsanov850@gmail.com 14.10.2018 21:45

?)
как тогда объяснить нижеследующее:
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 раз

Или я не прав?)

j0hnik 14.10.2018 21:51

значение все время увеличивается, каждая единичка это сработавший обработчик, это да, но никакой очереди нет.

j0hnik 14.10.2018 22:01

alexkirsanov850@gmail.com,
комп слишком быстр чтобы такую простую функцию не успевать выполнять на лету.

alexkirsanov850@gmail.com 14.10.2018 22:05

j0hnik,

Я не разработчик на js и моя работа даже близко не связана с разработкой в принципе, но мне интересно разобраться в вопросе.

Я в совершенстве владею Delphi и выполнить могу практически любую задачу. Не плохо C++ от того, мы с вами можем спокойно говорить на одном языке

alexkirsanov850@gmail.com 14.10.2018 22:06

j0hnik,
мне абсолютно ясно, что просто так значения deltaY возникать не могут

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

alexkirsanov850@gmail.com 14.10.2018 22:09

j0hnik,
и судя по всему, поворот колесика, в зависимости от длительности нажатия или прочих критериев, генерирует события, которые выполняются последовательно

alexkirsanov850@gmail.com 14.10.2018 22:10

j0hnik,
Попробуйте решить задачу:

При скроллинге страницы с целью акцентирования внимания на определенных блоках остановить прокрутку страницы.

Эта задача должна просто решаться у меня не хватает знаний и понимания именно языка.

j0hnik 14.10.2018 22:14

Цитата:

Сообщение от alexkirsanov850@gmail.com
очередь событий не быть просто не может и поскольку язык монопоточный она есть

в данном случае многопоточность никак не задействована. работать в один все будет.

j0hnik 14.10.2018 22:17

Цитата:

Сообщение от alexkirsanov850@gmail.com
При скроллинге страницы с целью акцентирования внимания на определенных блоках остановить прокрутку страницы.

Эта задача должна просто решаться у меня не хватает знаний и понимания именно языка.

отслеживать скролл, при прокрутке на нужное значение блокировать прокрутку на какое то время.
или сразу отменять родное действие и скроллить блоками.

alexkirsanov850@gmail.com 14.10.2018 22:32

сейчас поясню
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 и скроллинг продолжается))) все сползает

Не пойму как решить

alexkirsanov850@gmail.com 14.10.2018 22:40

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 и блок смещается!

рони 14.10.2018 23:34

alexkirsanov850@gmail.com,
https://javascript.ru/forum/dom-wind...tml#post312682

j0hnik 15.10.2018 00:03

Цитата:

Сообщение от alexkirsanov850@gmail.com (Сообщение 496312)
А далее происходит следующее: все работает ОК, пока не дойдет до 500. Потом переносимся на 600 как и хотелось, а вот потом...
долетают новые значения deltaY и скроллинг продолжается))) все сползает

Не пойму как решить

у меня этот код только скролл с рывками производит, что и не удивительно. Родной скролл имеет небольшой транзишин, метод scrollTo() по умолчанию без транзишина.
мб у вас еще где то в коде какие то фичи для скролла?


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