Анимации, переходы и трансформации
Разработчику
Аналитику
Тестировщику
Архитектору
Инженеру
Анимации и трансформации
Эти свойства позволяют делать веб-страницу динамичной — добавлять движение, плавные переходы и визуальные эффекты.
animation в CSS
animation — это составное свойство CSS, которое применяет заранее определённую анимацию к элементу. Анимация описывается с помощью правила @keyframes, где задаются ключевые моменты (кадры) изменения стилей во времени.
Синтаксис
Базовый синтаксис:
selector {
animation: [name] [duration] [timing-function] [delay] [iteration-count] [direction] [fill-mode] [play-state];
}
Порядок значений важен. Некоторые значения можно опускать, тогда будут использоваться значения по умолчанию.
Параметры
name
Имя анимации, определённой через @keyframes.
@keyframes fadeIn { /* ... */ }
.element { animation-name: fadeIn; }
duration
Продолжительность одного цикла анимации. Указывается в секундах (s) или миллисекундах (ms).
Значение по умолчанию: 0s (анимация не видна).
animation-duration: 1.5s;
timing-function
Функция плавности (easing), определяющая скорость изменения анимации во времени.
Значение по умолчанию: ease.
Возможные значения:
linear— равномерная скорость;ease— медленно в начале и конце, быстро в середине;ease-in— медленно в начале;ease-out— медленно в конце;ease-in-out— медленно в начале и в конце;cubic-bezier(x1, y1, x2, y2)— кастомная кривая Безье.
animation-timing-function: ease-in-out;
delay
Задержка перед началом анимации. Может быть отрицательной.
Значение по умолчанию: 0s.
animation-delay: 0.5s;
iteration-count
Сколько раз повторять анимацию.
Значение по умолчанию: 1.
Возможные значения:
- число (
3,5.5); infinite— бесконечное повторение.
animation-iteration-count: infinite;
direction
Направление воспроизведения анимации.
Значение по умолчанию: normal.
Возможные значения:
normal— проигрывание от0%к100%;reverse— проигрывание от100%к0%;alternate— чётные циклы в прямом направлении, нечётные — в обратном;alternate-reverse— наоборот: чётные — в обратном, нечётные — в прямом.
animation-direction: alternate;
fill-mode
Определяет, как элемент выглядит до и после выполнения анимации.
Значение по умолчанию: none.
Возможные значения:
none— стили применяются только во время анимации;forwards— после завершения анимации сохраняется стиль последнего кадра;backwards— до начала анимации применяется стиль первого кадра (учитываяdelay);both— комбинацияforwardsиbackwards.
animation-fill-mode: forwards;
play-state
Управление воспроизведением анимации.
Значение по умолчанию: running.
Возможные значения:
running— анимация воспроизводится;paused— анимация приостановлена.
animation-play-state: paused;
Определение анимации: @keyframes
Правило @keyframes задаёт последовательность стилей для анимации.
Синтаксис
@keyframes animation-name {
from { /* начальные стили */ }
to { /* конечные стили */ }
}
Или с использованием процентов:
@keyframes animation-name {
0% { /* начальные стили */ }
50% { /* промежуточные стили */ }
100% { /* конечные стили */ }
}
Ключевые слова from и to эквивалентны 0% и 100%.
Примеры
Пример 1: Простой слайд
@keyframes slide {
from { transform: translateX(0); }
to { transform: translateX(100px); }
}
.box {
animation: slide 2s ease-in-out 0.2s infinite alternate;
}
Разбор:
- имя:
slide - длительность:
2s - функция:
ease-in-out - задержка:
0.2s - повтор:
infinite - направление:
alternate
Пример 2: Пульсация прозрачности
@keyframes pulse {
0% { opacity: 1; }
50% { opacity: 0.3; }
100% { opacity: 1; }
}
.fade-element {
animation: pulse 1.2s infinite;
}
Пример 3: Вращение с паузой
@keyframes spin {
to { transform: rotate(360deg); }
}
.spinner {
animation: spin 1s linear infinite;
}
.spinner:hover {
animation-play-state: paused;
}
Пример 4: Анимация с финальным состоянием
@keyframes expand {
to { width: 200px; background-color: green; }
}
.grower {
width: 50px;
background-color: red;
animation: expand 1.5s forwards;
}
После завершения анимации элемент остаётся шириной 200px и зелёного цвета благодаря forwards.
Отдельные свойства
Если нужно контролировать каждый параметр отдельно, можно использовать длинную форму:
.element {
animation-name: bounce;
animation-duration: 1s;
animation-timing-function: ease-out;
animation-delay: 0s;
animation-iteration-count: 3;
animation-direction: normal;
animation-fill-mode: none;
animation-play-state: running;
}
transform в CSS
transform — это свойство CSS, которое применяет геометрические преобразования к элементу: перемещение, поворот, масштабирование, наклон и другие трансформации. Эти изменения не влияют на поток документа: соседние элементы продолжают вести себя так, будто трансформированный элемент остаётся на своём исходном месте.
Синтаксис
selector {
transform: <transform-function> [<transform-function>]* | none;
}
Можно указать одну или несколько функций преобразования через пробел. Порядок важен: трансформации применяются последовательно слева направо.
Значение по умолчанию: none.
Основные функции преобразования
translate() — перемещение
Сдвигает элемент по горизонтали (ось X) и/или вертикали (ось Y).
translate(tx)— сдвиг только по X.translate(tx, ty)— сдвиг по X и Y.translateX(tx)— только по X.translateY(ty)— только по Y.translateZ(tz)— по оси Z (в 3D-контексте).translate3d(tx, ty, tz)— трёхмерное перемещение.
Значения могут быть:
- в пикселях (
px); - в процентах (
%) — относительно собственного размера элемента; - другими единицами длины (
em,rem,cmи т.д.).
Пример:
.element {
transform: translate(20px, 10px);
}
rotate() — поворот
Поворачивает элемент вокруг точки трансформации (по умолчанию — центр элемента).
rotate(angle)— двумерный поворот.rotateX(angle),rotateY(angle),rotateZ(angle)— поворот вокруг соответствующей оси.rotate3d(x, y, z, angle)— поворот вокруг произвольной 3D-оси.
Угол задаётся в:
- градусах (
deg); - радианах (
rad); - градах (
grad); - оборотах (
turn), где1turn = 360deg.
Пример:
.element {
transform: rotate(45deg);
}
scale() — масштабирование
Изменяет размер элемента относительно его исходного состояния.
scale(s)— одинаковое масштабирование по X и Y.scale(sx, sy)— раздельное масштабирование.scaleX(sx),scaleY(sy),scaleZ(sz)— по отдельным осям.scale3d(sx, sy, sz)— трёхмерное масштабирование.
Значения:
1— исходный размер;>1— увеличение;<1— уменьшение;- отрицательные значения — зеркальное отражение.
Пример:
.element {
transform: scale(1.5); /* увеличить на 50% */
}
skew() — наклон
Наклоняет элемент по осям X и/или Y.
skew(ax)— наклон только по X.skew(ax, ay)— наклон по обеим осям.skewX(ax),skewY(ay)— отдельно по каждой оси.
Углы задаются так же, как в rotate().
Пример:
.element {
transform: skew(20deg, 10deg);
}
Примечание:
skew()редко используется в современных интерфейсах из-за визуальной сложности и ограниченной практической пользы.
Комбинирование трансформаций
Функции можно комбинировать в одном свойстве:
.element {
transform: translate(50px, 20px) rotate(30deg) scale(1.2);
}
Порядок применения:
- Сначала —
translate; - Затем —
rotate; - В конце —
scale.
Изменение порядка приведёт к другому визуальному результату, так как каждая следующая трансформация применяется к уже изменённой системе координат.
Точка трансформации: transform-origin
По умолчанию все трансформации применяются относительно центра элемента (50% 50%). Это поведение можно изменить с помощью свойства transform-origin.
Синтаксис:
transform-origin: [x] [y] [z];
Возможные значения:
- ключевые слова:
left,center,right,top,bottom; - проценты:
0% 0%,100% 100%; - единицы длины:
10px 20px.
Пример:
.element {
transform: rotate(45deg);
transform-origin: top left;
}
Теперь элемент будет вращаться вокруг своего левого верхнего угла.
3D-трансформации
Для работы с трёхмерными преобразованиями требуется установка перспективы через свойство perspective (обычно на родительском контейнере):
.container {
perspective: 800px;
}
.item {
transform: rotateY(45deg) translateZ(50px);
}
Основные 3D-функции:
rotateX(),rotateY(),rotateZ();translateZ(),translate3d();scaleZ(),scale3d().
Без perspective 3D-трансформации будут выглядеть как плоские.
Примеры использования
Пример 1: Центрирование с помощью translate
.centered {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
Элемент точно центрируется по горизонтали и вертикали, независимо от его размеров.
Пример 2: Эффект наведения
.card {
transition: transform 0.3s ease;
}
.card:hover {
transform: translateY(-5px) scale(1.02);
}
Карточка слегка поднимается и увеличивается при наведении.
Пример 3: Вращающийся индикатор загрузки
.spinner {
width: 40px;
height: 40px;
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
Пример 4: Зеркальное отражение
.mirror {
transform: scaleX(-1);
}
Элемент отображается как зеркальное отражение по горизонтали.
transition в CSS
transition — это составное свойство CSS, которое задаёт плавный переход между двумя состояниями элемента при изменении его стилей. Переход активируется автоматически, когда значение наблюдаемого CSS-свойства меняется — например, при наведении (:hover), фокусе (:focus), переключении класса через JavaScript или изменении медиаусловий.
Синтаксис
Базовый синтаксис:
selector {
transition: [property] [duration] [timing-function] [delay];
}
Можно указать от одного до четырёх значений. Порядок важен:
- Имя свойства (или
all); - Длительность;
- Функция сглаживания;
- Задержка перед началом перехода.
Пример:
.box {
transition: opacity 0.4s ease-in 0.1s;
}
Также можно использовать отдельные свойства для большей читаемости:
.box {
transition-property: opacity;
transition-duration: 0.4s;
transition-timing-function: ease-in;
transition-delay: 0.1s;
}
Параметры
transition-property
Определяет, какие CSS-свойства подлежат плавному переходу.
Возможные значения:
- конкретное свойство:
color,background-color,opacity,transform,widthи т.д.; all— все анимируемые свойства;none— отключает переходы.
Пример:
.element {
transition-property: background-color, transform;
}
Не все CSS-свойства поддерживают плавные переходы. Анимируемые свойства — те, у которых есть промежуточные числовые или цветовые значения (например,
opacity,color,transform). Свойства вродеdisplayилиz-indexне анимируются.
transition-duration
Задаёт продолжительность перехода. Указывается в секундах (s) или миллисекундах (ms).
- Минимальное значение:
0s(мгновенное изменение); - Можно задать разную длительность для разных свойств, если их несколько.
Пример:
.element {
transition-property: color, transform;
transition-duration: 0.2s, 0.6s;
}
Цвет изменится за 0.2 секунды, а трансформация — за 0.6 секунды.
transition-timing-function
Определяет, как скорость изменения свойства распределяется во времени.
Возможные значения:
ease— медленно в начале и конце, быстро в середине (по умолчанию);linear— равномерная скорость;ease-in— ускорение в начале;ease-out— замедление в конце;ease-in-out— ускорение в начале, замедление в конце;cubic-bezier(x1, y1, x2, y2)— пользовательская кривая Безье;steps(n, [start|end])— пошаговая анимация без промежуточных значений.
Пример:
.element {
transition-timing-function: cubic-bezier(0.68, -0.55, 0.27, 1.55);
}
transition-delay
Задержка перед началом перехода после изменения свойства. Может быть отрицательной (переход начнётся с середины).
Пример:
.element {
transition-delay: 0.3s;
}
Отрицательная задержка:
.element {
transition-delay: -0.2s; /* переход начнётся так, будто уже прошло 0.2 секунды */
}
Примеры использования
Пример 1: Простой ховер-эффект
.button {
background-color: blue;
color: white;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: red;
}
Фон плавно меняется с синего на красный за 0.3 секунды.
Пример 2: Множественные свойства
.card {
background: #f0f0f0;
transform: scale(1);
transition: background 0.4s ease, transform 0.3s ease-out;
}
.card:hover {
background: #e0e0e0;
transform: scale(1.05);
}
При наведении фон и масштаб изменяются с разной длительностью и функцией сглаживания.
Пример 3: Отложенное появление
.tooltip {
opacity: 0;
transition: opacity 0.2s ease 0.1s;
}
.tooltip.show {
opacity: 1;
}
Когда добавляется класс .show, прозрачность начинает меняться не сразу, а спустя 0.1 секунды.
Пример 4: Пошаговый переход
.progress-bar {
width: 0%;
transition: width 2s steps(10, end);
}
.progress-bar.active {
width: 100%;
}
Ширина увеличивается не плавно, а рывками — 10 шагов за 2 секунды.