Вы когда-нибудь замечали, как кнопка на сайте мягко подрагивает, когда вы наводите на неё курсор? Или как меню плавно выезжает сбоку, будто оно дышит? Это не волшебство - это CSS-анимации и переходы. Они делают интерфейсы живыми, интуитивными и приятными. И да, вы можете делать это сами - без JavaScript, без сложных библиотек, просто с помощью чистого CSS.
Чем transition отличается от animation
Первое, что нужно понять: transition и animation - это не одно и то же. Transition - это реакция на изменение. Он работает только между двумя состояниями: когда вы наводите курсор на кнопку, или когда элемент получает фокус. Например, вы хотите, чтобы цвет фона кнопки менялся с синего на красный. Transition просто плавно перетекает из одного в другое. Он не создаёт сложных движений - он лишь сглаживает переход.
А animation - это полноценная сцена. Вы сами пишете, что происходит в каждый момент времени. С помощью @keyframes вы определяете, как элемент должен выглядеть в 0%, 25%, 50%, 75% и 100% времени анимации. Это позволяет делать вращения, прыжки, пульсации - всё, что требует нескольких этапов. Transition - это мимолётный отклик. Animation - это целый спектакль.
Как сделать плавный переход (transition)
Всё начинается с простого:
button {
background-color: #007bff;
transition: background-color 0.3s ease;
}
button:hover {
background-color: #dc3545;
}
Здесь вы говорите: «Когда background-color меняется - делай это плавно, 0.3 секунды, с лёгким замедлением в начале и конце (ease)». Можно анимировать сразу несколько свойств:
transition: background-color 0.3s ease, transform 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
Почему это важно? Потому что если вы просто поменяете цвет без transition, пользователь увидит резкий скачок - это раздражает. А с transition он чувствует, что интерфейс «отвечает» ему, а не просто реагирует.
Важно: transition работает только с анимируемыми свойствами. Например, вы не можете анимировать display: none → display: block. Вместо этого используйте opacity: 0 и visibility: hidden - они отлично анимируются.
Создаём пульсирующую кнопку с @keyframes
Пульсация - один из самых распространённых паттернов. Она подсказывает пользователю: «Эта кнопка важна, обратите внимание». Вот как её сделать:
@keyframes pulse {
0%, 100% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
}
.pulse-button {
animation: pulse 2s infinite ease-in-out;
}
Здесь мы говорим: «Каждые 2 секунды повторяй эту анимацию бесконечно». На 0% и 100% кнопка нормального размера, а на 50% - слегка увеличивается. Эффект получается естественным, как дыхание. Используйте ease-in-out - он мягче, чем linear.
Этот паттерн отлично работает для кнопок «Забронировать», «Связаться», «Купить сейчас». Главное - не переборщить. Если все кнопки пульсируют, пользователь перестаёт замечать их.
Эффект появления (fade-in)
Когда страница загружается, элементы не должны просто «выскакивать». Они должны появляться плавно - как будто свет постепенно включается.
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.section {
animation: fadeIn 0.8s ease-out 0.3s forwards;
}
Здесь мы делаем два движения: сначала элемент находится ниже на 30 пикселей и прозрачный, потом плавно поднимается и становится видимым. forwards означает, что после анимации элемент останется в конечном состоянии - не вернётся обратно.
Это особенно важно для мобильных интерфейсов. Пользователь ждёт, когда загрузится контент. Анимация даёт ему ощущение, что всё происходит вовремя - даже если загрузка заняла 1.2 секунды, он не чувствует задержки.
Анимация при наведении: квадрат → круг → поворот
Вот классный пример, который сразу бросается в глаза:
.hover-box {
width: 100px;
height: 100px;
background: #333;
border-radius: 0;
transition: all 0.5s ease;
}
.hover-box:hover {
border-radius: 50%;
transform: rotate(45deg);
background: #e83e8c;
}
При наведении квадрат превращается в круг, меняет цвет и поворачивается. Это не просто «весело» - это создаёт ощущение отзывчивости. Пользователь думает: «О, это реагирует!». И именно это делает интерфейс запоминающимся.
Обратите внимание: мы используем transition: all - это удобно для прототипирования. Но в продакшене лучше указывать конкретные свойства: border-radius, transform, background. Так вы избежите непредвиденных анимаций, например, если вдруг изменится font-size или padding.
Как анимировать несколько эффектов одновременно
Вы можете применить к одному элементу сразу несколько анимаций. Например, фон пульсирует, а иконка вращается:
.icon-button {
animation: pulse 2s infinite ease-in-out, rotate 3s linear infinite;
}
Здесь две анимации работают параллельно. Первая - пульсация, вторая - постоянное вращение. Они не мешают друг другу. Можно даже добавить задержку:
animation: pulse 2s infinite ease-in-out, rotate 3s linear 1s infinite;
Вращение начнётся через 1 секунду после загрузки - это создаёт эффект «нарастания»: сначала кнопка пульсирует, потом начинает вращаться. Такой подход отлично подходит для загрузочных экранов или приглашений к действию.
Что нельзя анимировать в CSS
CSS-анимации мощные, но у них есть границы. Вот что не работает:
- Плавное изменение
display: none→display: block - Изменение
height: autoна конкретное значение - Анимация
z-index- он не поддерживает градиенты - Изменение
overflowилиposition
Вместо display: none используйте opacity: 0 + visibility: hidden + pointer-events: none. Это позволяет анимировать прозрачность, а потом скрыть элемент без анимации.
Если нужно анимировать высоту - задайте конкретное значение, например height: 200px, а не auto. Или используйте max-height с большим значением, чтобы имитировать раскрытие.
Практические советы для реальных проектов
- Не анимируйте всё. Анимации должны подчёркивать важное - а не отвлекать. Если вы анимируете 10 элементов на странице, пользователь не заметит ни одного.
- Используйте
prefers-reduced-motionдля доступности. Некоторые пользователи испытывают головокружение от анимаций. Добавьте:
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
- Тестируйте на медленных устройствах. На старом телефоне анимация с
cubic-bezierможет тормозить. Простыеeaseиlinearработают стабильнее. - Используйте
will-changeдля сложных трансформаций. Например, если элемент часто вращается:
.rotating-icon {
will-change: transform;
}
Это подсказывает браузеру: «Этот элемент будет часто меняться - заранее подготовь его для анимации».
Почему это работает в реальности
В Казани, где я живу, мы часто видим сайты, которые выглядят как будто сделаны в 2010 году: всё статично, никаких эффектов. Но те, кто использует CSS-анимации - даже простые - получают на 20-30% больше кликов на кнопках. Почему? Потому что люди не просто смотрят на интерфейс. Они чувствуют его. Анимация - это невербальный диалог: «Я здесь. Я готов. Давай начнём».
Вот почему важно не просто знать, как написать @keyframes, а понимать, где и зачем её применять. Анимация - не украшение. Это часть взаимодействия.