Всем привет. Занялся портированием Animate.CSS на БЭМ. Начал делать для себя, но т.к. это оказалось удобно - решил сделать для сообщества. Портирована для тех, кто не хочет каждый раз настраивать анимации вручную.
Ссылка на GitHub с инструкцией по подключению.
Статус портирования
Перенесены все анимации из AnimateCSS, они доступны по модификатору type:
Например:
fadeInDown -> animate_type_fade-in-down
Дополнительно
В дополнение есть ещё несколько модификаторов:
animation_speed_{1,2,3,4,5}
- скорость анимации
animation_delay_{1,2,3,4,5}
- задержка анимации
animation_direction_{reverse,alternate,alternate-reverse}
- направление анимации
Благодарность
Спасибо @Flyer3d за помощь с портированием эффектов и также сообществу за голосование/обсуждение реализаций.
JS
На данной стадии JS блока есть только для bem-core@v4
. Позже появится для bem-core@v3
.
Сейчас JS позволяет менять модификаторы и вещает 3 вида событий: start, end, iteration
.
Чего ждать в ближайшем будущем?
Расширение API. Будут добавлены методы: queue, start, stop, pause, reset
Примерная реализация:
// Просто старт анимации
animation.start('fade-in-down');
// С передачей объекта с функциями обратного вызова
animation.start('fade-in-down', {
onStart: function() {},
onEnd: function() {},
onIteration: function() {}
});
// Простой обратный вызов по завершению
animation.start('fade-in-down', function () {
console.log('animation end')
});
// Простая очередь
animation.queue(['fade-in-down', 'flip-x', 'fade-out']);
// Очередь с обратным вызовом по завершению
animation.queue(['fade-in-down', 'flip-x', 'fade-out'], callback);
// Расширенные параметры для очередей
animation.queue([
{type: 'fade-in-down', onStart: callback, onEnd: callback},
{type: 'flip-x', onStart: callback, onEnd: callback},
{type: 'fade-out', onIteration: callback}
], callback);
Всем приятной разработки! :)
Жду комментариев и участия заинтересованных людей ;)
upd Спасибо @JiLiZART, добавил ещё несколько методов в планы :)
duration забыл же, сколько классу висеть на элементе когда он в очереди
@JiLiZART да, я не все параметры включил :) Набросал примерный вид API. Он может ещё кучу раз измениться.
В передаваемый объект можно будет добавить параметры:
speed, delay
и т.д.Нужно подумать над
speed/duration
, т.к. это взаимозаменяемые параметры.duration
по идее имеет более высокий приоритет, т.к. будет инлайниться, но может использоваться и как параметрspeed: {duration: 100}
а еще нехватает метода stop. чтобы убрать класс с блока и прекратить анимацию.
Добавил :)
Добавил метод .start()
API выглядит так .start(event, [callback,] [hide]) .start(event, [hide])
Данный метод автоматически показывает блок (теперь не нужно самостоятельно ставить display: block) и запускает анимацию.
callback может быть как функцией, так и объектом
{onStart: cb, onEnd: cb, onIteration: cb}
Т.к. некоторые анимации должны скрывать блок (display: none), то для этого предусмотрен флаг
hide
. Он говорит, что по завершению анимации блок должен быть скрыт.Примеры:
Ребят, проектирую API для очередей. Нужно ваше мнение. Удобно или нет?
.queue(queue [,callback][,hide])
Нашёл "баг" в AnimateCSS связанный с плохим именованием направлений анимаций... Просьба поддержать, т.к. в
bem-animations
планируется для людей сделать (а это уже ответвление от апстрима). :) https://github.com/daneden/animate.css/issues/648Добавил декларативный стиль для старта анимаций. Теперь можно устанавливать задержку и длительность прямо из JS.
Поле callbacks точно нужно? Нельзя on* сложить в корень?
@vithar общее/полное, на данный момент, API имеет такой вид:
можно вторым аргументом просто передать объект
Удобно ли тебе такое API?
upd
хотя сейчас начинаю думать, что действительно так будет лучше (перенести кэлбэки деклараций в корень)