ПроКодинг - Откроем для вас мир IT!

Вы когда-нибудь замечали, как кнопка на сайте мягко подрагивает, когда вы наводите на неё курсор? Или как меню плавно выезжает сбоку, будто оно дышит? Это не волшебство - это 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: nonedisplay: 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: nonedisplay: 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, а понимать, где и зачем её применять. Анимация - не украшение. Это часть взаимодействия.