CSS-свойство `animation-timing-function`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она доступна в браузерах с сентября 2015 года.
CSS-свойство animation-timing-function задаёт, как анимация выполняется на протяжении каждого цикла.
Часто удобно использовать сокращённое свойство animation, чтобы задать сразу все свойства анимации.
Попробуйте
animation-timing-function: linear;
animation-timing-function: ease-in-out;
animation-timing-function: steps(5, end);
animation-timing-function: cubic-bezier(0.1, -0.6, 0.2, 0);
<section class="flex-column" id="default-example"> <div class="animating" id="example-element"></div> <button id="play-pause">Play</button> </section>
#example-element {
animation-duration: 3s;
animation-iteration-count: infinite;
animation-name: slide;
animation-play-state: paused;
background-color: #1766aa;
border-radius: 50%;
border: 5px solid #333333;
color: white;
height: 150px;
margin: auto;
margin-left: 0;
width: 150px;
}
#example-element.running {
animation-play-state: running;
}
#play-pause {
font-size: 2rem;
}
@keyframes slide {
from {
background-color: orange;
color: black;
margin-left: 0;
}
to {
background-color: orange;
color: black;
margin-left: 80%;
}
}
const el = document.getElementById("example-element");
const button = document.getElementById("play-pause");
button.addEventListener("click", () => {
if (el.classList.contains("running")) {
el.classList.remove("running");
button.textContent = "Play";
} else {
el.classList.add("running");
button.textContent = "Pause";
}
});
Синтаксис
/* Keyword values */ animation-timing-function: ease; animation-timing-function: ease-in; animation-timing-function: ease-out; animation-timing-function: ease-in-out; animation-timing-function: linear; animation-timing-function: step-start; animation-timing-function: step-end; /* cubic-bezier() function values */ animation-timing-function: cubic-bezier(0.42, 0, 1, 1); /* ease-in */ animation-timing-function: cubic-bezier(0, 0, 0.58, 1); /* ease-out */ animation-timing-function: cubic-bezier(0.42, 0, 0.58, 1); /* ease-in-out */ /* linear() function values */ animation-timing-function: linear(0, 0.25, 1); animation-timing-function: linear(0 0%, 0.25 50%, 1 100%); animation-timing-function: linear(0, 0.25 50% 75%, 1); animation-timing-function: linear(0, 0.25 50%, 0.25 75%, 1); /* steps() function values */ animation-timing-function: steps(4, jump-start); animation-timing-function: steps(10, jump-end); animation-timing-function: steps(20, jump-none); animation-timing-function: steps(5, jump-both); animation-timing-function: steps(6, start); animation-timing-function: steps(8, end); /* Multiple animations */ animation-timing-function: ease, step-start, cubic-bezier(0.1, 0.7, 1, 0.1); /* Global values */ animation-timing-function: inherit; animation-timing-function: initial; animation-timing-function: revert; animation-timing-function: revert-layer; animation-timing-function: unset;
Значения
-
<easing-function> -
Функция плавности, соответствующая заданной анимации, определяется свойством
animation-name.Неступенчатые ключевые слова (
ease,linear,ease-in-outи т. д.) каждое задаёт кубическую кривую Безье с фиксированными значениями четырёх точек, а значение-функцияcubic-bezier()позволяет указывать нестандартные значения. Функция плавностиsteps()делит входное время на заданное количество интервалов одинаковой длины. Её параметры включают количество шагов и положение шага.-
linear - Равно
cubic-bezier(0.0, 0.0, 1.0, 1.0); анимация выполняется с постоянной скоростью. -
ease - Равно
cubic-bezier(0.25, 0.1, 0.25, 1.0)— значению по умолчанию. Скорость возрастает к середине анимации, а затем постепенно снижается к концу. -
ease-in - Равно
cubic-bezier(0.42, 0, 1.0, 1.0): анимация начинается медленно, а скорость перехода анимируемого свойства увеличивается до завершения. -
ease-out - Равно
cubic-bezier(0, 0, 0.58, 1.0): анимация начинается быстро, а затем постепенно замедляется. -
ease-in-out - Равно
cubic-bezier(0.42, 0, 0.58, 1.0): анимируемые свойства изменяются медленно, затем ускоряются и снова замедляются. -
cubic-bezier(<number [0,1]> , <number> , <number [0,1]> , <number>) - Кривая Безье, заданная автором; первое и третье значения должны находиться в диапазоне от 0 до 1.
-
linear(<number> <percentage>{1,2}, …) - Функция выполняет линейную интерполяцию между указанными точками останова плавности. Точка останова — это пара, состоящая из выходного прогресса и входного процента. Входной процент необязателен и вычисляется, если не указан. Если входной процент не задан, первой и последней точкам останова присваиваются значения
0%и100%соответственно, а промежуточным точкам назначаются процентные значения, полученные линейной интерполяцией между ближайшими предыдущей и следующей точками, для которых задан процент. -
steps(<integer>, <step-position>) - Выполняет итерацию анимации с n остановками перехода, показывая каждую остановку в течение одинакового времени. Например, если n равно 5, будет 5 шагов. Будет ли анимация временно задерживаться на отметках 0%, 20%, 40%, 60% и 80%; на отметках 20%, 40%, 60%, 80% и 100%; делать 5 остановок между 0% и 100% анимации; или делать 5 остановок, включая отметки 0% и 100% (на 0%, 25%, 50%, 75% и 100%), зависит от выбранного положения шага:
-
jump-start - Обозначает левосторонне-непрерывную функцию: первый скачок происходит в начале анимации.
-
jump-end - Обозначает правосторонне-непрерывную функцию: последний скачок происходит в конце анимации. Это значение по умолчанию.
-
jump-none - На обоих концах скачков нет, что фактически удаляет один шаг в ходе итерации интерполяции. Вместо этого функция задерживается на отметках 0% и 100%, на каждой в течение 1/n от общей длительности.
-
jump-both - Включает паузы на отметках 0% и 100%, фактически добавляя один шаг в ходе итерации анимации.
-
start - То же, что
jump-start. -
end - То же, что
jump-end.
-
-
step-start - Равно
steps(1, jump-start) -
step-end - Равно
steps(1, jump-end)
-
Примечание: Если указать несколько значений через запятую для свойства animation-*, они применяются к анимациям в порядке появления соответствующих animation-name. О случаях, когда количество анимаций и значений свойства animation-* не совпадает, см. раздел Задание нескольких значений свойств анимации.
Примечание: Свойство animation-timing-function оказывает такое же влияние на создание анимаций CSS, управляемых прокруткой, как и на обычные анимации, основанные на времени.
Описание
Функции плавности можно задавать для отдельных ключевых кадров в правиле @keyframes. Если для ключевого кадра не задано animation-timing-function, для него используется соответствующее значение animation-timing-function элемента, к которому применяется анимация.
Внутри ключевого кадра animation-timing-function — это дескриптор, специфичный для этого правила at-rule, а не одноимённое свойство. Плавность не анимируется. Вместо этого функция плавности ключевого кадра применяется отдельно к каждому свойству — от ключевого кадра, в котором она задана, до следующего ключевого кадра с этим свойством или до конца анимации, если последующего ключевого кадра с этим свойством нет. Поэтому animation-timing-function, заданное для ключевого кадра 100% или to, никогда не будет использовано.
Формальное определение
| Начальное значение | ease |
|---|---|
| Применяется к | всем элементам, ::before и ::after <a href="/en-US/docs/Web/CSS/Reference/Selectors/Pseudo-elements">псевдоэлементам</a> |
| Наследуется | нет |
| Вычисленное значение | как задано |
| Тип анимации | Не анимируется |
Формальный синтаксис
animation-timing-function = <easing-function># <easing-function> = <linear-easing-function> | <cubic-bezier-easing-function> | <step-easing-function> <linear-easing-function> = linear | <linear()> <cubic-bezier-easing-function> = ease | ease-in | ease-out | ease-in-out | <cubic-bezier()> <step-easing-function> = step-start | step-end | <steps()> <linear()> = linear( [ <number> && <percentage>{0,2} ]# ) <cubic-bezier()> = cubic-bezier( [ <number [0,1]>, <number> ]#{2} ) <steps()> = steps( <integer>, <step-position>? ) <integer> = <number-token> <step-position> = jump-start | jump-end | jump-none | jump-both | start | end
Примеры
Во всех примерах этого раздела для нескольких элементов <div> анимируются свойства width и background-color с разными значениями animation-timing-function. Ширина анимируется от 0 до 100%, а цвет фона — от лаймового до пурпурного.
Примеры линейной функции
В примере показано влияние различных значений функции плавности linear().
<div class="parent"> <div class="linear">'linear' value</div> <div class="linear-fn1">linear(0, 0.5 50%, 1)</div> <div class="linear-fn2">linear(0, 0.25 75%, 1)</div> <div class="linear-fn3">linear(0, 0.75 25%, 1)</div> <div class="linear-fn4">linear(0, 0.5 25% 75%, 1)</div> <div class="linear-fn5">linear(0, 0.25 45%, 0.75 55%, 0.5 70%, 1)</div> <div class="linear-fn6">linear(0, 1.2 50%, 0.75 80%, 1)</div> <div class="linear-fn7">linear(0, 0.5 75%, 1 120%)</div> </div> <div class="x-axis"><span>25%</span><span>50%</span><span>75%</span></div> <button>Play animation</button>
const btn = document.querySelector("button");
const divs = document.querySelectorAll(".parent > div[class]");
btn.addEventListener("click", () => {
btn.setAttribute("disabled", "true");
for (const div of divs) {
div.classList.remove("animate");
void div.offsetWidth;
div.classList.add("animate");
}
setTimeout(() => {
btn.removeAttribute("disabled");
}, 11000);
});
.x-axis {
display: flex;
justify-content: space-evenly;
width: 80vw;
margin-left: 4px;
}
.parent {
background: linear-gradient(
to right,
white 24.8%,
grey 24.8%,
grey 25.2%,
white 25.2%,
white 49.8%,
grey 49.8%,
grey 50.2%,
white 50.2%,
white 74.8%,
grey 74.8%,
grey 75.2%,
white 75.2%
);
width: 80vw;
font-family: monospace;
font-weight: bold;
border: 2px solid grey;
}
.animate {
animation-name: changeme;
}
.parent > div[class] {
animation-fill-mode: forwards;
animation-duration: 10s;
width: 0;
margin-bottom: 4px;
padding: 5px 0;
box-sizing: border-box;
text-wrap: nowrap;
background-color: lime;
}
@keyframes changeme {
0% {
width: 0em;
}
100% {
width: 100%;
background-color: orange;
}
}
.linear {
animation-timing-function: linear;
}
.linear-fn1 {
animation-timing-function: linear(0, 0.5 50%, 1);
}
.linear-fn2 {
animation-timing-function: linear(0, 0.25 75%, 1);
}
.linear-fn3 {
animation-timing-function: linear(0, 0.75 25%, 1);
}
.linear-fn4 {
animation-timing-function: linear(0, 0.5 25% 75%, 1);
}
.linear-fn5 {
animation-timing-function: linear(0, 0.25 45%, 0.75 55%, 0.5 70%, 1);
}
.linear-fn6 {
animation-timing-function: linear(0, 1.2 50%, 0.75 80%, 1);
}
.linear-fn7 {
animation-timing-function: linear(0, 0.5 75%, 1 120%);
}
На следующем изображении показаны графики всех значений функции linear(), использованных в этом примере. Входной прогресс (время) отложен по оси x, а выходной прогресс — по оси y. Согласно синтаксису, входной прогресс изменяется от 0 до 100%, а выходной — от 0 до 1.
Обратите внимание, что выходное значение может как увеличиваться, так и уменьшаться.
Примеры кривых Безье
В примере показано влияние различных функций плавности на основе кривых Безье.
<div class="parent"> <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 class="cb">cubic-bezier(.5, -0.5, 1, 1.5)</div> </div> <div class="x-axis"><span>50%</span></div> <button>Play animation</button>
const btn = document.querySelector("button");
const divs = document.querySelectorAll(".parent > div[class]");
btn.addEventListener("click", () => {
btn.setAttribute("disabled", "true");
for (const div of divs) {
div.classList.remove("animate");
void div.offsetWidth;
div.classList.add("animate");
}
setTimeout(() => {
btn.removeAttribute("disabled");
}, 11000);
});
.x-axis {
display: flex;
justify-content: space-evenly;
width: 80vw;
margin-left: 4px;
}
.parent {
background: linear-gradient(
to right,
white 49.8%,
grey 49.8%,
grey 50.2%,
white 50.2%
);
width: 80vw;
font-family: monospace;
font-weight: bold;
border: 2px solid grey;
}
.animate {
animation-name: changeme;
}
.parent > div[class] {
animation-fill-mode: forwards;
animation-duration: 10s;
width: 0;
margin-bottom: 4px;
padding: 5px 0;
box-sizing: border-box;
text-wrap: nowrap;
background-color: lime;
}
@keyframes changeme {
0% {
width: 0em;
}
100% {
width: 100%;
background-color: orange;
}
}
.linear {
animation-timing-function: linear;
}
.ease {
animation-timing-function: ease;
}
.ease-in {
animation-timing-function: ease-in;
}
.ease-out {
animation-timing-function: ease-out;
}
.ease-in-out {
animation-timing-function: ease-in-out;
}
.cb {
animation-timing-function: cubic-bezier(0.5, -0.5, 1, 1.5);
}
На следующем изображении показаны графики всех значений функций Безье, использованных в этом примере. Входной прогресс (время) изменяется от 0 до 1, а выходной прогресс — от 0 до 1.
Примеры ступенчатых функций
В этом примере показано влияние нескольких значений ступенчатой функции плавности.
<div class="parent"> <div class="linear">linear</div> <div class="start">steps(4, start)</div> <div class="jump-start">steps(4, jump-start)</div> <div class="end">steps(4, end)</div> <div class="jump-end">steps(4, jump-end)</div> <div class="jump-both">steps(4, jump-both)</div> <div class="jump-none">steps(4, jump-none)</div> <div class="step-start">step-start</div> <div class="step-end">step-end</div> </div> <div class="x-axis"><span>25%</span><span>50%</span><span>75%</span></div> <button>Play animation</button>
const btn = document.querySelector("button");
const divs = document.querySelectorAll(".parent > div[class]");
btn.addEventListener("click", () => {
btn.setAttribute("disabled", "true");
for (const div of divs) {
div.classList.remove("animate");
void div.offsetWidth;
div.classList.add("animate");
}
setTimeout(() => {
btn.removeAttribute("disabled");
}, 11000);
});
.x-axis {
display: flex;
justify-content: space-evenly;
width: 80vw;
margin-left: 4px;
}
.parent {
background: linear-gradient(
to right,
white 24.8%,
grey 24.8%,
grey 25.2%,
white 25.2%,
white 49.8%,
grey 49.8%,
grey 50.2%,
white 50.2%,
white 74.8%,
grey 74.8%,
grey 75.2%,
white 75.2%
);
width: 80vw;
font-family: monospace;
font-weight: bold;
border: 2px solid grey;
}
.animate {
animation-name: changeme;
}
.parent > div[class] {
animation-fill-mode: forwards;
animation-duration: 10s;
width: 0;
margin-bottom: 4px;
padding: 5px 0;
box-sizing: border-box;
text-wrap: nowrap;
background-color: lime;
}
@keyframes changeme {
0% {
width: 0em;
}
100% {
width: 100%;
background-color: orange;
}
}
.linear {
animation-timing-function: linear;
}
.start {
animation-timing-function: steps(4, start);
}
.jump-start {
animation-timing-function: steps(4, jump-start);
}
.end {
animation-timing-function: steps(4, end);
}
.jump-end {
animation-timing-function: steps(4, jump-end);
}
.jump-both {
animation-timing-function: steps(4, jump-both);
}
.jump-none {
animation-timing-function: steps(4, jump-none);
}
.step-start {
animation-timing-function: step-start;
}
.step-end {
animation-timing-function: step-end;
}
На следующем изображении показаны графики всех значений функции step(), использованных в этом примере. Входной прогресс (время) и выходной прогресс изменяются от 0 до 1.
Спецификации
| Спецификация |
|---|
| CSS Animations Level 1 # animation-timing-function |
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на iOS | |
animation-timing-function |
43
3
|
12
12
|
16
49
5
|
30
15
12.1–15
12–15
|
9
4
|
43
18
|
16
49
5
|
30
14
12.1–14
12–14
|
9
3.2
|
4.0
1.0
|
43
4.4
|
9
3.2
|
ease |
3 |
12 |
5 |
15 |
4 |
18 |
5 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
ease-in |
3 |
12 |
5 |
15 |
4 |
18 |
5 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
ease-in-out |
3 |
12 |
5 |
15 |
4 |
18 |
5 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
ease-out |
3 |
12 |
5 |
15 |
4 |
18 |
5 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
jump |
77 |
79 |
65 |
64 |
14 |
77 |
65 |
55 |
14 |
12.0 |
77 |
14 |
linear |
3 |
12 |
5 |
15 |
4 |
18 |
5 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
step-end |
3 |
12 |
5 |
15 |
4 |
18 |
5 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
step-start |
3 |
12 |
5 |
15 |
4 |
18 |
5 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
См. также
- Использование CSS-анимаций
<easing-function>- Функции плавности CSS — модуль
- API JavaScript
AnimationEvent - Инструмент для построения кубических кривых Безье
- Другие связанные со свойствами анимации свойства:
animation,animation-composition,animation-delay,animation-direction,animation-duration,animation-fill-mode,animation-iteration-count,animation-name,animation-play-state,animation-timeline
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/animation-timing-function