добавить контент, пролистать до него, скрыть старый контент

0

Я хотел бы реализовать следующий эффект анимации;

http://jsfiddle.net/YKmu2/37/

Это основной код;

    $("#c1").on( "click", function(event) {

    event.preventDefault(); 
    new_site = 'content1';

    if(site == new_site) {   $('[name="' + new_site + '"]').show();   }
    else {  

        $('[name="' + new_site + '"]').insertAfter('[name="' + site + '"]');
        $('[name="' + new_site + '"]').show();
        $.scrollTo('[name="' + new_site + '"]', 1000);

    }   

    setTimeout(function() {     
        $('[name="' + site + '"]').hide();              
        $.scrollTo('[name="' + new_site + '"]');
        site = new_site;                
        }, 1005);

});

Когда вы нажимаете на одну из ссылок, содержимое, связанное с этой ссылкой, добавляется к текущему контенту, а анимация прокрутки выполняется с помощью плагина scrollTo.

После завершения анимации прокрутки старый контент удаляется/скрывается.

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

У кого-то есть идея, как исправить это/сделать его надежным и проверенным на ошибки? Или кто-то знает плагин jquery, который уже реализует такой эффект?

Спасибо!

Теги:
scroll
scrollto

1 ответ

0
Лучший ответ

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

ОБНОВЛЕНО НИЖЕ, ЧТОБЫ ИСКАТЬ ПРОБЛЕМУ ПРОСМОТРА: я обновил вашу скрипку здесь: http://jsfiddle.net/andyface/77fr6/, чтобы продемонстрировать проверку, чтобы прокрутить страницу вверху, прежде чем запускать изменение содержимого.

Текущая рабочая скрипка: http://jsfiddle.net/andyface/77fr6/1/

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

Основные изменения, которые я сделал, следующие:

  • Теперь ссылки имеют класс link и контент класса content.
  • Идентификаторы ссылок затем используются для экстраполяции содержимого, которое они предназначены для запуска.
  • Я также удалил таймаут и использовал функцию обратного вызова scrollTo(), поскольку это будет более надежным.
  • Наконец, я добавил чек, чтобы проверить, прокручивала ли страница вверху, прежде чем разрешить действие

Надеюсь, что это поможет, но дайте мне знать, если вам нужно что-то более объясняющее

ОБНОВЛЕНИЕ. Увидев, что я пропустил тот факт, что, ограничив действие положением прокрутки, это остановит их работу, если пользователь прокрутит вниз, я изменил действие блокировки действий.

$(document).ready(function() {

    // HIDE CONTENT
    $('.content').hide();

    var site = '',
        scrolling = false;

    $(".link").on( "click", function(event) {

        // THIS IS JUST USED FOR TESTING TO SEE WHAT THE scrollTop() POSTION IS WHEN CONTENT IS SCROLLED - REMOVE console.log() WHEN IN PRODUCTION
        console.log($(window).scrollTop());

        event.preventDefault(); 

        // ONLY RUN THE SCRIPT IF THE PAGE HAS SCROLLED TO IT'S FINAL POSITION
        if( ! scrolling)
        {
            var new_site = null;        

            switch($(this).attr('id')) {

                case 'c1':
                    new_site = 'content1';
                    break;
                case 'c2':
                    new_site = 'content2';
                    break;
                case 'c3':
                    new_site = 'content3';
                    break;
            }

            if(site != new_site) {  

                // KEEP A TRACK OF IF THE PAGE IS SCROLLING OR NOT
                scrolling = true;

                $('#' + new_site).insertAfter('#' + site);
                $('#' + new_site).show();
                $.scrollTo('#' + new_site, 1000, function() {

                    // CALLBACK TRIGGERED WHEN SCROLLING HAS FINISHED
                    $('#' + site).hide();
                    $.scrollTo('#' + new_site);
                    site = new_site;

                    // TELL THE PAGE IT'S OK TO DO STUFF COS WE'RE NOT SCROLLING IT ANYMORE
                    scrolling = false;
                });   
            }   
        }
    });
}); 

http://jsfiddle.net/andyface/77fr6/1/

  • 1
    Спасибо за ваши усилия! Тем не мение; так как вы используете if ($ (window) .scrollTop () <= 8) - пользователь не может больше нажимать на любую ссылку, когда прокручивает текст немного вниз вручную. Вы знаете обходной путь для этого?
  • 0
    ааааааа, не думал об этом, немного хитро это. Вы знаете, что (извините, размышляя и печатая), я считаю, что было бы проще просто отслеживать, что страница делает, а затем разрешать клики на основе этого. Я обновлю свой ответ новой ссылкой на скрипку.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню