Клавиша / esc

transition-timing-function

Будет ли элемент меняться линейно или более причудливо?

Время чтения: 5 мин

Кратко

Скопировано

transition-timing-function определяет функцию зависимости значения свойства от времени. Другими словами, эта функция определяет скорость течения анимации.

Пример

Скопировано

В примере ниже свойство color будет меняться линейно (равномерно) на протяжении 300 мс.

        
          
          .box {  transition-property: color;  transition-duration: .3s;  transition-timing-function: linear;}
          .box {
  transition-property: color;
  transition-duration: .3s;
  transition-timing-function: linear;
}

        
        
          
        
      

Как пишется

Скопировано

Ключевые слова в качестве значений:

        
          
          .selector {  transition-timing-function: ease; /* Используется по умолчанию */  transition-timing-function: ease-in;  transition-timing-function: ease-out;  transition-timing-function: ease-in-out;  transition-timing-function: linear;  transition-timing-function: step-start;  transition-timing-function: step-end;}
          .selector {
  transition-timing-function: ease; /* Используется по умолчанию */
  transition-timing-function: ease-in;
  transition-timing-function: ease-out;
  transition-timing-function: ease-in-out;
  transition-timing-function: linear;
  transition-timing-function: step-start;
  transition-timing-function: step-end;
}

        
        
          
        
      

Описание функций в качестве значений:

        
          
          .selector {  transition-timing-function: steps(4, jump-end);  transition-timing-function: cubic-bezier(0.1, 0.7, 1.0, 0.1);  transition-timing-function: linear(0, 0.5, 0.75, 0.85, 1);}
          .selector {
  transition-timing-function: steps(4, jump-end);
  transition-timing-function: cubic-bezier(0.1, 0.7, 1.0, 0.1);
  transition-timing-function: linear(0, 0.5, 0.75, 0.85, 1);
}

        
        
          
        
      

Дополнительные параметры функции Steps:

        
          
          .selector {  transition-timing-function: steps(4, jump-start);  transition-timing-function: steps(10, jump-end);  transition-timing-function: steps(20, jump-none);  transition-timing-function: steps(5, jump-both);  transition-timing-function: steps(6, start);  transition-timing-function: steps(8, end);}
          .selector {
  transition-timing-function: steps(4, jump-start);
  transition-timing-function: steps(10, jump-end);
  transition-timing-function: steps(20, jump-none);
  transition-timing-function: steps(5, jump-both);
  transition-timing-function: steps(6, start);
  transition-timing-function: steps(8, end);
}

        
        
          
        
      

Указание нескольких функций:

        
          
          .selector {  transition-timing-function:    ease, step-start, cubic-bezier(0.1, 0.7, 1.0, 0.1);}
          .selector {
  transition-timing-function:
    ease, step-start, cubic-bezier(0.1, 0.7, 1.0, 0.1);
}

        
        
          
        
      

Как понять

Скопировано

Например, нам нужно изменить какое-то свойство от 0 до 100 за 1 секунду. В течение этой секунды значение свойства может меняться с разной скоростью. Как именно — как раз описывает наша функция.

Например, если свойство меняется равномерно всю секунду, то это линейная зависимость, которая описывается ключевым словом linear и выглядит так:

Линейная функция

Если свойство меняется сначала быстро, а потом медленнее, то эта зависимость описывается ключевым словом ease-out и выглядит так:

Функция ease-out

Функция linear()

Скопировано

Не путать с ключевым словом linear выше — это отдельная функция. Она задаёт кривую через набор контрольных точек прогресса, между которыми браузер интерполирует линейно.

        
          
          .box {  transition-timing-function: linear(0, 0.5, 0.75, 0.85, 1);}
          .box {
  transition-timing-function: linear(0, 0.5, 0.75, 0.85, 1);
}

        
        
          
        
      

Первое и последнее число — обычно 0 и 1 (начало и конец перехода), между ними можно указать сколько угодно промежуточных точек. Чем их больше, тем точнее можно приблизить сложную кривую, например «пружину», без cubic-bezier().

У каждой точки можно явно задать процент времени, к которому она должна быть достигнута:

        
          
          .box {  transition-timing-function: linear(0, 0.25 75%, 1);}
          .box {
  transition-timing-function: linear(0, 0.25 75%, 1);
}

        
        
          
        
      

Без процентов точки распределяются по временной шкале равномерно.

Функция cubic-bezier

Скопировано

В общем случае график функции описывается значением cubic-bezier(p1, p2, p3, p4). В качестве параметров p1 и p3 обязательно должны быть числа от 0 до 1.

Каждому ключевому слову соответствует свой график функции с определёнными коэффициентами:

  • linearcubic-bezier(0.0, 0.0, 1.0, 1.0)
  • easecubic-bezier(0.25, 0.1, 0.25, 1.0)
  • ease-incubic-bezier(0.42, 0, 1.0, 1.0)
  • ease-outcubic-bezier(0, 0, 0.58, 1.0)
  • ease-in-outcubic-bezier(0.42, 0, 0.58, 1.0)
Открыть демо в новой вкладке

Функция steps

Скопировано

Изменять свойство можно не плавно, а скачками. Функция steps описывает, за сколько шагов должно произойти изменение свойства.

        
          
          .box {  transition-timing-function: steps(5, jump-start);}
          .box {
  transition-timing-function: steps(5, jump-start);
}

        
        
          
        
      

Первый параметр указывает количество шагов, за которое будет изменено свойство. При этом каждый шаг будет отображаться равное количество времени.

Второй параметр определяет логику, по которой будет разделён промежуток на отрезки.

Например, если первый параметр равен 5, то всего будет 5 шагов. На каждом шаге отображение будет задерживаться, следуя одному из условий в зависимости от второго параметра. Второй параметр может принимать следующие значения:

jump-start, jump-end, jump-both, jump-none, start, end

  • на 20%, 40%, 60%, 80% и 100% — jump-start. В момент старта анимации текущее значение сразу прыгнет на 20% и там задержится на $1/5$ времени.
  • на 0%, 20%, 40%, 60% и 80% — jump-end. Текущее значение начинает задержку сразу на 0%
  • или сделает 5 остановок в промежутке между 0% и 100% (16%, 33%, 50%, 66%, 84%) — jump-both
  • или сделает 5 остановок, включая 0% и 100% (0%, 25%, 50%, 75%, 100%) — jump-none

Сейчас все четыре значения поддерживаются во всех современных браузерах:

Открыть демо в новой вкладке

Ключевые слова step-start, step-end являются синонимами для записи steps(1, jump-start) и steps(1, jump-end). Изменение происходит скачком за один шаг.

step-start переходит в конечное состояние сразу при старте анимации и дожидается конца анимации.

step-end дожидается конца анимации и потом переходит в конечное состояние

Открыть демо в новой вкладке

Подсказки

Скопировано

💡 Если не указано свойство transition-timing-function, то по умолчанию браузер будет использовать функцию ease и соответствующее ей описание cubic-bezier(0.25, 0.1, 0.25, 1.0)

💡 Задавая коэффициенты p2 и p4 меньше 0 или больше 1, можно добиться эффекта «пружины», что в некоторых случаях может сделать анимацию более интересной

Открыть демо в новой вкладке
Поддержка в браузерах:
  • Chrome 113, поддерживается
  • Edge 113, поддерживается
  • Firefox 112, поддерживается
  • Safari 17.2, поддерживается
О Baseline

На практике

Скопировано

Денис Ежков советует

Скопировано

🛠 Самой часто используемой функцией анимации является ease. В основном, потому что верстальщикам лень писать значение функции, а по умолчанию в браузере используется именно ease.

Егор Левченко советует

Скопировано

🛠 Если вы хотите создать крутую анимацию и понимаете, как именно должна выглядеть ваша Кривая Безье, можно воспользоваться специальным сайтом, например https://cubic-bezier.com/.

        
          
          .selector {  transition-timing-function: cubic-bezier(1, .2, .52, .46);}
          .selector {
  transition-timing-function: cubic-bezier(1, .2, .52, .46);
}

        
        
          
        
      

Алёна Батицкая советует

Скопировано

🛠 Если создаёте анимацию, имитирующую реальный мир, то очень важно правильно подбирать временную функцию анимации. Потому что в реальном мире ничего не двигается резко или линейно.