Статьи

Анимация DOM с помощью Anime.js

Anime.js Библиотека анимации

Если вы ищете быструю и легкую анимационную библиотеку, Anime.js от Julian Garnier — это вариант, который вы хотели бы рассмотреть.

Это первая из серии статей об инструментах для динамической DOM-анимации, включая SVG-графику. Я не планирую включать специализированные библиотеки анимации canvas-WebGL или SVG-специфичные библиотеки анимации. Однако, если библиотека отлично подходит для анимации элементов HTML на веб-странице (и в идеале также для графики SVG), я рассмотрю ее для включения в эту серию.

Я не собираюсь разбирать каждую библиотеку и углубляться в ее код. Вместо этого я собираюсь подойти к каждой библиотеке с точки зрения человека, который в основном работает с CSS, но хотел бы изучить, что может предложить JavaScript, когда дело доходит до анимации DOM. Поэтому я буду искать инструмент, который отлично справляется с манипулированием DOM путем динамического добавления и удаления стилей и / или классов CSS для анимации посредством синтаксиса, который кажется знакомым разработчику CSS.

Анимация в сети

Как объясняет Сара Драснер , когда речь идет о веб-анимации, полезно различать пользовательский интерфейс / анимацию пользовательского интерфейса и автономную анимацию .

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

UI / UX анимация предназначена для помощи пользователям в навигации по веб-сайту, поглощении информации на веб-странице или выполнении определенной задачи, например, подписке на новостную рассылку, добавлении товара в корзину и т. Д.

Напротив, автономная анимация это …

Используется для иллюстрации концепций в теле страницы, рядом или отдельно.

Сара Драснер — CSS слайды конференции

Вот удивительная демонстрация CodePen от Sarah, чтобы проиллюстрировать это.

Различие важно, потому что, когда вы анимируете пользовательские интерфейсы, ваша цель — помочь пользователям выполнять те задачи, которые направлены на достижение целей веб-сайта . Вместо этого, создавая отдельную анимацию, вы намерены максимально полно выразить определенную концепцию .

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

Зачем использовать JavaScript для анимации?

Сегодня CSS предлагает переходы и анимацию, чтобы добавить движение в сеть. Тем не менее, когда дело доходит до анимации в Интернете, JavaScript все еще является крупным игроком. Почему это так? Наконец, мы можем запустить анимацию, используя только CSS, с какой стати кому-то понадобится JavaScript для этой работы?

Чтобы помочь вам выбрать между анимацией CSS и JavaScript, рассмотрите следующие отличия от Rachel Nabors.

Анимация может быть:

  • статический : анимация проходит от начала до конца без логики принятия решения. Загрузчики CSS являются тому примером. Вы можете создать этот вид анимации только с помощью CSS;
  • Stateful : боковая панель, которая открывается и закрывается одним нажатием кнопки, является типичным примером этого типа анимации. Вы можете создать это с помощью CSS и чуть-чуть JavaScript, чтобы добавлять и удалять классы CSS, отвечающие за отслеживание состояния элемента в вашей анимации;
  • динамическая : у этого вида анимации могут быть разные результаты, которые зависят от различных факторов, таких как взаимодействие с пользователем, события DOM, состояние анимации других элементов в том же документе и т. д. Вы не можете создавать динамические анимации только с помощью CSS — в В этом контексте JavaScript, скорее всего, ваш лучший друг.

Помимо динамических анимаций, вы можете обратиться к JavaScript для помощи в ваших анимациях, если вы столкнетесь с одним из следующих обстоятельств:

  • вам нужно связать или разбить анимацию на несколько элементов. В этом случае каждая последующая анимация должна происходить после завершения предыдущей. Вы можете сделать это только с помощью CSS, координируя свойство delay Однако, если вам нужно изменить хотя бы одно значение, внесение необходимых изменений во все связанные элементы может быстро стать неуправляемым;
  • Вы анимируете графику SVG. В этом случае недостатком является то, что CSS-анимация в SVG не всегда поддерживается во всех браузерах ;
  • если ваш проект должен поддерживать старые браузеры, в которых CSS-анимация недоступна, использование надежного решения JavaScript сделает ваши анимации более доступными.

Если вы хотите прочитать больше на эту тему, Myth Busting: CSS-анимация против JavaScript от Джека Дойла, автора платформы анимации Greensock, поделился некоторыми хорошими замечаниями .

Восходящая альтернатива: API веб-анимации

W3C работает над спецификацией, которая объединяет анимацию CSS, SVG и JavaScript в едином языке без необходимости использования внешних библиотек JavaScript. API известен как веб-анимация и отлично работает для динамических анимаций, для которых CSS менее подходит. Вы можете прочитать это полезное введение в API веб-анимации (AAPI) Дадли Стори здесь на своей собственной SitePoint.

Работа над API веб-анимаций ведется устойчивыми темпами, и для браузеров, которые не предоставляют встроенную поддержку API, также доступно многозаполнение .

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

Библиотеки анимации для динамической анимации DOM

Существует широкий выбор библиотек анимации JavaScript, которые вы можете попробовать. На момент написания статьи GreenSock , также известный как GSAP (GreenSock Animation Platform), и Velocity.js были среди крупных игроков.

Оба являются фантастическими, удобными в использовании инструментами, и я расскажу о них в следующих статьях. Тем не менее, я хотел бы начать эту серию с Anime.js , новой библиотекой анимации JavaScript, которая набирает обороты.

Основные функции аниме

Название анимеяпонский для рисованной или компьютерной анимации (японский: ア ニ メ)

Логотип библиотеки анимации JavaScript Anime.js

Что касается его особенностей, Anime.js …

является гибкой, но легкой библиотекой анимации JavaScript. Он работает с CSS, индивидуальными преобразованиями, SVG, DOM-атрибутами и объектами JS.

Anime.js поддерживает следующие браузеры:

  • Хром
  • Сафари
  • опера
  • Fire Fox
  • Internet Explorer 10+

Со всеми доступными библиотеками анимации, почему аниме?

Ответ на этот вопрос лучше оставить автору Аниме, поскольку он объясняет, почему он придумал Anime.js, когда вокруг него что-то такое мощное, как GSAP:

GSAP может сделать намного больше, чем аниме. Но это также намного тяжелее. Моя цель с этой библиотекой состояла в том, чтобы максимально упростить API, сосредоточиться на том, что мне действительно нужно (многократные тайминги, упрощения, элементы управления воспроизведением…), при этом сохраняя сверхлегкий код (уменьшенный до 9 КБ).

Хакер Новости

Короче говоря, для динамической анимации элементов HTML и SVG, которые не требуют всех функций, которые GSAP и другие большие библиотеки предлагают из коробки, Anime.js может быть отличным вариантом для вашего проекта.

Как использовать Anime.js

Далее я предоставил несколько живых примеров для иллюстрации базового использования Anime.js. Большинство анимаций будет работать медленно в демонстрационных целях.

Включение Anime.js не отличается от включения jQuery или любой другой знакомой библиотеки JavaScript.

Загрузите файл .zip со страницы проекта библиотеки на GitHub , распакуйте файлы и добавьте anime.min.js<script>html

 <script src="anime.min.js"></script>

В качестве альтернативы вы можете использовать npmbower

 npm install animejs
 bower install animejs

Добавление одной анимации к одному элементу: прыгающий шар

После того, как вы настроили Anime в своем проекте, вы можете начать с самого простого вида анимации: всего один элемент, шар, подпрыгивая вверх и вниз.

Первый шаг — вызвать anime Вот основная структура:

 var bouncingBall = anime({

  //code here
	
});

Затем вам нужно уточнить объект выше с некоторыми инструкциями о том, что анимировать, вид анимации, ее продолжительность и т. Д.

 var bouncingBall = anime({
  targets: '.ball',
  translateY: '50vh',
  duration: 300,
  loop: true,
  direction: 'alternate',
  easing: 'easeInCubic'
});

Свойство targets Здесь вы можете использовать селектор CSS, как я делал в приведенном выше примере, или любой из следующих:

  • Элемент DOM, например, document.querySelector('.ball')
  • Нодлист, например, document.querySelectorAll('.ball')
  • Объект JavaScript, например, {elementName: 'ball'}
  • Массив JavaScript, например, ['.ball']

Если ваше свойство targets

 var bouncingBall = anime({
  targets: ['.ball', '.kick'],
  //rest of the code
});

Второе свойство в приведенном выше примере перемещает элемент ball вертикально с translateY Тиффани Браун и другие рекомендуют использовать перемещение и translate Это помогает повысить производительность и качество анимации, избегая перекомпоновки браузера .

Следующим в списке свойств в приведенном выше фрагменте анимации является свойство scale Это говорит Аниме, как долго вы хотите, чтобы анимация длилась. Если у вас есть несколько анимаций, происходящих в разное время, duration

Свойство delay Его значение по умолчанию — loop Вы можете запустить анимацию на неопределенный срок, изменив это значение на false

Свойство truedirectionnormalreverse Это последнее значение чередуется между нормальным направлением анимации и его реверсом, что, кажется, отлично работает для прыгающего мяча.

Наконец, приведенный выше код определяет свойство alternate Является ли скорость изменения постоянной? Возможно, анимация начинается медленно и ускоряется к концу? Есть ли отскок в финальной части? Правильное значение ослабления является ключевым элементом отлаженной и эффективной анимации.

Вы можете узнать все функции замедления, которые вы можете использовать с Anime, с помощью этого простого фрагмента:

 easing

Добавление второй анимации к прыгающему мячу

Допустим, вы хотите, чтобы прыгающий мяч немного сдавился, когда он достигнет дна контейнера. Вы можете сделать это с помощью Anime, добавив определенные параметры анимации в виде объекта JavaScript. Используя пример прыгающего мяча, вот как вы можете достичь желаемого эффекта:

 console.log(anime.easings);

Приведенный выше код добавляет новое свойство var bouncingBall = anime({
targets: '.ball',
translateY: '50vh',
duration: 300,
loop: true,
direction: 'alternate',
easing: 'easeInCubic',
//new code
scaleX: {
value: 1.05,
duration: 150,
delay: 268
}
});
литерала объекта с конкретными ключами, которые можно использовать для управления анимацией.

Клавиша scaleXvalueduration

Если вы проверяете код, используя ваши любимые инструменты разработчика браузера, вы увидите, как Anime анимирует элемент, внедряя встроенный delay

Как Anime.js обновляет DOM

Анимация двух элементов подряд: удар по мячу

В приведенном ниже примере кода показан один способ последовательной анимации двух элементов, в данном случае двух изображений: вторая анимация начинается после завершения первой анимации.

 <style>

Мяч оживляется только после того, как его пнули. С Anime.js вы можете разбивать анимацию с помощью метода var kickBall = anime({
targets: '.kick',
scale: 1.2,
duration: 300,
easing: 'easeInCubic',
complete: function() {
anime({
targets: '.ball',
translateX: '70vw',
scale: 1.5,
easing: 'easeOutBounce',
delay: 150
});
}
});

Изображение предоставлено Pixabay.com

Конечно, требуется несколько ключевых кадров и причудливая кубическая функция Безье, чтобы быстро приблизить этот вид статической анимации в CSS. В этом случае вам вообще не понадобится JavaScript, и в итоге вы получите плавную анимацию, которая изначально запускается в браузере.

Вот демонстрация только для CSS:

Воспроизведение, приостановка и перезапуск анимации

Anime.js позволяет вам контролировать время воспроизведения, остановки и перезапуска анимации с помощью complete().play().pause() Вы также можете найти конкретную точку в ходе анимации с помощью .restart()

Например, вот как вы можете управлять анимацией удара мяча с помощью кнопки воспроизведения.

 .seek()

Несколько замечаний о фрагменте выше:

  • чтобы иметь возможность контролировать удар и мяч с помощью кнопки, я создал два отдельных объекта. Я мог бы разместить анимацию шара внутри анимации удара, но мой опыт показал, что кнопка может управлять только основной анимацией, т. Е. Ударом, а не вложенной;
  • чтобы предотвратить запуск анимации при загрузке страницы, необходимо установить для //Animating the kick
    var kickBall = anime({
    targets: '.kick',
    scale: 1.2,
    duration: 300,
    delay: 100,
    easing: 'easeInCubic',
    autoplay: false
    });

    //Animating the ball
    var movingBall = anime({
    targets: '.ball',
    translateX: '70vw',
    scale: 1.5,
    easing: 'easeOutBounce',
    delay: kickBall.duration + 100,
    autoplay: false
    });

    /* Playing the animation
    when clicking the play button */

    btnPlay.addEventListener('click', function(e) {
    e.preventDefault();
    kickBall.play();
    movingBall.play();
    });

    autoplay

  • наконец, это просто вопрос вызова false.play()kickBallmovingBall

Хотя репликация поведения кнопок воспроизведения и паузы выполняется быстро с использованием свойства CSS animation-play-state и небольшого кусочка JavaScript, этого не произойдет, если вы захотите перезапустить анимацию после ее завершения или восстановить точную точку вдоль его курса.

Анимация встроенных атрибутов SVG с помощью Anime.js

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

Демонстрация использует CSS-классы на различных путях и формах, которые составляют SVG-графику, так что их легко нацелить в коде.

Вот как вы можете оживить глаза кошки:

 var movingEyes = anime({
  targets: ['.inner-left-eye', '.inner-right-eye'],
  cy: 400,
  duration: 500,
  delay: function(el, index) {
    var singleDelay = index === 0 ? 300 : index * 500;
    return singleDelay;
  },
  autoplay: false
});

Приведенный выше код опускает глаза кошки, изменяя значение атрибута cy

Если вы заметили, глаза двигаются подряд. Я сделал это специально, чтобы показать вам еще один крутой способ, с помощью которого вы можете создавать анимацию с помощью Anime.js. Свойство delay Когда вы используете функцию, как в приведенном выше коде, вы программно контролируете время запуска анимации. Функция сообщает Anime, что если элемент, который вы хотите анимировать, является первым (в позиции 0 в массиве targets

SVG графика адаптирована из оригинала на Pixabay.com

Вывод

Я открыл эту статью с кратким обзором того, как анимация используется в Интернете, после чего последовало обсуждение того, когда можно рассмотреть JavaScript в сравнении с CSS для анимации, и краткую ссылку на API веб-анимации.

Я также представил Anime.js, первую библиотеку анимации в этой серии, проиллюстрировав некоторые из ее функций и заставив работать на CodePen.

В целом, мне было интересно работать с Anime.js: его функции охватывают значительное количество вариантов использования, его синтаксис довольно прост и позволяет создавать плавные, красивые анимационные эффекты.

Для тех, кто впервые обращается к нему, я должен сказать, что файл README.md на GitHub — единственная документация, доступная на данный момент.

Тем не менее, вы можете найти отличные ответы на некоторые из ваших вопросов в разделе проблем GitHub проекта , который, кажется, внимательно отслеживается создателем Anime Джулианом Гарнье.

Кроме того, вы можете узнать больше о том, как использовать библиотеку, углубившись в код некоторых удивительных демонстраций, которые используют Anime в качестве движка анимации:

Если вы использовали Anime.js и хотите поделиться своим опытом или предложить свою любимую библиотеку анимаций для этой серии, нажмите на поле комментария ниже со своим сообщением.