Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Порядок выполнения анимации (https://javascript.ru/forum/jquery/4184-poryadok-vypolneniya-animacii.html)

Tohin 30.06.2009 23:40

Порядок выполнения анимации
 
Извиняюсь заранее, вопрос вероятно из области RTFM....Но что то я в ступор впал и ничего найти/понять не могу:
Итак есть n-разных элементов (допустим div'ы)
Я никак не могу решить 2 задачи:
1. как сделать чтобы анимация элемента n+1 начиналась только после окончания анимации элемента n? Можно конечно и так:
$('div.n').animate({"top": "+=350"},2500);
$('div.n+1').pause(2500).animate({"bottom": "+=110"},1500);


Но как то коряво на мой ламерский взгляд.....

2. При обработке событий, ну допустим:
$('div.n').hover(
		function() {
			$(this).find('div:first').slideDown('slow');
		},
		function() {
			$(this).find('div:first').slideUp('fast');
		});

можно насоздавать событий пока идет анимация (мышка, она ведь быстрая) и потом дочерний элемент пляшет сам по себе, пока не отработает все события.
Как запретить на время анимации постановку в очередь?

Riim 01.07.2009 00:44

$('div.n').animate({"top": "+=350"},2500).animate({"bottom": "+=110"},1500);

Цитата:

Сообщение от Tohin
Как запретить на время анимации постановку в очередь?

Лучше не запрещать постановку в очередь, а прерывать предыдущую анимацию.

Tohin 01.07.2009 09:19

Цитата:

Сообщение от Riim (Сообщение 23301)
$('div.n').animate({"top": "+=350"},2500).animate({"bottom": "+=110"},1500);

Не... не то... див не один... дива два (div.n и div.n+1), и нужно запихнуть их анимацию в одну и ту же очередь.

Я тормоз! ответ в теме на первой странице http://javascript.ru/forum/jquery/41...ya-komand.html
По идее должно быть так:
$('div.n').fadeIn(1500).fadeOut(1500,function() {
		$('div.n+1').fadeIn(1500); 
	});

ну или то же самое с animate

Цитата:

Сообщение от Riim (Сообщение 23301)
Лучше не запрещать постановку в очередь, а прерывать предыдущую анимацию.

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

Как и думал я не первый стакиваюсь с этим траблом
На этом форуме нашел код:
var hideDelayTimer = null;
    var flag = 0;
    $("#blablabla").bind("mouseenter",function() {
        if (hideDelayTimer) clearTimeout(hideDelayTimer);
        if (flag == 0) {
            flag = 1;
            $(this).animate({"width": "+=120px"}, "slow");
        } else {
            return;
        };
    }).bind("mouseleave",function(){
        if (hideDelayTimer) clearTimeout(hideDelayTimer);
        hideDelayTimer = setTimeout(function() {
        hideDelayTimer = null; 
        if (flag == 1) { 
            $("#blablabla").animate({"width": "-=120px"}, "slow", function() {
                flag = 0;
             });
        } else {
            return;
        };
        }, 500);
    });


Как я понял, перед выполнением анимации задается переменная flag, а после ее окончания она обнуляется. Перед началом анимации проверяется состояние переменной и в сучае выпонения иной анимации новая не выполняется.
Не понял назначение переменной hideDelayTimer и проводимых с ней операций. Подскажите?

Tohin 03.07.2009 11:52

Спасибо всем откликнувшимся разобрался сам.
Опишу для будущих поколений, если ошибся надеюсь меня поправят:

При скрытии функция setTimeout(function() задает паузу перед выполнением анимации в 500мс. и если в этот период снова происходит вызов по событию, то анимация отменяется строчкой:
if (hideDelayTimer) clearTimeout(hideDelayTimer);


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