Обновить положение прокрутки при изменении размера окна

В настоящее время я использую комбинацию плавной прокрутки и тегов ID/привязки для прокрутки контента на моем сайте. Приведенный ниже код получает идентификатор следующего «раздела» в DOM и добавляет его идентификатор в качестве href «просмотр следующего раздела», поэтому после щелчка он будет прокручиваться до верхней части этого div. Затем он выполняет итерацию, обновляя href следующим идентификатором каждый раз и т. д., пока не будет виден последний раздел, и он прокручивается обратно к началу. Довольно просто.

Единственная проблема заключается в том, что «разделы» являются полноэкранными изображениями, поэтому при прокрутке к началу следующего раздела, если вы измените размер браузера, верхняя позиция этого раздела (где мы прокручивались) сместилась и означает положение потерян.

Я создал файл JSFiddle. Вы можете увидеть, как это происходит после того, как вы нажмете стрелку, чтобы перейти к следующему разделу, а затем измените размер окна: http://jsfiddle.net/WFQ9t/3/

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

Заранее спасибо, Р

var firstSectionID = $('body .each-section').eq(1).attr('id');
$('.next-section').attr('href', '#' + firstSectionID);

var i = 1;
$('.next-section').click(function() {

    var nextSectionID = $('body .each-section').eq(i).attr('id');
    i++;
    $('.next-section').attr('href', '#' + nextSectionID);

    var numberOfSections = $('body .each-section').length;
    var lastSectionID = $('body .each-section').eq(numberOfSections).attr('id');

    if ($('.next-section').attr('href') == '#' + lastSectionID ) { 
        $('.next-section').attr('href', '#introduction');
        i = 1;
    }

});

person John the Painter    schedule 27.01.2014    source источник
comment
Я бы использовал конечный плагин изменения размера и просто активировал существующую плавную прокрутку. Вот один из возможных плагинов: paulirish.com/2009/throttled-smartresize -jquery-обработчик событий   -  person ArrayKnight    schedule 28.01.2014
comment
На самом деле я бы просто сделал 1px div, который прокручивается вместе со страницей, а затем при изменении размера окна всегда вызывал этот .scrollTop() этого div, чтобы получить реальную позицию прокрутки.   -  person ntgCleaner    schedule 28.01.2014
comment
@ntgCleaner Спасибо за помощь. Можете ли вы привести пример? Я понимаю, что div размером 1px прокручивается вместе со страницей, но как мне сделать так, чтобы окно просмотра привязывалось к нему при изменении размера?   -  person John the Painter    schedule 28.01.2014
comment
@rdck Я сейчас работаю над твоей скрипкой. Я посмотрю, смогу ли я придумать это в ближайшее время.   -  person ntgCleaner    schedule 29.01.2014
comment
@rdck что управляет движением div?   -  person ntgCleaner    schedule 29.01.2014
comment
@ntgCleaner Эта функция щелчка $('.next-section').click(function(). Или вы имеете в виду слайдер? Если да, то github.com/nicinabox/superslides   -  person John the Painter    schedule 29.01.2014
comment
@rdck ваши изображения были перемещены, и вам трудно работать на скрипке. Я имею в виду, какой кусок холста движется? Я вижу анимацию только тогда, когда изображения перемещаются влево и вправо, но не вижу, когда они перемещаются вверх и вниз. Пока что я работаю с изменением тела top при изменении размера, но ваши изображения теперь отсутствуют.   -  person ntgCleaner    schedule 29.01.2014
comment
@ntgCleaner Позвольте мне исправить это очень быстро.   -  person John the Painter    schedule 29.01.2014
comment
@ntgCleaner Вот, jsfiddle.net/WFQ9t/3 › Я использую плавную прокрутку для перемещения каждому div с идентификатором, соответствующим .next-section href   -  person John the Painter    schedule 29.01.2014
comment
@rdck Проверьте эту скрипту jsfiddle.net/WFQ9t/7 Она в значительной степени работает, но если вам не все равно , вам придется поместить сброс $('body') в какую-нибудь анимацию. Дайте мне знать, если это сработает, и я размещу это как ответ   -  person ntgCleaner    schedule 29.01.2014
comment
@ntgCleaner Вау, это здорово. Это очень ценится. Быстрый вопрос Как только вы просмотрите все слайды, и он вернется наверх, как только вы измените размер, он снова начнет сходить с ума. Вернуться к началу выполняется этим кодом if ($('.next-section').attr('href') == '#' + lastSectionID ) { $('.next-section').attr('href', '#introduction'); $('.ll-logo-small').addClass('first'); i = 1; }, так что, может быть, стоит добавить сюда и numSection = 1?   -  person John the Painter    schedule 29.01.2014
comment
Правильно, сегодня еще раз посмотрю и отпишусь как ответ   -  person ntgCleaner    schedule 29.01.2014
comment
@ntgCleaner Спасибо, приятель. Действительно ценится.   -  person John the Painter    schedule 29.01.2014


Ответы (2)


Хорошо, проверьте эту скрипту: http://jsfiddle.net/WFQ9t/9/

Несколько вещей, которые я сделал, были:

  1. Созданы некоторые глобальные переменные для обработки номера экрана (на каком экране вы находитесь, а также начальной высоты окна. Вы будете использовать это при загрузке экрана, а также при нажатии на стрелку .next-session.

    var initWinHeight = $(window).height();
    var numSection = 0;
    
  2. Затем я добавил эти переменные в вашу функцию resizeContent().

    resizeContent(initWinHeight, numSection)
    

    так что он будет работать при загрузке и изменении размера

  3. Я заставил body двигаться там, где это необходимо, чтобы приспособиться к движению div (я до сих пор не понимаю, какие div двигаются, когда происходит обычная анимация).

    $('body').css({
        top: (((windowHeight - initWinHeight)*numSection)*-1) + "px"
    });
    
  4. Затем в вашей функции щелчка я добавляю 1 к номеру раздела, сбрасываю начальную высоту окна, а затем также сбрасываю body на top:0. Обычная анимация, которая у вас уже есть, помещает следующий раздел вверху страницы.

    numSection++;
    initWinHeight = $(window).height();
    $('body').css({top:"0px"}, 1000);
    
  5. Наконец, я сбрасываю счетчик numSections, когда вы достигаете последней страницы (возможно, вам придется сделать это 0 вместо 1)

    numSection = 0;
    

В скрипке все это находится в правильных местах, это всего лишь шаги, которые я предпринял для изменения кода.

person ntgCleaner    schedule 29.01.2014
comment
Большое спасибо! Глядя на jsFiddle, как только вы прокрутите один раз и вернетесь наверх, после изменения размера он все равно потеряет свою вершину? Если ссылка jsFiddle неверна? - person John the Painter; 30.01.2014
comment
@rdck Отредактировал скрипку, изменил numSection на ноль при сбросе экранов. похоже, теперь это работает. - person ntgCleaner; 30.01.2014

Вот решение, которое я нашел, но на данный момент я не использую якорные ссылки, я использую классы

Вот мой HTML-код:

<section class="section">
    Section 1
</section>

<section class="section">
    Section 2
</section>

<section class="section">
    Section 3
</section>

<section class="section">
    Section 4
</section>

И вот мой код jQuery/Javascript, я на самом деле использовал очень простой способ:

    $('.section').first().addClass('active');

/* handle the mousewheel event together with 
 DOMMouseScroll to work on cross browser */
$(document).on('mousewheel DOMMouseScroll', function (e) {
    e.preventDefault();//prevent the default mousewheel scrolling
    var active = $('.section.active');
    //get the delta to determine the mousewheel scrol UP and DOWN
    var delta = e.originalEvent.detail < 0 || e.originalEvent.wheelDelta > 0 ? 1 : -1;

    //if the delta value is negative, the user is scrolling down
    if (delta < 0) {
        next = active.next();
        //check if the next section exist and animate the anchoring
        if (next.hasClass('section')) {
            var timer = setTimeout(function () {
                $('body, html').animate({
                    scrollTop: next.offset().top
                }, 800);

                next.addClass('active')
                    .siblings().removeClass('active');

                clearTimeout(timer);
            }, 200);
        }

    } else {
        prev = active.prev();

        if (prev.length) {
            var timer = setTimeout(function () {
                $('body, html').animate({
                    scrollTop: prev.offset().top
                }, 800);

                prev.addClass('active')
                    .siblings().removeClass('active');

                clearTimeout(timer);
            }, 200);
        }

    }
});


/*THE SIMPLE SOLUTION*/
$(window).resize(function(){
    var active = $('.section.active')

     $('body, html').animate({
        scrollTop: active.offset().top
    }, 10);
});
person Giorgos Georgakopoulos    schedule 08.01.2016