Свойство transition CSS: полное руководство

Динамичные и привлекательные интерфейсы сайтов являются не просто украшением, а стандартом ожиданий пользователя. Статические страницы уходят в прошлое, уступая место живым, отзывчивым проектам, которые взаимодействуют с посетителем.

Одним из фундаментальных и наиболее мощных инструментов для «оживления» веб-элементов без сложных сценариев является свойство 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

linear
ease
ease-in
ease-out
ease-in-out
.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.

  1. 0s (по умолчанию): Задержки нет.
  2. 0.5s: Переход начнется через полсекунды после наведения.
  3. -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];

Правила:

  1. Первое значение, которое можно распознать как время, всегда будет присвоено transition-duration. Второе значение времени — transition-delay.
  2. Порядок следования 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) — конец анимации.

Не бойтесь использовать визуальные редакторы:

  1. cubic-bezier.com
  2. Инструменты разработчика в браузере (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

Скриншот главной страницы сайта 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 с задержкой). Это создает сложное, контролируемое поведение.

Распространенные ошибки и как их избежать

  1. Анимация свойства auto или none. Переходы не работают со значениями height: auto; или display: none;. Вместо display: none используйте opacity: 0; visibility: hidden;. Вместо анимации height: auto — анимируйте max-height от 0 к заведомо большому значению (например, 1000px), или используйте transform: scaleY().
  2. Слишком много одновременных переходов. Анимация десятков свойств (особенно с transition: all) может привести к «захватыванию» основного потока браузера и подтормаживаниям. Анимируйте только необходимые свойства, предпочтительно transform и opacity.
  3. Игнорирование шагающих анимаций (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, а не просто быть). Инструмент мощный, но, как и любой мощный инструмент, требует вдумчивого применения.

Наша веб-студия готова превратить статичные макеты в живое, вовлекающее цифровое пространство? Плавные анимации и продуманные микровзаимодействия, которые вы только что изучили, — это не просто код, а мощный инструмент повышения конверсии и лояльности ваших клиентов. Если вы хотите внедрить эти технологии в свой сайт, но не хотите погружаться в технические детали, — мы готовы помочь. Закажите создание современного, динамичного веб-сайта или отдельного интерактивного компонента у нас, и мы воплотим в жизнь интерфейс, который будет не только красивым, но и по-настоящему эффективным для вашего бизнеса.

Теги: