Длительность и задержка: transition-duration и transition-delay

transition-duration задаёт, сколько длится сам переход, а transition-delay - через сколько времени после изменения он начнётся. Оба принимают значения в секундах (s) или миллисекундах (ms), причём единицу нельзя опускать даже для нуля: transition-duration: 0; - невалидный CSS, обязательно нужно писать 0s.

Попробуй прямо сейчас: наведи курсор на список - пункты проявляются не разом, а один за другим, потому что у каждого своя transition-delay. Поменяй .15s/.3s на большие значения и посмотри, как усиливается эффект очереди.

transition-duration: сколько длится переход

transition-duration принимает время в секундах (s) или миллисекундах (ms) - 300ms и .3s означают одно и то же. Важная особенность именно времени в CSS: в отличие от длин, где margin: 0; без единицы - это нормально, у временных значений единицу нельзя опускать даже для нуля. Отрицательная длительность тоже не превращается в ноль - она делает всё объявление transition-duration невалидным, и браузер его просто отбрасывает.

transition-duration: 0s; transition-duration: 300ms; - обе записи валидны, вторая равна .3s.

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

transition-duration: 0; - без единицы измерения объявление невалидно; браузер его игнорирует, как будто transition-duration не задавали вовсе.

transition-delay: когда переход начинается

transition-delay откладывает старт перехода: при значении .5s браузер подождёт полсекунды после изменения свойства и только потом начнёт анимировать его в течение времени, заданного в transition-duration. Задержка не делает сам переход длиннее - она лишь сдвигает его начало, поэтому общее время до финального значения равно delay плюс duration. Самое интересное - что delay может быть отрицательным: тогда переход стартует не с нуля, а сразу с той точки, как будто часть времени уже прошла.

transition: opacity 2s -1s; - задержка отрицательная, поэтому переход стартует сразу же, как будто уже прошла 1 секунда из 2, и доиграет оставшуюся секунду с той точки.

Не путай с отрицательной длительностью - вот она уже невалидна:

transition: opacity -1s; - отрицательная transition-duration делает всё объявление невалидным, перехода не будет вообще, в отличие от отрицательной задержки.

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

ОшибкаЧто происходитКак исправить
Писать transition-duration: 0; без единицы измерения В отличие от длин, время в CSS требует единицу даже для нуля - объявление невалидно, переход не работает вообще Всегда писать 0s или 0ms
Задать отрицательную transition-duration, ожидая, что она "выключит" переход Отрицательная длительность делает всё объявление невалидным, а не приравнивается к нулю Использовать 0s, если переход не нужен вовсе
Перепутать порядок значений в сокращённой записи transition: свойство ВРЕМЯ1 ВРЕМЯ2 Первое время после свойства - всегда duration, второе (если есть) - delay; перепутав местами, получишь другую задержку вместо другой длительности Помнить порядок: свойство → длительность → функция плавности → задержка
Ждать, что задержка делает сам переход медленнее transition-delay не растягивает переход - он лишь откладывает старт; общее время до конца равно delay плюс duration Если нужен более медленный переход, увеличивать duration, а не delay

Шпаргалка

Свойство/значениеЗначение
transition-durationСколько длится переход; единица обязательна даже для нуля - 0s, не 0
transition-delayЧерез сколько времени после изменения стартует переход (по умолчанию 0s)
Единицыs - секунды, ms - миллисекунды; 300ms = .3s
Отрицательная delayПереход стартует уже частично пройденным, например -1s при duration 2s - старт с середины
Отрицательная durationНевалидна - всё объявление transition игнорируется целиком

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

В чём разница между transition-duration и transition-delay?

duration - это сколько длится сам переход от старого значения к новому. delay - это сколько браузер ждёт ПЕРЕД тем, как вообще начать переход. Одно отвечает за скорость самого движения, другое - за момент старта.

Можно ли сделать отрицательную задержку у перехода?

Да, и это не ошибка, а рабочая часть спецификации: отрицательная transition-delay заставляет переход стартовать сразу же, но как будто часть времени уже прошла - например, -1s при duration 2s начнёт показ ровно с середины и доиграет оставшуюся секунду.

Как анимировать несколько элементов по очереди, а не одновременно?

Самый простой способ на чистом CSS - дать соседним элементам разную transition-delay, например через :nth-child(2), :nth-child(3) и так далее. Все элементы меняют свойство в один момент, но начинают его показывать с разной задержкой, из-за чего и создаётся эффект очереди.

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

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

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

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

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

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