Найти в Дзене
FrontEnd учебник

🎬 Волшебство движения: Полный гид по CSS и JavaScript анимациям

Представьте: вы заходите на сайт, и элементы плавно появляются, кнопки реагируют на ваши движения, страница "оживает" под курсором. Это не магия — это анимации, и сегодня я покажу, как создать их своими руками! Факт: Анимированные интерфейсы увеличивают вовлечённость на 70%! Самый простой способ анимации — плавное изменение свойств элемента. .button {
background-color: blue;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: red; /* Плавно станет красной за 0.3 сек */
} /* Цвета */
transition: color 0.3s, background-color 0.5s;
/* Размеры */
transition: width 0.4s, height 0.4s;
/* Положение */
transition: transform 0.3s;
/* Прозрачность */
transition: opacity 0.5s;
/* Тени и границы */
transition: box-shadow 0.3s, border 0.3s; transition: [свойство] [длительность] [функция] [задержка];
/* Примеры: */
transition: all 0.5s ease-in-out;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) 0.1s; linear → постоянная скорость
ease
Оглавление

Представьте: вы заходите на сайт, и элементы плавно появляются, кнопки реагируют на ваши движения, страница "оживает" под курсором. Это не магия — это анимации, и сегодня я покажу, как создать их своими руками!

🌟 Зачем нужны анимации?

Не просто "красиво":

  • Улучшают UX — направляют внимание пользователя
  • Обратная связь — кнопка нажата, форма отправлена
  • Скрывают загрузку — лоадеры вместо пустого экрана
  • Создают настроение — брендинг через движение

Факт: Анимированные интерфейсы увеличивают вовлечённость на 70%!

🎨 Тип 1: CSS Transition — плавные переходы

Что это?

Самый простой способ анимации — плавное изменение свойств элемента.

.button {
background-color: blue;
transition: background-color 0.3s ease;
}

.button:hover {
background-color: red; /* Плавно станет красной за 0.3 сек */
}

Что можно анимировать?

/* Цвета */
transition: color 0.3s, background-color 0.5s;

/* Размеры */
transition: width 0.4s, height 0.4s;

/* Положение */
transition: transform 0.3s;

/* Прозрачность */
transition: opacity 0.5s;

/* Тени и границы */
transition: box-shadow 0.3s, border 0.3s;

Формула длительности:

transition: [свойство] [длительность] [функция] [задержка];

/* Примеры: */
transition: all 0.5s ease-in-out;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) 0.1s;

Функции времени (timing functions):

linear → постоянная скорость
ease ← по умолчанию (медленно-быстро-медленно)
ease-in → медленный старт
ease-out → медленное завершение
ease-in-out → медленный старт и завершение
cubic-bezier() → полный контроль над кривой

🎯 Практика: Создаём кнопку с hover-эффектом

.btn-magic {
padding: 12px 24px;
background: #4f46e5;
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

.btn-magic:hover {
background: #7c3aed;
transform: translateY(-2px);
box-shadow: 0 10px 20px rgba(124, 58, 237, 0.3);
}

.btn-magic:active {
transform: translateY(0);
box-shadow: 0 5px 10px rgba(124, 58, 237, 0.2);
}

Тип 2: CSS Animation — сложные последовательности

Когда использовать:

  • Бесконечные анимации (лоадеры)
  • Сложные последовательности
  • Анимации по времени, а не по действию

Два шага для создания:

Шаг 1: Определяем ключевые кадры

@keyframes slideIn {
from {
transform: translateX(-100%);
opacity: 0;
}

to {
transform: translateX(0);
opacity: 1;
}
}

/* Или с процентами: */
@keyframes bounce {
0% {
transform: translateY(0);
}
50% {
transform: translateY(-20px);
}
100% {
transform: translateY(0);
}
}

Шаг 2: Применяем анимацию к элементу

.element {
animation: slideIn 0.8s ease-out;
}

/* Полный синтаксис: */
animation: [имя] [длительность] [функция] [задержка]
[количество] [направление] [заполнение] [состояние];

Параметры анимации:

/* Количество повторений */
animation-iteration-count: 3; /* ровно 3 раза */
animation-iteration-count: infinite; /* бесконечно */

/* Направление */
animation-direction: normal; /* 0% → 100% */
animation-direction: reverse; /* 100% → 0% */
animation-direction: alternate; /* туда-обратно */

/* Состояние после завершения */
animation-fill-mode: none; /* вернуться к началу */
animation-fill-mode: forwards; /* остаться в конце */

/* Пауза/воспроизведение */
animation-play-state: running; /* играет */
animation-play-state: paused; /* на паузе */

🎯 5 готовых анимаций для ваших проектов:

1. Появление элемента (Fade In)

@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}

.fade-in {
animation: fadeIn 0.6s ease-out;
}

2. Пульсация (для уведомлений)

@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}

.pulse {
animation: pulse 2s infinite;
}

3. Вращающийся лоадер

@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}

.loader {
border: 3px solid #f3f3f3;
border-top: 3px solid #3498db;
border-radius: 50%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
}

4. "Шейк" при ошибке

@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
20%, 40%, 60%, 80% { transform: translateX(5px); }
}

.shake {
animation: shake 0.5s;
}

5. Параллакс-эффект

@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-20px); }
}

.floating-element {
animation: float 3s ease-in-out infinite;
}

Тип 3: JavaScript анимации — полный контроль

Когда нужен JavaScript:

  • Сложная логика (зависимость от скролла, ввода)
  • Интерактивные анимации (перетаскивание)
  • Анимации Canvas/SVG
  • Когда нужна высокая производительность (WebGL)

Библиотеки, которые упрощают жизнь:

1. GSAP (GreenSock) — профессиональный инструмент

// Установка: npm install gsap

import gsap from 'gsap';

// Простая анимация
gsap.to('.box', {
duration: 1,
x: 100, // переместить на 100px вправо
rotation: 360,
ease: "power2.out"
});

// Последовательность
const tl = gsap.timeline();
tl.to('.element1', { x: 100, duration: 1 })
.to('.element2', { y: 50, duration: 0.5 }, "-=0.5") // перекрытие
.to('.element3', { opacity: 0, duration: 0.3 });

// Анимация по скроллу
gsap.to('.parallax', {
scrollTrigger: {
trigger: '.container',
start: "top top",
end: "bottom center",
scrub: true
},
y: -100
});

2. Anime.js — лёгкий и мощный

anime({
targets: '.element',
translateX: 250,
rotate: '1turn',
backgroundColor: '#FFF',
duration: 2000,
loop: true,
direction: 'alternate'
});

3. Framer Motion (для React)

import { motion } from 'framer-motion';

const Component = () => (
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5 }}
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
>
Интерактивный элемент
</motion.div>
);

🎯 Практический пример: Интерактивная карточка

// CSS
.card {
transition: transform 0.3s;
cursor: pointer;
}

// JavaScript
const cards = document.querySelectorAll('.card');

cards.forEach(card => {
card.addEventListener('mouseenter', () => {
card.style.transform = 'rotateY(10deg) scale(1.05)';
});

card.addEventListener('mouseleave', () => {
card.style.transform = 'rotateY(0) scale(1)';
});

card.addEventListener('click', () => {
card.style.transition = 'all 0.5s';
card.style.transform = 'scale(0.9) rotateY(180deg)';

setTimeout(() => {
card.style.transform = 'scale(1) rotateY(0)';
}, 300);
});
});

🎮 Тип 4: SVG анимации — векторная магия

Анимируем иконки и графику:

<svg width="100" height="100">
<circle cx="50" cy="50" r="40" stroke="#4f46e5" stroke-width="3" fill="none">
<animate
attributeName="r"
from="20" to="40"
dur="1s"
repeatCount="indefinite"
calcMode="spline"
keySplines="0.1 0.8 0.2 1;"
/>
</circle>
</svg>

CSS для SVG:

/* Анимация пути */
.path {
stroke-dasharray: 1000;
stroke-dashoffset: 1000;
animation: draw 3s ease forwards;
}

@keyframes draw {
to {
stroke-dashoffset: 0;
}
}

📱 Тип 5: Микроанимации — маленькие, но важные

Примеры для улучшения UX:

/* 1. Плавный скролл */
html {
scroll-behavior: smooth;
}

/* 2. Анимация placeholder'а */
.input-field:focus::placeholder {
transform: translateX(10px);
opacity: 0.5;
transition: all 0.3s;
}

/* 3. Анимация появления tooltip */
.tooltip {
opacity: 0;
transition: opacity 0.2s, transform 0.2s;
}

.element:hover .tooltip {
opacity: 1;
transform: translateY(-5px);
}

🚀 Практика: Создаём анимированный лендинг

HTML структура:

<!DOCTYPE html>
<html lang="ru">
<head>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="fade-in">
<h1>Добро пожаловать!</h1>
</header>

<main>
<section class="slide-in">
<h2>Наши услуги</h2>
<div class="services">
<div class="service-card hover-lift">Дизайн</div>
<div class="service-card hover-lift">Разработка</div>
<div class="service-card hover-lift">Маркетинг</div>
</div>
</section>

<button class="cta-button pulse-on-hover">
Начать работу
</button>
</main>

<div class="loader" id="loader"></div>

<script src="animations.js"></script>
</body>
</html>

CSS стили:

/* Базовые анимации */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}

@keyframes slideInLeft {
from {
transform: translateX(-50px);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}

@keyframes lift {
0% { transform: translateY(0); }
100% { transform: translateY(-10px); }
}

/* Применение анимаций */
.fade-in {
animation: fadeIn 1s ease-out;
}

.slide-in {
animation: slideInLeft 0.8s ease-out;
}

.hover-lift {
transition: transform 0.3s;
}

.hover-lift:hover {
animation: lift 0.3s forwards;
}

.pulse-on-hover:hover {
animation: pulse 0.5s;
}

/* Лоадер */
.loader {
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
width: 50px;
height: 50px;
animation: spin 2s linear infinite;
display: none;
}

JavaScript логика:

// Показываем лоадер при загрузке
window.addEventListener('load', () => {
const loader = document.getElementById('loader');
loader.style.display = 'block';

setTimeout(() => {
loader.style.display = 'none';
// Запускаем анимацию элементов после загрузки
document.querySelectorAll('.service-card').forEach((card, index) => {
setTimeout(() => {
card.classList.add('bounce');
setTimeout(() => card.classList.remove('bounce'), 1000);
}, index * 200);
});
}, 2000);
});

// Анимация кнопки CTA
const ctaButton = document.querySelector('.cta-button');
ctaButton.addEventListener('click', function() {
this.style.animation = 'none';
setTimeout(() => {
this.style.animation = '';
}, 10);

// Добавляем эффект "пузыря"
this.classList.add('clicked');
setTimeout(() => this.classList.remove('clicked'), 300);
});

Производительность: Делаем анимации быстрыми

Чек-лист оптимизации:

/* ✅ ХОРОШО — анимируем эти свойства */
transform: translate(), scale(), rotate();
opacity: 0.5;
filter: blur(), brightness();

/* ❌ ПЛОХО — избегаем анимации этих свойств */
width: 100px; /* вызывает перерасчёт layout */
height: 100px;
margin: 10px;
padding: 10px;
left: 10px; /* используйте transform вместо left/top */

Быстрый рецепт:

.fast-animation {
/* GPU ускорение */
transform: translateZ(0);
will-change: transform, opacity;

/* Отключить antialiasing для движения */
-webkit-font-smoothing: antialiased;
}

🛠 Инструменты для работы

Для прототипирования:

  1. Codepen / JSFiddle — онлайн-песочницы
  2. Figma + Lottie — дизайн → код
  3. Rive — интерактивные анимации

Для отладки:

  1. Chrome DevTools → Animations panel
  2. Firefox DevTools → Animation inspector

Готовые решения:

  1. Animate.css — набор CSS-анимаций
  2. Hover.css — эффекты при наведении
  3. Magic Animations — необычные эффекты

💡 Золотые правила анимаций

  1. Быстро начинай, медленно заканчивай — ease-out для лучшего восприятия
  2. Длительность 200-500мс — дольше только для важных переходов
  3. Согласованность — все анимации в одном стиле
  4. Осмысленность — каждая анимация должна иметь цель
  5. Доступность — prefers-reduced-motion для чувствительных пользователей
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms
!important;
animation-iteration-count: 1
!important;
transition-duration: 0.01ms
!important;
}
}

🚀 Ваш первый проект

Задание: Создайте страницу с:

  1. Заголовком, который плавно появляется
  2. Тремя карточками с hover-эффектом
  3. Кнопкой, которая "пульсирует" при наведении
  4. Лоадером, который исчезает через 2 секунды

Бонус: Добавьте анимацию при скролле — элементы появляются при прокрутке.

P.S. Запомните

Анимации — как специи в кулинарии: немного улучшает, слишком много — портит. Начните с малого, тестируйте на реальных пользователях и помните: лучшая анимация та, которую не замечают, но которая улучшает опыт.

Ваш код сегодня:

/* Просто начните */
.element {
transition: transform 0.3s;
}

.element:hover {
transform: scale(1.05);
}

Завтра вы сможете создавать целые анимированные миры! 🌟

#анимации #css #javascript #frontend #webdev #ui #ux #вебразработка