Что такое CSS-переходы и как они работают

CSS-переход - это свойство transition, которое заставляет браузер менять значение другого свойства не мгновенно, а плавно, за выбранное время. Например, фон кнопки при наведении не сразу становится другим цветом, а перетекает в него за полсекунды. Всё это - одна строка CSS, без единой строчки JavaScript.

Попробуй прямо сейчас: наведи курсор на кнопку и убери его - фон меняется плавно. Теперь замени 1s на 0.1s или на 3s и наведи снова - почувствуешь, как меняется скорость самого перехода.

Что такое CSS-переход

Без transition браузер применяет новое значение свойства мгновенно, одним кадром - как будто щёлкнули выключателем. Свойство transition встаёт между двумя состояниями и растягивает изменение во времени: браузер сам вычисляет промежуточные значения (например, промежуточные оттенки цвета) и показывает их одно за другим, пока не дойдёт до конечного значения.

.btn { transition: background-color .3s; } .btn:hover { background-color: tomato; } - фон перетекает в tomato за 0,3 секунды, переход заметен глазу.

Неправильное ожидание - что достаточно просто задать :hover, и переход появится сам:

.btn:hover { background-color: tomato; } - без transition фон меняется мгновенно, одним кадром, никакого перехода нет.

Как браузер применяет transition

transition - это сокращённое свойство сразу для четырёх параметров: transition-property (какое свойство анимировать, по умолчанию все), transition-duration (сколько длится переход, по умолчанию 0 секунд), transition-timing-function (кривая скорости, по умолчанию ease) и transition-delay (задержка перед стартом, по умолчанию 0 секунд). Самое важное здесь - значение по умолчанию у длительности: если её не указать явно, переход технически есть, но длится 0 секунд, то есть происходит абсолютно незаметно.

transition: background-color .3s; - длительность указана явно, переход длится 0,3 секунды и виден.

transition: background-color; - свойство для анимации указано, а время - нет; браузер подставит значение по умолчанию 0s, и переход пройдёт мгновенно, будто его вообще не было.

Из истории 7 ноября 2007 года разработчик Apple Дэвид Хайэтт (David Hyatt), один из создателей WebKit, отправил в рассылку W3C www-style предложение добавить в CSS сразу два механизма анимации: плавные переходы между состояниями (будущий transition) и покадровую анимацию через правило @keyframes. До этого предложения анимировать что-либо на веб-странице можно было только через JavaScript. Официальным документом W3C - первым публичным черновиком CSS Transitions Module Level 1 - идея стала только 20 марта 2009 года. Источник: lists.w3.org - Apple's Proposal for CSS Animation.

Частые ошибки новичков

ОшибкаЧто происходитКак исправить
Не указать transition-duration (например, написать просто transition: background-color;) Длительность по умолчанию - 0 секунд, переход происходит мгновенно, будто transition не было вовсе Всегда указывать время явно, например transition: background-color .3s;
Пытаться анимировать display (например, display: nonedisplay: block) У display нет промежуточных значений между none и block, поэтому переход просто не срабатывает, элемент появляется и исчезает мгновенно Анимировать opacity и видимость вместе, а не сам display
Проверять переход на очень коротком наведении и делать вывод, что transition "не работает" Переход на самом деле идёт, просто курсор убирают раньше, чем он успевает завершиться, и кажется, что ничего не произошло Увеличить длительность на время проверки или задержать курсор подольше
Писать transition: all .3s; "для надёжности" на весь сайт Браузер начинает отслеживать изменение вообще всех анимируемых свойств элемента, включая случайные (например, ширину при изменении контента), что лишний раз нагружает страницу Указывать конкретное свойство, которое действительно нужно анимировать

Шпаргалка

СвойствоЗначение
transition-propertyКакое CSS-свойство анимировать (по умолчанию all - все сразу)
transition-durationСколько длится переход (по умолчанию 0s - переход отключён)
transition-timing-functionКривая скорости перехода, например ease, linear (по умолчанию ease)
transition-delayЗадержка перед стартом перехода (по умолчанию 0s)
transitionСокращённая запись всех четырёх значений сразу, например transition: background-color .3s ease .1s;

Коротко: отвечаем на вопросы

Чем отличается transition от animation в CSS?

transition реагирует на изменение состояния - например, наведение курсора или смену класса - и один раз плавно переводит свойство из старого значения в новое. animation работает через @keyframes: может запускаться сама, без внешнего повода, проходить через сколько угодно промежуточных шагов и повторяться - разберём это подробно в группе уроков про @keyframes.

Можно ли анимировать через transition любое CSS-свойство?

Нет. Плавно меняются только свойства с промежуточными значениями - цвет, размер, отступ, прозрачность и похожие. У дискретных свойств вроде display или font-family промежуточного состояния не существует, поэтому они переключаются мгновенно, даже если на них указан transition.

Почему transition не срабатывает, если элемент скрыт через display: none?

display - как раз то самое дискретное свойство из предыдущего вопроса: между none и block у него нет промежуточных состояний, поэтому плавный переход для него физически невозможен. Для анимации появления и скрытия элемента обычно используют opacity и visibility, а к display переходят только в паре с ними.

Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×