Свойство transition CSS: полное руководство
Оглавление
- Что такое CSS Transition и зачем он нужен?
- Разбираем параметры свойства transition
- Анимация нескольких свойств с разными параметрами
- Практические примеры применения transition в веб-дизайне
- Переходы для состояния :focus и :active
- Совместимость transition с CSS Transform для максимальной производительности
- Создание пользовательских кривых с cubic-bezier()
- Обратная анимация и тонкости поведения
- Распространенные ошибки и как их избежать
- Заключение: transition как основа динамичного интерфейса
Динамичные и привлекательные интерфейсы сайтов являются не просто украшением, а стандартом ожиданий пользователя. Статические страницы уходят в прошлое, уступая место живым, отзывчивым проектам, которые взаимодействуют с посетителем.
Одним из фундаментальных и наиболее мощных инструментов для «оживления» веб-элементов без сложных сценариев является свойство transition в CSS. Этот механизм позволяет плавно изменять значения CSS-свойств в течение заданного времени, превращая резкие, мгновенные скачки в изящные, естественные переходы. Именно плавность делает взаимодействие с сайтом интуитивно понятным и приятным, значительно улучшая пользовательский опыт (UX).
Представьте кнопку, которая меняет цвет не щелчком выключателя, а подобно закатному небу, или карточку товара, которая вырастает под курсором мыши с ощутимой инерцией. Эти микровзаимодействия создают ощущение качества и продуманности. CSS transition — это ключ к таким микровзаимодействиям. В отличие от полноценной CSS-анимации (@keyframes), которая предназначена для сложных, многоэтапных последовательностей, переходы идеально подходят для реакций элемента на события: наведение мыши (:hover), фокус (:focus), активацию (:active). Они просты в освоении, но при этом открывают огромный простор для творчества.
Цель этой статьи — стать вашим исчерпывающим руководством по свойству transition CSS. Мы не только разберем его синтаксис и каждый параметр, но и погрузимся в практику, рассмотрим лучшие примеры применения, обсудим производительность и типичные ошибки. Вы научитесь контролировать время, темп и порядок анимаций, создавая по-настоящему профессиональные и привлекательные интерфейсы. Давайте начнем с основ.
Что такое CSS Transition и зачем он нужен?
CSS Transition (переход) — это модуль CSS, который позволяет вам контролировать скорость и способ изменения одного или нескольких свойств элемента от одного состояния к другому. Без использования переходов любое изменение свойства CSS (например, цвета фона, ширины, прозрачности) происходит мгновенно, что часто воспринимается как резкий, «рваный» эффект.
Основная задача переходов — сделать изменения плавными и естественными для глаза. Это достигается путем интерполяции (вычисления промежуточных значений) между начальным и конечным значением свойства в течение заданного периода времени. Такой подход имитирует законы физики в цифровом мире, где у объектов есть инерция и ускорение, что делает интерфейс более предсказуемым и дружелюбным.
Зачем использовать transition?
- Улучшение пользовательского опыта (UX): плавные переходы направляют внимание пользователя, визуально связывают действия и результаты, дают обратную связь. Например, кнопка, которая слегка «нажимается» при клике, подтверждает действие.
- Повышение визуальной привлекательности: динамика оживляет дизайн, делает сайт современным и запоминающимся.
- Простота реализации: для базовых эффектов не требуется знания JavaScript или сложных анимационных библиотек. Все делается средствами CSS.
- Производительность: анимации, построенные на свойстве transition CSS, как правило, очень эффективны, так как браузер может оптимизировать их аппаратное ускорение (особенно для свойств transform и opacity), что обеспечивает плавность даже на мобильных устройствах.
Рассмотрим Пример 1. У нас есть простая кнопка. Без transition (перехода) изменение фона кнопки при наведении на нее курсора мыши будет резким. Используйте чекбокс для включения/выключения перехода.
Пример 1
<!-- HTML -->
<button class="btn">Наведи на меня</button>
/* CSS без перехода */
.btn {
background-color: #3498db;
color: white;
padding: 15px 30px;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
.btn:hover {
background-color: #2ecc71; /* Мгновенное изменение */
}
Чтобы применить свойство transition css, мы просто добавляем его к исходному правилу для элемента.
/* CSS с переходом */
.btn {
background-color: #3498db;
color: white;
padding: 15px 30px;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
/* Добавляем переход для background-color */
transition-property: background-color;
transition-duration: 0.3s;
}
.btn:hover {
background-color: #2ecc71; /* Теперь изменение займет 0.3 секунды */
}
Всего две строки — и взаимодействие с кнопкой стало значительно приятнее. Теперь давайте детально разберем, из каких «кирпичиков» состоит это свойство перехода.
Разбираем параметры свойства transition
Свойство transition является составным (shorthand). Это значит, что оно объединяет в себе несколько отдельных свойств, которые можно задавать как вместе, так и по отдельности. Понимание каждой составляющей — ключ к полному контролю над анимацией.
1. transition-property: какие свойства анимировать?
Свойство transition-property определяет, к каким именно CSS-свойствам будет применяться эффект перехода. Вы можете перечислить их через запятую или использовать ключевые слова.
all: переход будет применяться ко всем изменяемым свойствам элемента. Удобно, но может привести к ненужным накладным расходам, если анимируются многие свойства.none: никакие свойства анимироваться не будут.- Имя свойства: например,
background-color,width,opacity,transform. Вы можете указать несколько свойств:transition-property: background-color, transform;.
Важно: Не все CSS-свойства можно анимировать. Анимируемыми являются те, у которых значения могут интерполироваться (вычисляться промежуточно). Например, display: block; или font-family анимировать нельзя, а opacity, color, margin — можно. Официальная спецификация CSS содержит полный список анимируемых свойств.
В Примере 2 высота элемента при наведении на него курсора мыши изменится мгновенно, так как не указана в transition-property
Пример 2
.box {
width: 100px;
height: 100px;
background-color: coral;
/* Анимируем только ширину и цвет фона */
transition-property: width, background-color;
transition-duration: 0.5s;
}
.box:hover {
width: 200px;
background-color: lightblue;
/* Высота изменится мгновенно, так как не указана в transition-property */
height: 120px;
}
2. transition-duration: как долго длится анимация?
Свойство transition-duration задает продолжительность перехода — время, за которое изменение свойства завершится. Значение указывается в секундах (s) или миллисекундах (ms).
0s(или0ms): значение по умолчанию. Переход происходит мгновенно.0.3s: Стандартная длительность для многих микровзаимодействий (300 мс).1s,2000ms(2 секунды): Более длительные, заметные анимации.
Правильный подбор длительности критически важен. Слишком быстрая анимация (менее 100мс) может остаться незамеченной, слишком медленная (более 1 секунды) будет раздражать пользователя, заставляя его ждать.
Золотая середина для интерактивных элементов — 200-500 мс
В Примере 3, наведя курсор мыши на оранжевый квадрат мы увеличиваем его в размере на 25% (transform: scale(1.25)). Двигая ползунок слайдера можно поиграть с длительностью времени перехода.
Пример 3
.box {
transition-property: transform;
/* Длительность 0.5 секунды */
transition-duration: 0.5s;
}
.box:hover {
transform: scale(1.25);
}
3. transition-timing-function: кривая скорости (темп)
Это, пожалуй, самый интересный параметр, который придает анимации характер. transition-timing-function определяет, как вычисляются промежуточные значения свойства в течение времени, заданного transition-duration. Проще говоря, она управляет ускорением и замедлением анимации.
Базовые, предустановленные значения:
ease(по умолчанию): Анимация начинается медленно, разгоняется в середине и снова замедляется в конце. Наиболее естественная, «органичная» кривая. Идеальна для большинства случаев.linear: Постоянная скорость от начала до конца. Создает механический, равномерный эффект. Подходит для движения объектов по прямой или изменения прозрачности.ease-in: Начинается медленно, заканчивается быстро. Создает ощущение «падения» или появления элемента с ускорением.ease-out: Начинается быстро, заканчивается медленно. Эффект «торможения». Отлично подходит для скрытия элементов или анимации всплывающих уведомлений.ease-in-out: Симметричная кривая, похожая на ease, но с более равномерным ускорением и замедлением. Начинается и заканчивается медленно.
Визуализация этих функций крайне важна. Лучше всего они воспринимаются на практике. В Примере 4, наведя курсор мыши на один из фиолетовых прямоугольников можно четко увидеть, что характер движения у каждого из них разный и зависит от предустановленного значения.
Пример 4
.timing-demo div {
width: 100px;
height: 60px;
background-color: #9b59b6;
margin-bottom: 10px;
color: white;
display: flex;
align-items: center;
justify-content: center;
transition-property: transform;
transition-duration: 2s;
}
.linear { transition-timing-function: linear; }
.ease { transition-timing-function: ease; }
.ease-in { transition-timing-function: ease-in; }
.ease-out { transition-timing-function: ease-out; }
.ease-in-out { transition-timing-function: ease-in-out; }
.timing-demo:hover div {
transform: translateX(250px);
}
<div class="timing-demo">
<div class="linear">linear</div>
<div class="ease">ease</div>
<div class="ease-in">ease-in</div>
<div class="ease-out">ease-out</div>
<div class="ease-in-out">ease-in-out</div>
</div>
4. transition-delay: задержка перед началом
Свойство transition-delay устанавливает время ожидания между моментом, когда должно начаться изменение свойства (например, срабатывание :hover), и моментом, когда переход фактически стартует. Значение также указывается в s или ms.
0s(по умолчанию): Задержки нет.0.5s: Переход начнется через полсекунды после наведения.-0.5s: Отрицательное значение. Переход начнется не с начала, а как будто уже прошел 0.5 секунды от своей длительности. Полезно для создания эффекта «быстрого старта» или для синхронизации нескольких анимаций.
В Примере 5 изменяйте значение свойства transition-delay с помощью инпута для появления тени у оранжевого квадрата при наведении на него курсора мыши.
Пример 5
.box {
opacity: 0.8;
transition-property: opacity, box-shadow;
transition-duration: 0.3s;
/* Задержка для box-shadow, чтобы он появлялся чуть позже */
transition-delay: 0s, 0.5s;
}
.box:hover {
opacity: 1;
box-shadow: 0 10px 20px rgba(0,0,0,0.2);
}
Сокращенная запись свойства transition CSS
Чтобы не перечислять все свойства по отдельности, используется сокращенное свойство transition. Оно принимает значения в следующем порядке (два из них обязательны):
transition: [property] [duration] [timing-function] [delay];
Правила:
- Первое значение, которое можно распознать как время, всегда будет присвоено
transition-duration. Второе значение времени —transition-delay. - Порядок следования
timing-functionиdelayотносительно друг друга не важен, если оба присутствуют, но они должны идти послеduration.
Примеры:
/* Только длительность. Property = all, timing-function = ease, delay = 0 */
transition: 0.3s;
/* Длительность и property */
transition: background-color 0.3s;
/* Длительность, timing-function и property */
transition: transform 0.5s ease-in-out;
/* Все четыре параметра */
transition: opacity 0.4s ease-out 0.1s;
/* Множественные переходы через запятую */
transition: background-color 0.3s ease, transform 0.5s ease-in 0.1s, opacity 0.2s;
Использование краткой формы делает код чище и удобнее для чтения. Именно ее чаще всего используют на практике.
Анимация нескольких свойств с разными параметрами
Одна из сильных сторон свойства transition css — возможность независимо управлять переходом для разных свойств одного элемента. Для этого в краткой или полной форме значения перечисляются через запятую.
В Примере 6 несколько переходов: 1. фон анимируется 0.5s с задержкой 0.2s, 2. трансформация (поворот) 1s с ease-in-out, 3. ширина 0.7s с linear.
Пример 6
.advanced-box {
width: 100px;
height: 100px;
background: linear-gradient(45deg, #ff6b6b, #feca57);
border-radius: 10px;
transition:
background 0.5s ease 0.2s,
transform 1s ease-in-out,
width 0.7s linear;
}
.advanced-box:hover {
background: linear-gradient(45deg, #48dbfb, #0abde3);
transform: rotate(15deg) scale(1.1);
width: 150px;
}
Такой подход дает невероятную гибкость. Вы можете, например, сделать изменение цвета быстрым, а движение — более плавным и медленным, что создает сложный, многослойный и профессиональный эффект.
Практические примеры применения transition в веб-дизайне
Теория без практики мертва. Давайте рассмотрим реальные, востребованные кейсы использования свойства transition для улучшения интерфейсов.
Интерактивные кнопки и ссылки
Кнопки — главные точки взаимодействия. Их анимация должна быть тактильной и понятной.
В Примере 7 разные свойства кнопки анимируются с разными значениями на различных этапах взаимодействия с ней (подробности описаны в коде под этим примером).
Пример 7
.practical-btn {
display: inline-block;
padding: 12px 28px;
background-color: #5d78ff;
color: white;
text-decoration: none;
border-radius: 50px; /* Округлая форма */
font-weight: 600;
border: 2px solid transparent;
/* Анимируем фон, тень и трансформацию */
transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
box-shadow: 0 4px 6px rgba(93, 120, 255, 0.2);
}
.practical-btn:hover {
background-color: #4a63e0;
transform: translateY(-3px); /* Эффект "поднятия" */
box-shadow: 0 7px 14px rgba(93, 120, 255, 0.3); /* Усиленная тень */
}
.practical-btn:active {
transform: translateY(-1px); /* Эффект "нажатия" */
transition-duration: 0.1s; /* Ускоряем обратную анимацию */
}
Раскрывающиеся меню и выпадающие списки
Резкое появление контента может дезориентировать. В Примере 8 убедительно показано, что плавное раскрытие или выезд меню выглядит куда элегантнее.
Пример 8
<nav class="dropdown">
<button class="dropdown-toggle">Меню ▼</button>
<ul class="dropdown-menu">
<li><a href="#">Главная</a></li>
<li><a href="#">Услуги</a></li>
<li><a href="#">Портфолио</a></li>
<li><a href="#">Контакты</a></li>
</ul>
</nav>
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
background: white;
min-width: 200px;
box-shadow: 0 8px 16px rgba(0,0,0,0.1);
border-radius: 8px;
padding: 10px 0;
/* Изначально скрыто: прозрачность 0 и сдвиг вверх */
opacity: 0;
visibility: hidden; /* Важно: убираем из потока, чтобы нельзя было навести */
transform: translateY(-10px);
/* Анимируем три свойства */
transition: opacity 0.25s ease, transform 0.25s ease, visibility 0.25s;
}
.dropdown:hover .dropdown-menu {
opacity: 1;
visibility: visible; /* Возвращаем видимость */
transform: translateY(0); /* "Въезд" в нормальную позицию */
}
.dropdown-menu a {
display: block;
padding: 10px 20px;
color: #333;
text-decoration: none;
transition: background-color 0.2s;
}
.dropdown-menu a:hover {
background-color: #f5f7fa;
}
Галереи и карточки товаров
Эффекты при наведении на карточку — классический способ повысить вовлеченность, что прекрасно продемонстрировано в Примере 9 ниже.
Пример 9

Простые эффекты повышают интерес и желание взаимодействовать!
.product-card {
width: 300px;
border-radius: 12px;
overflow: hidden; /* Чтобы изображение не выходило за скругленные углы */
background: #fff;
box-shadow: 0 5px 15px rgba(0,0,0,0.08);
transition: transform 0.4s ease, box-shadow 0.4s ease;
}
.product-card:hover {
transform: translateY(-10px) scale(1.02);
box-shadow: 0 20px 30px rgba(0,0,0,0.15);
}
.product-card img {
width: 100%;
height: 200px;
object-fit: cover;
transition: transform 0.6s ease;
}
.product-card:hover img {
transform: scale(1.05); /* Легкий зум изображения */
}
.product-info {
padding: 20px;
}
Индикация загрузки (лоадеры)
В Примере 10 показано, что простые лоадеры можно создать, анимируя transform или border.
Пример 10
.spinner {
width: 50px;
height: 50px;
border: 5px solid #f3f3f3;
border-top: 5px solid #3498db;
border-radius: 50%;
/* Бесконечная анимация через transition невозможна, но мы можем имитировать плавность вращения, если оно запускается по событию. Для бесконечной анимации лучше @keyframes. */
animation: spin 1s linear infinite; /* Здесь уже анимация, а не transition */
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Но transition отлично подойдет для плавного появления/исчезания лоадера */
.loader-container {
opacity: 0;
transition: opacity 0.5s ease;
}
.loader-container.active {
opacity: 1;
}
Переходы для состояния :focus и :active
Не забывайте о доступности! Пользователи, которые осуществляют навигацию по сайту с помощью клавиатуры (Tab), должны видеть, какой элемент в фокусе. Стандартный браузерный outline можно стилизовать и анимировать. Смотри Пример 11.
Пример 11
.accessible-input {
padding: 12px;
border: 2px solid #ddd;
border-radius: 6px;
font-size: 16px;
outline: none; /* Убираем стандартный контур */
transition: border-color 0.3s ease, box-shadow 0.3s ease;
}
.accessible-input:focus {
border-color: #5d78ff;
/* Создаем свой мягкий glow-эффект вместо outline */
box-shadow: 0 0 0 3px rgba(93, 120, 255, 0.2);
}
.accessible-btn:active {
transform: scale(0.97);
transition-duration: 0.05s; /* Очень быстрая анимация нажатия */
}
Совместимость transition с CSS Transform для максимальной производительности
Для создания перемещений, масштабирований и вращений всегда предпочтительнее использовать свойство transform, а не top/left или width/height. Почему?
Браузерный рендеринг состоит из нескольких этапов: Layout (перерасчет геометрии), Paint (отрисовка), Composite (композитинг). Изменение свойств вроде width, margin приводит к срабатыванию этапов Layout и Paint, что ресурсоемко.
Свойства transform и opacity в большинстве случаев обрабатываются на этапе Composite, который использует GPU и происходит максимально быстро. Это гарантирует плавность анимации (60 FPS) даже при высокой нагрузке.
/* Плохо для производительности при анимации */
.slow-box:hover {
width: 400px; /* Вызовет Layout и Paint */
margin-left: 50px; /* Вызовет Layout и Paint */
}
/* Отлично для производительности */
.fast-box {
transition: transform 0.3s ease;
}
.fast-box:hover {
/* Анимация трансформации использует GPU */
transform: translateX(50px) scale(1.1);
}
Создание пользовательских кривых с cubic-bezier()
Иногда встроенных функций (ease, ease-in-out) недостаточно. Для полного контроля над темпом анимации используется функция cubic-bezier(x1, y1, x2, y2). Она описывает кривую Безье по четырем контрольным точкам (P1 и P2).
- P0: (0, 0) — начало анимации.
- P1: (x1, y1) — первая контрольная точка.
- P2: (x2, y2) — вторая контрольная точка.
- P3: (1, 1) — конец анимации.
Не бойтесь использовать визуальные редакторы:
- cubic-bezier.com
- Инструменты разработчика в браузере (Chrome DevTools) позволяют редактировать кривую прямо в CSS-панели.
.bouncy-btn {
transition: transform 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
.bouncy-btn:hover {
transform: scale(1.2); /* Кнопка будет "пружинить" при увеличении */
}
.elastic-input {
transition: all 0.5s cubic-bezier(0.87, -0.41, 0.19, 1.44);
}
.elastic-input:focus {
transform: translateX(10px);
}

Скриншот главной страницы сайта cubic-bezier.com.
На этом сайте с помощью бесплатного визуального редактора можно создавать и тонко настраивать функции плавности CSS-анимаций. Перетаскивая точки, вы сразу увидите, как будет двигаться объект. Копируйте готовый код — это упрощает подбор идеальных параметров.
Обратная анимация и тонкости поведения
По умолчанию, свойство transition css применяется и к переходу в исходное состояние. Если вы навели курсор мыши на элемент, то анимация длится 0.3s, и когда убрали курсор, возврат также длится 0.3s с той же timing-function.
Это не всегда желательно. Иногда нужно, чтобы эффект появления был быстрым, а исчезновение — медленным, или наоборот. Этого можно достичь, задавая переходы для разных состояний.
.tooltip {
opacity: 0;
/* Анимация ПОЯВЛЕНИЯ: длительная, с задержкой */
transition: opacity 0.8s ease 0.3s;
}
.element:hover .tooltip {
opacity: 1;
/* Анимация ИСЧЕЗНОВЕНИЯ: быстрая, без задержки */
transition: opacity 0.2s ease;
}
В примере выше: при наведении срабатывает правило для .element:hover .tooltip (исчезновение за 0.2s), а при уходе курсора — правило для .tooltip (появление за 0.8s с задержкой). Это создает сложное, контролируемое поведение.
Распространенные ошибки и как их избежать
- Анимация свойства
autoилиnone. Переходы не работают со значениямиheight: auto;илиdisplay: none;. Вместоdisplay: noneиспользуйтеopacity: 0; visibility: hidden;. Вместо анимацииheight: auto— анимируйтеmax-heightот0к заведомо большому значению (например,1000px), или используйтеtransform: scaleY(). - Слишком много одновременных переходов. Анимация десятков свойств (особенно с
transition: all) может привести к «захватыванию» основного потока браузера и подтормаживаниям. Анимируйте только необходимые свойства, предпочтительноtransformиopacity. - Игнорирование шагающих анимаций (
steps()). Функцияsteps(n)разбивает анимацию наnрезких шагов. Идеально для создания sprite-анимации, тикающих часов, эффекта пишущей машинки.
.typewriter {
width: 0;
overflow: hidden;
white-space: nowrap;
border-right: 2px solid;
animation: typing 4s steps(40, end), blink-caret 0.75s step-end infinite;
}
@keyframes typing {
from { width: 0; }
to { width: 100%; }
}
Забывают про will-change. Для сложных, ресурсоемких анимаций можно подсказать браузеру, какое свойство будет изменяться, чтобы он заранее подготовил оптимизации: will-change: transform;. Используйте с осторожностью и только в случае реальных проблем с производительностью, так как это может заставить браузер выделять лишние ресурсы.
Ниже все примеры из этой статьи собранные в одном месте!
See the Pen transition css by inteltone (@inteltone) on CodePen.
Заключение: transition как основа динамичного интерфейса
Освоение свойства transition css — это не просто изучение еще одного инструмента в арсенале верстальщика. Это шаг к пониманию философии создания живых, отзывчивых и человеко-ориентированных интерфейсов. Плавные переходы из разряда «украшательств» перешли в категорию обязательных стандартов качества веб-продукта.
От простых hover-эффектов на кнопках до сложных, многоэтапных сценариев появления модальных окон — transition лежит в основе. Начинайте с малого: анимируйте цвет и тень. Экспериментируйте с длительностями, пробуйте разные timing-function. Затем переходите к комбинациям свойств, управлению обратной анимацией и созданию собственных кривых Безье.
Помните главные принципы: производительность (используйте transform и opacity), умеренность (длительность 200-500 мс), целесообразность (каждая анимация должна решать задачу UX, а не просто быть). Инструмент мощный, но, как и любой мощный инструмент, требует вдумчивого применения.
Наша веб-студия готова превратить статичные макеты в живое, вовлекающее цифровое пространство? Плавные анимации и продуманные микровзаимодействия, которые вы только что изучили, — это не просто код, а мощный инструмент повышения конверсии и лояльности ваших клиентов. Если вы хотите внедрить эти технологии в свой сайт, но не хотите погружаться в технические детали, — мы готовы помочь. Закажите создание современного, динамичного веб-сайта или отдельного интерактивного компонента у нас, и мы воплотим в жизнь интерфейс, который будет не только красивым, но и по-настоящему эффективным для вашего бизнеса.