Если вы ищете быструю и легкую анимационную библиотеку, 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, которая набирает обороты.
Основные функции аниме
Название аниме — японский для рисованной или компьютерной анимации (японский: ア ニ メ)
Что касается его особенностей, 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>
В качестве альтернативы вы можете использовать npm
bower
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
Свойство true
direction
normal
reverse
Это последнее значение чередуется между нормальным направлением анимации и его реверсом, что, кажется, отлично работает для прыгающего мяча.
Наконец, приведенный выше код определяет свойство 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
}
});
Клавиша scaleX
value
duration
Если вы проверяете код, используя ваши любимые инструменты разработчика браузера, вы увидите, как Anime анимирует элемент, внедряя встроенный delay
Анимация двух элементов подряд: удар по мячу
В приведенном ниже примере кода показан один способ последовательной анимации двух элементов, в данном случае двух изображений: вторая анимация начинается после завершения первой анимации.
<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()
kickBall
movingBall
Хотя репликация поведения кнопок воспроизведения и паузы выполняется быстро с использованием свойства 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
- Демоверсии и примеры на CodePen
- Codrops.net demo: вдохновение для буквенных эффектов
- Codrops.net Demo: эффект сегмента фона
- Codrops.net Демо: Fancy SVG Письмо Анимация
- Codrops.net Demo: многослойное слайд-шоу
- Демонстрация Codrops.net: Анимации с использованием SVG
Если вы использовали Anime.js и хотите поделиться своим опытом или предложить свою любимую библиотеку анимаций для этой серии, нажмите на поле комментария ниже со своим сообщением.