Я хотел бы реализовать следующий эффект анимации;
Это основной код;
$("#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, который уже реализует такой эффект?
Спасибо!
Это относительно распространенная проблема очереди анимации и только запуск действия, если анимации уже не происходит, однако в этом случае вам нужно проверить, прокручивается ли страница или нет, что немного более абстрактно в некотором смысле.
ОБНОВЛЕНО НИЖЕ, ЧТОБЫ ИСКАТЬ ПРОБЛЕМУ ПРОСМОТРА: я обновил вашу скрипку здесь: http://jsfiddle.net/andyface/77fr6/, чтобы продемонстрировать проверку, чтобы прокрутить страницу вверху, прежде чем запускать изменение содержимого.
Текущая рабочая скрипка: http://jsfiddle.net/andyface/77fr6/1/
Я также принял некоторые свободы, чтобы сделать ваш код немного легче управлять, и я надеюсь, что это действительно полезно. По сути, я делал работу на основе классов вместо отдельных идентификаторов, поэтому вам нужно только поддерживать один бит кода, и если вам нужно его развернуть, вам не нужно добавлять больше блоков кода, а всего лишь несколько дополнительных строк чтобы получить идентификатор, однако это можно сделать, чтобы сделать все это достаточно умно, чтобы даже не понадобиться.
Основные изменения, которые я сделал, следующие:
link
и контент класса content
.Надеюсь, что это поможет, но дайте мне знать, если вам нужно что-то более объясняющее
ОБНОВЛЕНИЕ. Увидев, что я пропустил тот факт, что, ограничив действие положением прокрутки, это остановит их работу, если пользователь прокрутит вниз, я изменил действие блокировки действий.
$(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;
});
}
}
});
});