В этой статье мы изучим основы Anime.js и узнаем, как создавать анимацию с ключевыми кадрами (keyframe) и временными шкалами (timeline). Anime.js – это очень легкий движок анимации JavaScript, поддерживающий все современные браузеры. Для создания очень красивой анимации требуется всего пара строк JavaScript. Давайте посмотрим на пример и изучим основы Anime.js.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<style> .element { width:150px; height:150px; background-color:purple; margin:2em; } </style> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/animejs/2.2.0/anime.js"></script> <div class="element"></div> <script> const myAnime = anime({ targets: '.element', rotate: '2turn', duration: 3000, easing: 'linear', loop:true, autoplay: true, }); </script> |
В приведенном выше фрагменте сначала мы вызываем функцию anime и передаем ей простой объект JavaScript, определяющий нашу анимацию.
Объект анимации довольно понятен:
targets: сообщает anime, как найти элементы, которые мы хотим оживить. Вы можете использовать селекторы CSS или просто передать ему узел DOM. В приведенном выше примере мы просто используем селектор CSS для нацеливания на элемент с идентификатором .element
rotate: это одно из свойств, которое мы хотим оживить. Anime автоматически анимирует свойство вращения элемента на два оборота – ‘2turn’
duration: определяет продолжительность анимации в миллисекундах. В приведенном выше примере продолжительность анимации составляет
3000 миллисекунд, что эквивалентно 3 секундам.
easing: функции плавности сообщают Anime, как интерполировать значения transition. В приведенном выше примере мы говорим Anime вращать квадрат линейно. В аниме есть множество встроенных функций плавности. Вы можете найти их все на странице документации.
loop: используя свойство loop, мы можем повторить анимацию после ее завершения. В приведенном выше примере мы повторяем анимацию, устанавливая для свойства loop значение true.
Как видите, создавать анимацию с помощью Anime довольно просто. Теперь давайте посмотрим на другой пример и оживим несколько свойств:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<style> .element { width:50px; height:50px; background-color:dodgerblue; margin:3em; } </style> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/animejs/2.2.0/anime.js"></script> <div class="element"></div> <script> const myAnime = anime({ targets: '.element', scale: ['1','2','1'], translateX: ['0', '150px' ,'0'], duration: 4000, easing: 'easeInOutSine', loop:true, }); </script> |
В приведенном выше примере мы анимируем как scale, так и CSS-свойства translateX. Кроме того, мы устанавливаем начальное, конечное, начальное значения для translateX, используя массив с тремя значениями. Первое значение – это начальное значение, второе значение – конечное значение перехода. третье значение – опять начальное. Также стоит упомянуть, что мы указываем значения как строки с явными единицами пикселей. Вы можете использовать разные единицы измерения, но вам нужно будет использовать строку для явного задания значения и единицы, как в примере выше. И, наконец, для функции замедления мы используем одну из предопределенных функций easyInOutSine. Эта функция замедления очень распространена и приводит к очень плавному переходу между началом и концом.
Временная шкала аниме имеет очень простой API:
1 2 3 |
const tl = anime.timeline({ /* timeline свойств анимации */ }); |
Приведенный выше фрагмент создает пустую временную шкалу. Вы можете настроить временную шкалу, передав ей простой объект JavaScript, который определяет свойства duration, loop, easing, autoplay. Обратите внимание, что эти свойства будут применяться к каждой анимации, если они не будут перезаписаны каждой анимацией:
1 2 3 4 5 6 |
const tl = anime.timeline({ loop: true, autoplay: true, duration: 1000, easing: 'easeInOutSine', }); |
В приведенном выше фрагменте мы создали временную шкалу и настроили ее для автоматического воспроизведения более 1000 мс, а также настроили ее для использования функции замедления easyInOutSine. Обратите внимание, что эти настройки будут применяться к каждой добавляемой нами анимации, если мы не переопределим свойства в каждой анимации. Теперь мы собираемся использовать метод add и добавить несколько анимаций на нашу временную шкалу. Обратите внимание, что мы определяем анимацию, просто используя простые объекты, а не объекты анимации аниме:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<style> .rect { width:50px; height:50px; background-color:dodgerblue; margin:1em; } .circle{ width:50px; height:50px; border-radius:50%; background-color:yellowgreen; margin:1em; } </style> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/animejs/2.2.0/anime.js"></script> <div class="rect"></div> <div class="circle"></div> <script> const timeline = anime.timeline({ loop: true, autoplay: true, duration: 1000, easing: 'easeInOutSine', }); timeline.add({ targets: '.rect', translateX: 200, }) .add({ targets: '.circle', translateY: [-70, 100], easing: 'linear', duration: 1200, }); </script> |
В приведенном выше фрагменте первая анимация будет следовать «глобальным» настройкам временной шкалы. Но вторая анимация переопределяет свойства замедления и длительности.