Оригінальна публікація: How to Create Custom CSS Animations with Examples
Анімації є важливою складовою сучасного вебдизайну. Вони дозволяють створювати динамічні та захоплюючі вебелементи, які привертають більше клієнтів і збільшують обсяги продажів.
У цій статті ми розглянемо, як створити круті анімації за допомогою CSS.
Передумови
Перш ніж продовжити, переконайтеся, що у вас є базові знання HTML та CSS.
Я буду вважати, що ви знайомі з селекторами CSS, визначенням розміру та кольору елементів, позиціонуванням елементів, регулюванням прозорості та трансформацією елементів.
Як створити першу анімацію CSS
Розпочнемо з підготовки елемента HTML.
<body>
<div class="square"></div>
</body>
.square {
width: 100px;
height: 100px;
background-color: purple;
/* Центрування елемента */
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
Рядки 7-10 демонструють часто використовуваний метод центрування елемента за допомогою CSS. Ось результат такого коду:
Перш ніж створювати анімацію, потрібно подумати про те, якого ефекту ви хочете досягти.
Наприклад, для цього уроку я хочу створити ефект стрибка для квадрата. Це означає, що мені потрібно створити анімацію на основі властивості top
, щоб квадрат міг рухатися вгору та вниз.
@keyframes bounce {
0% {
top: 90%;
}
100% {
top: 10%;
}
}
Щоб визначити анімацію, потрібно використати правило @keyframes
, яке дозволяє визначити ключові кадри у процесі анімації.
Ключові кадри встановлюються з використанням значень у відсотках, починаючи від 0%
і закінчуючи 100%
. Наприклад, у прикладі анімація почнеться з top: 90%;
і закінчиться на top: 10%;
, після чого вона повернеться назад до 50%
.
І, звісно, потрібно пов’язати анімацію bounce
з квадратом (animation-name
) і повідомити браузеру, як довго має тривати ця анімація (animation-duration
). Ось як це робиться:
.square {
. . .
animation-name: bounce;
animation-duration: 2s;
}
Як додати декілька ключових кадрів
Але, як ви можете помітити, квадрат розташований знизу, рухається вгору, а потім повертається назад в центр. Це не зовсім ефект стрибка. Як можна зробити так, щоб квадрат рухався вниз?
Для цього можна налаштувати третій ключовий кадр:
@keyframes bounce {
0% {
top: 90%;
}
50% {
top: 10%;
}
100% {
top: 90%;
}
}
Таким чином, квадрат почне знизу (top: 90%;
), рухатиметься вгору (top: 10%;
), а потім повернеться вниз (top: 90%;
).
Як створити повторювану анімацію
Є одна проблема, яку потрібно розв’язати. Анімація відтворюється лише один раз. На практиці ви, можливо, хочете, щоб анімація повторювалась декілька разів, щоб створити ефект того, що квадрат дійсно скаче.
Замість того, щоб створювати більше ключових кадрів, що не так просто, ви можете визначити властивість animation-iteration-count
і вказати кількість разів, які ви хочете, щоб анімація повторювалась.
.square {
. . .
animation-name: bounce;
animation-duration: 2s;
animation-iteration-count: 5;
}
А якщо ви хочете, щоб анімація відтворювалась безкінечно, просто вкажіть infinite
.
.square {
. . .
animation-name: bounce;
animation-duration: 2s;
animation-iteration-count: infinite;
}
Як застосувати часову функцію до анімації
Ефект стрибка почав працювати, але його можна вдосконалити. Рух квадрата здається трошки неприроднім. Ефект стрибка виглядатиме краще, якщо ви згладите рух.
Це можна зробити за допомогою часової функції. За замовчуванням браузер надасть значення linear
, тобто анімація матиме однакову швидкість від початку до кінця. Але це можна змінити, використовуючи властивість animation-timing-function
:
.square {
. . .
animation-name: bounce;
animation-duration: 2s;
animation-iteration-count: infinite;
animation-timing-function: ease-in-out;
}
Вказавши ease-in-out
, ви повідомите браузеру починати анімацію повільно і закінчувати її поступово. В результаті анімація виглядатиме набагато плавніше.
Крива Безьє
Значення ease-in-out
фактично представляє математичне рівняння, відоме як крива Безьє. Я обійдусь без складних математичних визначень, а вам потрібно знати лише те, що функція визначає криву з чотирма контрольними точками.
cubic-bezier.com — це онлайн-інструмент, який дозволяє налаштувати криву, просто перетягуючи контрольні точки.
Контрольні точки визначають форму кривої, а нахил кривої контролює швидкість анімації. Наприклад, на графіку вище показано, що анімація почнеться повільно, прискориться, а потім закінчиться плавно.
.square {
. . .
animation-name: bounce;
animation-duration: 2s;
animation-iteration-count: infinite;
animation-timing-function: cubic-bezier(0.17, 0.67, 0.8, 0.36);
}
У більшості випадків вам не потрібно визначати власну криву Безьє. Існує декілька попередньо визначених кривих, яких достатньо для більшості випадків.
ease
представляє криву cubic-bezier(0.25, 0.1, 0.25, 1)
. Спочатку анімація повільно прискориться, а потім сповільниться до зупинки.
ease-in
представляє криву cubic-bezier(0.42, 0, 1, 1)
. Анімація розпочнеться плавно і потім зупиниться досить різко.
ease-out
представляє криву cubic-bezier(0, 0, 0.58, 1)
. Анімація розпочнеться різко і потім сповільниться, щоб плавно зупинитися.
ease-in-out
представляє криву cubic-bezier(0.42, 0, 0.58, 1)
. Анімація буде плавною як спочатку, так і вкінці.
Функція steps()
Окрім плавної кривої, ви можете вказати ступінчасту функцію. Функція steps()
приймає два аргументи. Перший вказує кількість кроків, а другий встановлює точку, де відбувається зміна: на початку (start
) або в кінці (end
) кроку.
.square {
. . .
animation-name: bounce;
animation-duration: 2s;
animation-iteration-count: infinite;
animation-timing-function: steps(5, start);
}
У цьому випадку анімація буде розділена на п’ять кроків, і для кожного кроку зміна відбудеться на початку.
Для функції steps()
існують два скорочення: step-start
відповідає steps(1, start)
, а step-end
відповідає steps(1, end)
.
Як поєднати декілька анімацій
Наразі ми розглянули всі основи, які варто знати для створення анімацій за допомогою CSS. Тепер прийшов час бути більш творчими.
Попередні приклади фокусувались на зміні властивості top
, щоб створити ефект стрибка. Фактично, ви можете комбінувати декілька властивостей в одній анімації. Наприклад, ви можете створити ефект пульса, змінивши форму і прозорість елемента.
@keyframes pulse {
0% {
transform: translate(-50%, -50%) scale(1);
opacity: 1;
}
50% {
transform: translate(-50%, -50%) scale(1.2);
opacity: 0.7;
}
100% {
transform: translate(-50%, -50%) scale(1);
opacity: 1;
}
}
.ball {
width: 100px;
height: 100px;
background-color: purple;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
animation: pulse 2s ease-in-out infinite;
}
Зверніть увагу, що властивості анімації можна об’єднати в скорочення за допомогою властивості animation
.
Інші властивості, пов’язані з анімацією
Крім властивостей анімації, про які ми говорили до цього, є декілька різних властивостей, які варто розглянути. Іноді вони також можуть бути корисними.
По-перше, є властивість animation-direction
, яка визначає, як буде відтворюватися анімація. Властивість приймає чотири різні значення:
normal
: анімація відтворюється з початку до кінця;reverse
: анімація відтворюється з кінця до початку;alternate
: спочатку анімація відтворюється з початку до кінця, а потім навпаки. Працює лише тоді, коли значенняanimation-iteration-count
більше за 1;alternate-reverse
: спочатку анімація відтворюється з кінця до початку, а потім навпаки.
За замовчуванням анімація почне відтворюватися одразу після завантаження сторінки. Проте це можна змінити за допомогою властивості animation-delay
, яка вказує, як довго ви хочете чекати, перш ніж анімація розпочнеться.
Властивість animation-fill-mode
визначає, як елемент буде відображатися перед та після відтворення анімації. За замовчуванням елемент не зберігатиме жодних стилів з анімації. Після завершення анімації елемент повернеться до нормального стану.
Якщо animation-fill-mode
встановлено на forwards
, елемент зберігатиме стилі з останнього ключового кадру анімації після її відтворення.
Якщо встановлено на backwards
, елемент прийматиме стилі з першого ключового кадру анімації, як тільки анімація відтвориться.
Якщо встановлено на both
, елемент зберігатиме стилі з першого ключового кадру перед початком анімації (подібно до backwards
), а також збереже стилі з останнього ключового кадру після завершення анімації (подібно до forwards
).
Висновок
Цей урок охопив все, що потрібно знати, перш ніж створювати анімації CSS за допомогою правила @keyframes
.
@keyframes pulse {
0% {
transform: translate(-50%, -50%) scale(1);
opacity: 1;
}
50% {
transform: translate(-50%, -50%) scale(1.2);
opacity: 0.7;
}
100% {
transform: translate(-50%, -50%) scale(1);
opacity: 1;
}
}
Ми також розглянули декілька властивостей CSS, пов’язаних з анімацією:
animation-duration
: визначає тривалість анімації;animation-iteration-count
: визначає кількість повторень анімації;animation-timing-function
: вказує часову функцію, яка контролює швидкість відтворення анімації;animation-direction
: напрямок відтворення анімації;animation-delay
: затримка перед початком анімації;animation-fill-mode
: чи слід зберігати стилі з анімації після завершення.
Для подальшого вивчення HTML та CSS рекомендую звернутися до циклу курсів -> HTML & CSS: A Practical Guide.