Использование jQuery для привязки к div при прокрутке

#javascript #jquery #css

#javascript #jquery #css

Вопрос:

Я создал простой веб-сайт с вертикальной прокруткой, который привязывает представление к divs, когда пользователь прокручивает страницу вверх или вниз. Вы можете посмотреть демонстрацию здесь: http://dev.driz.co.uk/snap.html

JS довольно прост:

 var currentScreen = 0;

var scrollReady = false;

var screens = new Array( 'one',
                         'two',
                         'three');

function scrollNext() {
    if( currentScreen < screens.length-1 amp;amp; scrollReady == true ) {
        currentScreen  ;
        performScroll();
    }
}

function scrollPrev() {
    if( currentScreen > 0 amp;amp; scrollReady == true ) {
        currentScreen--;
        performScroll();
    }
}

function performScroll() {
    scrollReady = false;    
    var newYPos = Math.ceil($('#' screens[currentScreen]).offset().top);
    $('.snap').animate({scrollTop: newYPos }, 500, function() { scrollReady = true; });
}

$(document).ready(function() {

    scrollReady = true;

    $('.snap').bind('mousewheel', function (event, aS, aQ, deltaY) {
        event.preventDefault();
        if (deltaY > 0) {
            scrollPrev();
        } else {
            if (deltaY < 0) {
                scrollNext();
            }
        }
        return false;
    });


    $(document).bind('keyup', function (event) {
        if (event.keyCode == 40 || event.keyCode == 38) {
            event.preventDefault();
            if (event.keyCode == 40) {
                if (scrollReady == true) {
                    scrollNext();
                }
            } else {
                if (event.keyCode == 38) {
                    if (scrollReady == true) {
                        scrollPrev();
                    }
                }
            }
        }
    });

    $(document).bind('keydown', function (event) {
        if (event.keyCode == 40 || event.keyCode == 38 ) {
            event.preventDefault();
        }
    });

});
  

Однако я могу прокрутить только первые два раздела и не могу перейти к третьему… Есть идеи, почему это происходит? Я не вижу проблем, которые могли бы вызвать это, что не повлияло бы на работу первых двух…

Обновление: иногда вы можете заставить его прокручиваться до третьего div (прокручивать вверх и вниз, пока это не произойдет), но он пропускает второй div, а затем, когда пользователь снова прокручивает вверх, он прыгает до самого верха … так что происходит что-то странное.

Обновление 2: я заметил, что currentScreen отображается неправильно 2 при прокрутке до второго div, поэтому вы не можете перейти к третьему div. Есть идеи, почему?

Обновление 3: Кажется, что scrollReady переменная не препятствует многократному вызову функций в разных местах, так как при прокрутке вверх и вниз несколько раз вы обнаружите, что разделы прокручиваются несколько раз. Чего не должно быть, вы должны иметь возможность прокручивать только вверх и вниз по одному за раз.

Комментарии:

1. @PratikJoshi Вы должны попробовать прочитать вопрос, это действительно помогает.

Ответ №1:

Сохраните значения смещений разделов в переменной, а затем попробуйте, это сработает.

проверьте это в codepen.

http://codepen.io/sandeshdamkondwar/pen/veGko?editors=100

Комментарии:

1. Проблема с этим до сих пор заключается в том, что я не могу исправить положение прокрутки при изменении размера браузера. Смотрите: jsfiddle.net/JG68S по сути, это должно переместить пользователя в правильное положение в зависимости от того, где он прокручивал перед изменением размера экрана. Мой пример ВСЕГДА прокручивается обратно к первому, когда экран становится меньше, но затем исправляется при повторном увеличении экрана.

2. Если вы прокрутите до второго экрана (индекс 1), а затем измените размер окна и выйдете из консоли: screens[currentScreen] , возвращаемое значение будет -289 таким, что оно запутается.. Есть идеи? Я сбрасываю значения массива при изменении размера, но значения неверны. Спасибо.

Ответ №2:

В функции scrollNext() ваша условная проверка неверна

на втором экране это условие будет ложным, и поэтому оно не переходит на третий экран.

Это должно быть

 currentScreen < screens.length
  

Комментарии:

1. Это неправда. Это приведет к нарушению индексации!

2. О да, вы запускаете currentScreen с 0

3. Если вы отладите код, вы обнаружите, что смещения возвращают неправильные значения. значение newPosY неверно из-за функции смещения jquery. Я не знаю причину, почему.