В очередь…©

Немного об очередности работы метода «.animate()». Большинство читателей, наверное, уже знакомо с организацией последовательной анимации. Для этого мы можем использовать цепочку вызовов:

// находим нужный элемент
$('#box')
  // указываем что хотим анимировать
  .animate({left:'-=100'})
  // следующий вызов анимации добавляется в очередь на выполнение
  .animate({top:'-=100'})

Для параллельного запуска анимации необходимо будет внести следующие изменения:

// находим нужный элемент
$('#box')
  // указываем что хотим анимировать
  .animate({left:'+=100'})
  // следующий вызов анимации будет игнорировать очередь
  .animate({top:'+=100'}, {queue:false})

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

queue — имя очереди; для работы с очередью анимации «fx» данный параметр опускаем («fx» – очередь по умолчанию)

clearQueue — флаг очистки очереди

jumpToEnd — применить результат анимации, али нет

Пример есть, и он требует ваших проб и ошибок:

// очень медленный пример
$('#box')
  .animate({left:'-=100'}, {duration: 10000})
  .animate({top: '-=100'}, {duration: 10000})

// останавливаем выполнение текущей анимации
$('#box').stop();

// останавливаем выполнение текущей анимации
// и всех последующих (чистим очередь)
$('#box').stop(true);

// останавливаем выполнение текущей анимации и всех последующих
// но применяем результат текущей
$('#box').stop(true, true);

// останавливаем выполнение только текущей анимации
// и применяем её результат
$('#box').stop(false, true);

Заметка на будущее: если вы сделали выпадающее меню, которое после игры с мышкой продолжает выпадать и исчезать, значит, надо вставить «.stop()» в обработчик события.

По умолчанию вся анимация над объектом складывается в очередь «fx», но с версии 1.7 можно указывать произвольную очередь:

$('#box')
  .animate({'top':'+=100'}, {duration: 10000, queue:'x'}) // составляем очередь X
  .dequeue('x') // запускаем очередь X

$('#box').stop('x') // останавливаем анимацию в очереди X

Для чего нам может понадобиться произвольная очередь? Да для распараллеливания анимации, чтобы мы могли запустить одну очередь анимации и в любой другой момент запустить другую очередь. Возможно, это заклад под игры? Но чего гадать, давайте поиграем. Запустите скрипт, и перед вами появится игровой персонаж:

$('#player').show()

Запустите скрипт с обработчиком события keydown. Теперь заставьте Марио бегать по странице используя клавиши R, D, F и G :

var $player = $('#player');
$(document).keydown(function(event){
    // 82 - `r` - up
    // 68 - `d` - left
    // 70 - `f` - down
    // 71 - `g` - right
    switch (event.keyCode) {
        case 82:
            $player.stop('y', true);
            $player.animate({'top':'-=100'}, {queue:'y'}).dequeue('y');
            break;
        case 68:
            $player.stop('x', true);
            $player.animate({'left':'-=100'}, {queue:'x'}).dequeue('x');
            break;
        case 70:
            $player.stop('y', true);
            $player.animate({'top':'+=100'}, {queue:'y'}).dequeue('y');
            break;
        case 71:
            $player.stop('x', true);
            $player.animate({'left':'+=100'}, {queue:'x'}).dequeue('x');
            break;
    }
    event.stopImmediatePropagation();
})

В данном примере используется две очереди – x и y, которые соответсвуют осям координат по которым мы осуществляем перемещение. При нажатии клавиши D происходит уменьшение значения left на 100px в очереди x. При нажитии клавиши G мы очищаем очередь x и увеличиваем left на 100px. Для перемещения по оси y мы используем одноименную очередь и клавиши R и F.

Из данной главы вы должны были узнать, что у WASD раскладки есть альтернатива :)

Все права на Марио принадлежат Nintendo, так что будьте поаккуратней с ним.

results matching ""

    No results matching ""