CSS-live.ru

Руководство по Web Animations API — Часть 4: групповые и последовательные эффекты

Перевод статьи Web Animations API Tutorial Part 4: GroupEffects & SequenceEffects с сайта danielcwilson.com, опубликовано на css-live.ru с разрешения автора — Дэна Уилсона (твиттер — @dancwilson).

Это четвёртая часть из серии вводных/учебных статей про Web Animations API, который вот-вот появится в браузерах. Если у вас есть мысли/вопросы, вы заметили, что я неправильно истолковал спецификацию, или хотите обсудить со мной что-то конкретное в будущих статьях, то обращайтесь ко мне в Twitter, @dancwilson.

Давайте продолжим изучать множественные анимации с Web Animations API, и рассмотрим несколько вещей, которые сегодня доступны в полифилле, предназначенные для группировки и последовательности анимаций.

Объект KeyframeEffect

KeyframeEffect принимает три параметра: элемент для анимации, массив ключевых кадров и опции шкалы времени. Все эти параметры мы видели во время использования element.animate(). По сути, этот новый объект и есть основа для одиночной анимации, и мы увидим это при обсуждении способов группировки и последовательности анимаций. Объект не запускает анимацию, а просто определяет её.

var elem = document.getElementById('toAnimate');
var timings = {
  duration: 1000,
  fill: 'both'
}
var keyframes = [
  { opacity: 1 }.
  { opacity: 0 }
];

var effect = new KeyframeEffect(elem, keyframes, timings);

Объекты GroupEffect

Хотя это нигде еще нативно не реализовано, и даже в спецификации 1 уровня этого нет, полифилл дает возможность группировать анимации и проигрывать их вместе. Объект GroupEffect (да, он вот-вот появится в спецификации второго уровня) группирует один и более объектов для одновременного проигрывания.

GroupEffect принимает параметр эффектов, куда можно передать массив объектов KeyframeEffect, представляющий множественные анимации. Как только объект определён, можно проигрывать группу анимаций в шкале времени по умолчанию.

var elem = document.getElementById('toAnimate');
var elem2 = document.getElementById('toAnimate2');
var timings = {
  duration: 1000
}
var keyframes = [
  { opacity: 1 }.
  { opacity: 0 }
];

var kEffects = [
  new KeyframeEffect(elem, keyframes, timings),
  new KeyframeEffect(elem2, keyframes, timings)
];
var group = new GroupEffect(kEffects);
document.timeline.play(group);

Последовательные эффекты

Подобно GroupEffect, SequenceEffect позволяет группировать множественные анимации (указанные в объектах KeyframeEffect) вместе… но проигрывать их не одновременно, а одну за другой. Также (как указано в полифилле) можно применять GroupEffect и SequenceEffect вместе (например, для группировки множественных последовательностей).

See the Pen vNXGxL by Максим (@psywalker) on CodePen.

С последовательностями нам не придётся пробираться окольными тропами с CSS или с ранее рассмотренными средствами API анимаций. Нам бы пришлось устанавливать такие задержки, чтобы предыдущие анимации успели закончиться, или использовать обратные вызовы finish. Эти методы трудно поддерживать, и они бывают не слишком точны.

Используя прежние переменные из примера кода про GroupEffect:

var sequence = new SequenceEffect(kEffects);
document.timeline.play(sequence);

Альтернативный способ создания анимации

Ранее мы уже обсуждали создание анимаций с element.animate(). Это быстрый способ создать анимацию, тут же её проиграть, и сохранить ссылку на объект AnimationPlayer. Мы рассматривали его прежде всего потому, что он уже поддерживаетсяв Chrome, а также в полифилле. Firefox почти поддерживает альтернативный вариант… но еще не настолько, чтобы этим можно было пользоваться или хотя бы продемонстрировать (даже с полифиллом). Тем не менее давайте взглянем на него одним глазком, поскольку он представляет ещё один способ применения KeyframeEffect, и описан в спецификации первого уровня, так что уже скоро мы увидим больше его возможностей.

Сначала вспомним, как работает element.animate().

var elem = document.getElementById('toAnimate');
var timings = {
  duration: 1000,
  fill: 'both'
}
var keyframes = [
  { opacity: 1 }.
  { opacity: 0 }
];

elem.animate(keyframes, timings);

А теперь применим те же переменные, но уже с конструктором Animation.

var kEffect = new KeyframeEffect(elem, keyframes, timings);
var player = new Animation(kEffect, elem.ownerDocument.timeline);
player.play();

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

Заключение и в следующей серии

Как только спецификация 2 уровня выйдет из черновиков, во всех этих *Effects должно появиться больше определенности. В этой серии планируется ещё пара статей. В следующей серии мы снова заглянем в будущее и увидим, что ещё нас ожидает в ближайшее время.

Поглядите остальные статьи из этой серии:

P.S. Это тоже может быть интересно:

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.