CSS-свойство `animation-timeline`
Baseline Ограниченная доступность
Эта функция не входит в Baseline, поскольку не работает в некоторых наиболее широко используемых браузерах.
Свойство animation-timeline CSS задаёт временную шкалу, используемую для управления ходом CSS-анимации.
Синтаксис
/* Keyword */ animation-timeline: none; animation-timeline: auto; /* Named timeline */ animation-timeline: --timeline_name; /* Anonymous scroll progress timeline */ animation-timeline: scroll(); animation-timeline: scroll(x root); /* Anonymous view progress timeline */ animation-timeline: view(); animation-timeline: view(inline); animation-timeline: view(x 200px auto); /* Multiple values */ animation-timeline: --progress-bar-timeline, --carousel-timeline; animation-timeline: auto, view(20% 80%), none, scroll(inline nearest); /* Global values */ animation-timeline: inherit; animation-timeline: initial; animation-timeline: revert; animation-timeline: revert-layer; animation-timeline: unset;
Значения
Свойство animation-timeline задаётся одним или несколькими значениями, разделёнными запятыми. Каждое из них может быть одним из следующих:
-
none - Анимация не связана с временной шкалой и не выполняется.
-
auto - Временная шкала анимации — стандартная
DocumentTimelineдокумента. Это значение по умолчанию. -
scroll() - Задаёт корневой элемент, ближайший прокручиваемый контейнер или сам элемент в качестве анонимной временной шкалы прогресса прокрутки и, при необходимости, направление прокрутки контейнера.
-
view() - Задаёт ближайший родительский контейнер прокрутки в качестве анонимной временной шкалы прогресса просмотра, при необходимости переопределяя направление оси
baselineпо умолчанию, а также начальные и конечные отступыauto. -
<dashed-ident> - Имя временной шкалы прокрутки или прогресса просмотра, определённое свойством
scroll-timeline-nameилиview-timeline-nameконтейнера прокрутки (либо сокращённым свойствомscroll-timelineилиview-timeline).
Описание
Стандартная временная шкала анимации CSS-кадров — основанная на времени DocumentTimeline. Свойство animation-timeline можно использовать для задания именованной или анонимной временной шкалы прогресса прокрутки либо прогресса просмотра. Также его можно использовать, чтобы явно задать стандартную временную шкалу документа, основанную на времени, для управления ходом анимации элемента, либо указать отсутствие временной шкалы. В последнем случае элемент не будет анимироваться.
С помощью свойства animation-timeline можно задать следующие типы временных шкал:
-
DocumentTimeline - Стандартная временная шкала документа, ход которой определяется временем, прошедшим с момента первой загрузки документа в браузере. Эта временная шкала традиционно используется для CSS-анимаций. Она выбирается значением
autoили если значениеanimation-timelineне указано, поскольку это значение используется по умолчанию. - Временная шкала прогресса прокрутки
- Ход анимации определяется прокруткой прокручиваемого элемента, или контейнера прокрутки, по горизонтали или вертикали. Элемент, задающий временную шкалу прогресса прокрутки, можно указать двумя способами:
- Именованная временная шкала прогресса прокрутки
- Контейнер прокрутки получает явное имя: свойству
scroll-timeline-name(или сокращённому свойствуscroll-timeline) присваивается значение<dashed-ident>; затем это имя<dashed-ident>задаётся как значение свойстваanimation-timeline. - Анонимная временная шкала прогресса прокрутки
- Свойству
animation-timelineанимируемого элемента присваивается функцияscroll(). Два необязательных параметра функции задают контейнер прокрутки, предоставляющий временную шкалу прогресса прокрутки, и используемую ось прокрутки.
- Временная шкала прогресса просмотра
- Ход покадровой анимации зависит от изменения видимости элемента внутри контейнера прокрутки; этот элемент называется объектом наблюдения. По умолчанию временная шкала находится в точке
0%, когда элемент впервые становится видимым у одного края контейнера прокрутки, и в точке100%, когда его конечный край выходит за противоположный край контейнера прокрутки. Временную шкалу прогресса просмотра можно задать двумя способами:- Именованная временная шкала прогресса просмотра
- Объекту наблюдения явно задаётся имя: свойству
view-timeline-name(или сокращённому свойствуview-timeline) присваивается значение<dashed-ident>. Если свойствуanimation-timelineанимируемого элемента присвоить это значение<dashed-ident>, видимость объекта наблюдения будет управлять ходом анимации элемента. Обратите внимание, что анимируемый элемент и объект наблюдения не обязательно должны совпадать. - Анонимная временная шкала прогресса просмотра
- Свойству
animation-timelineанимируемого элемента присваивается функцияview(), и элемент анимируется в зависимости от его видимости в области прокрутки ближайшего родительского контейнера прокрутки.
- Без временной шкалы
- Все временные шкалы анимации можно удалить, выбрав значение
none. Если задано значениеanimation-timeline: none, анимация не выполняется, поскольку ей не с чем синхронизироваться.
Свойство animation-timeline включено в сокращённое свойство animation как значение, используемое только для сброса. Это означает, что включение animation сбрасывает ранее объявленное значение animation-timeline до auto. Поскольку этот компонент сокращённого свойства используется только для сброса, задать конкретное значение через animation нельзя. При создании CSS-анимаций, управляемых прокруткой, объявление animation-timeline должно идти после объявления любого сокращённого свойства animation, чтобы оно подействовало.
Если указать несколько значений, разделённых запятыми, каждое значение animation-timeline применяется к одной анимации в порядке следования значений animation-name. Если в объявлении animation-timeline больше значений, чем значений animation-name, лишние значения временной шкалы игнорируются. Если значений animation-timeline меньше, чем значений animation-name, значения animation-timeline повторяются по порядку, пока для каждой animation-name не будет задана соответствующая временная шкала.
Если две или более временные шкалы имеют одинаковое имя <dashed-ident> и одинаковую специфичность, будет использоваться последняя из объявленных в каскаде. Если временная шкала с именем, указанным в animation-timeline, не найдена, связанная с этим значением animation-name не будет привязана к временной шкале.
Формальное определение
| Начальное значение | auto |
|---|---|
| Применяется к | всем элементам |
| Наследуется | нет |
| Вычисленное значение | список, каждый элемент которого является регистрозависимым CSS-идентификатором или ключевым словом <code>none</code>, <code>auto</code> |
| Тип анимации | Не анимируется |
Формальный синтаксис
animation-timeline = <single-animation-timeline># <single-animation-timeline> = auto | none | <dashed-ident> | <scroll()> | <view()> <scroll()> = scroll( [ <scroller> || <axis> ]? ) <view()> = view([<axis> || <'view-timeline-inset'>]?) <scroller> = root | nearest | self <axis> = block | inline | x | y
Примеры
Основы использования
В этом примере показано базовое использование свойства animation-timeline вместе со значениями none, auto и значением по умолчанию (auto).
HTML
У нас есть элемент <article> с тремя дочерними элементами <section>. У каждого элемента <section> есть уникальный id и дочерний элемент <div>.
<article>
<section id="none">
<div></div>
</section>
<section id="auto">
<div></div>
</section>
<section id="default">
<div></div>
</section>
</article>
CSS
Мы используем гибкую блочную раскладку, чтобы разместить три секции рядом. С помощью генерируемого содержимого отображаем id. Мы применяем одинаковые стили ко всем элементам и задаём анимацию rotate @keyframes, поворачивающую элемент на один полный оборот. С помощью сокращённого свойства animation мы задаём бесконечные двухсекундные итерации анимации rotate с линейным ходом и чередованием направления.
article {
display: flex;
gap: 10px;
text-align: center;
}
section {
background-color: beige;
padding: 20px;
}
section::after {
content: attr(id);
display: block;
}
div {
height: 100px;
width: 100px;
background-color: magenta;
animation: rotate 2s infinite alternate linear;
}
@keyframes rotate {
to {
rotate: 1turn;
}
}
Единственное различие — объявление animation-timeline (или его отсутствие в случае default) для каждого <div>.
#none div {
animation-timeline: none;
}
#auto div {
animation-timeline: auto;
}
@layer no-support {
@supports not (animation-timeline: none) {
body::before {
content: "Your browser doesn't support the `animation-timeline` property";
background-color: wheat;
display: block;
text-align: center;
padding: 1rem 0;
}
}
}
Поскольку свойство animation-timeline включено в сокращённое свойство animation как значение, используемое только для сброса, объявление animation-timeline должно идти после сокращённого свойства animation или иметь более высокую специфичность, чем сокращённое свойство animation, чтобы примениться.
Результаты
Обратите внимание, что объявление значения auto даёт тот же эффект, что и значение animation-timeline по умолчанию. Значение none удаляет все временные шкалы элемента, поэтому в случае none анимация не выполняется.
Задание именованной временной шкалы прогресса прокрутки
В этом примере в качестве временной шкалы анимации задаётся горизонтальная временная шкала прогресса прокрутки.
HTML
Наш контейнер включает три расширяющих элемента, ширины которых достаточно, чтобы контейнер стал контейнером прокрутки. В среднем элементе находится фигура, которую мы будем анимировать.
<div id="container">
<div class="stretcher"></div>
<div class="stretcher">
<div id="shape"></div>
</div>
<div class="stretcher"></div>
</div>
CSS
Мы задаём контейнеру гибкую раскладку и устанавливаем для него width, равную половине общей ширины его гибких дочерних элементов. Значение scroll свойства overflow-x добавляет горизонтальную полосу прокрутки.
Наша временная шкала прогресса прокрутки, заданная с помощью свойств scroll-timeline-name и scroll-timeline-axis, называется --square-timeline. Эта временная шкала применяется к элементу #shape с помощью свойства animation-timeline: --square-timeline.
#container {
display: flex;
width: 300px;
border: 1px solid;
overflow-x: scroll;
scroll-timeline-axis: inline;
scroll-timeline-name: --square-timeline;
}
.stretcher {
flex: 0 0 200px;
}
Приведённый ниже CSS задаёт квадрат, который поворачивается в чередующихся направлениях в соответствии с временной шкалой, указанной свойством animation-timeline. Ему присвоена временная шкала --square-timeline, названная выше. Анимация выполняется дважды, чередуя направление по мере перемещения через область просмотра. Для наглядности анимационного эффекта мы добавили срезанные углы.
#shape {
background-color: deeppink;
width: 100px;
height: 100px;
border-radius: 25px;
corner-shape: notch;
animation: rotateAnimation 1ms linear 2 alternate;
animation-timeline: --square-timeline;
}
@keyframes rotateAnimation {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@layer no-support {
@supports not (animation-timeline: --square-timeline) {
body::before {
content: "Your browser doesn't support named animation timelines.";
background-color: wheat;
display: block;
text-align: center;
padding: 1rem 0;
}
}
}
Результат
Прокрутите страницу, чтобы увидеть анимацию элемента.
Задание анонимной временной шкалы прогресса прокрутки
В этом примере расширяется предыдущий: с помощью функции scroll() применяется анонимная временная шкала прогресса прокрутки.
CSS
Мы используем весь CSS из предыдущего примера, изменяя только значение свойства animation-timeline, чтобы переопределить значение из предыдущего примера. Временная шкала задаётся значением scroll(inline nearest), которое выбирает полосу прокрутки по встроенному направлению ближайшего родительского элемента с полосами прокрутки. Это вертикальная полоса прокрутки элемента #container, поскольку у элементов .stretcher нет переполняющего содержимого, и поэтому они не являются контейнерами прокрутки.
#shape {
animation-timeline: scroll(inline nearest);
}
@layer no-support {
@supports not (animation-timeline: scroll()) {
body::before {
content: "Your browser doesn't support the scroll() function.";
background-color: wheat;
display: block;
text-align: center;
padding: 1rem 0;
}
}
}
Результат
Прокрутите страницу, чтобы увидеть анимацию квадратного элемента.
Задание именованной временной шкалы прогресса просмотра
В этом примере показано, как создать и применить именованную временную шкалу прогресса просмотра. Будут анимированы два элемента, каждый из которых использует отдельный элемент в качестве контейнера прокрутки.
HTML
<main class="scroller">
<div class="container">
<h1>Directions</h1>
<h2>Lincoln Memorial to Martin Luther King, Jr. Memorial</h2>
<ol>
<li>Head south on Lincoln Memorial Circle</li>
<li>Turn right toward Independence Ave</li>
<li>Turn left onto Independence Ave</li>
<li>Turn right onto West Basin Dr</li>
<li>Look up when you reach 64 Independence Ave!</li>
</ol>
<section>
В нашем HTML-коде много текста в контейнере внутри контейнера прокрутки; для краткости мы его скрыли. В середине этого длинного текста находятся два элемента <div>, которые мы будем анимировать: в первом случае — в зависимости от видимости самого элемента, во втором — в зависимости от видимости его родителя.
<div class="animated-element self">SELF</div> <div class="animated-element parent">PARENT</div>
</section> <h2>Martin Luther King, Jr. Memorial to Lincoln Memorial</h2> <ol> <li>Head north toward Independence Ave SW</li ><li>Turn left onto Independence Ave</li ><li>Turn right toward the Korean War Veterans Memorial</li ><li>Take a photo of the memorial as you walk past it.</li ><li>Head north on Lincoln Memorial Circle</li ><li>Look up. You can't miss it!</li> </ol> </div> </main>
CSS
Мы создаём покадровую анимацию, изменяющую непрозрачность и масштаб элемента, и применяем её к обоим анимируемым элементам:
@keyframes animation-effect {
0% {
opacity: 0;
scale: 0;
}
100% {
opacity: 1;
scale: 1;
}
}
.animated-element {
animation: animation-effect 1ms linear;
}
Элемент self явно назначается контейнером прокрутки для самого себя: свойству view-timeline-name присваивается значение <dashed-ident>, а это имя <dashed-ident> задаётся как значение свойства animation-timeline. В случае parent мы задаём container в качестве контейнера прокрутки для анимируемого элемента:
.self {
view-timeline-name: --self-scroller-element;
animation-timeline: --self-scroller-element;
}
.container {
view-timeline-name: --parent-scroller-element;
}
.parent {
animation-timeline: --parent-scroller-element;
}
Дополнительные объявления CSS скрыты для краткости.
@layer setup {
section {
display: flex;
gap: 10px;
}
main {
width: 400px;
padding: 1em;
height: 300px;
overflow: scroll;
border: 1px solid;
background-color: beige;
font-family: sans-serif;
}
li {
margin-bottom: 0.75lh;
}
.animated-element {
height: 200px;
width: calc(100% - 2em);
margin: auto;
background-color: forestgreen;
background-image:
repeating-linear-gradient(37deg, transparent 0 52px, beige 52px 57px),
repeating-linear-gradient(94deg, transparent 0 52px, beige 52px 57px);
border: 1px solid;
font-size: 3em;
place-content: center;
}
}
Результат
Прокрутите контейнер, чтобы увидеть анимацию обоих элементов.
Обратите внимание, как видимость элемента self управляет его собственной анимацией. В этом случае элемент находится на ключевом кадре 0%, когда верхний край входит в область просмотра, или видимую часть области прокрутки, и достигает ключевого кадра 100% только тогда, когда нижний край выходит за пределы области просмотра.
Элемент parent становится видимым только тогда, когда видим его родительский элемент, а это значит, что к моменту его появления в области просмотра анимация уже пройдена примерно на 25%. Когда элемент выходит за верхнюю границу области просмотра, анимация пройдена примерно на 75%.
Спецификации
| Спецификация |
|---|
| CSS Animations Level 2 # animation-timeline |
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari на iOS | Samsung Internet | WebView для Android | WebView на iOS | |
animation-timeline |
115 |
115 |
предварительная версия |
101 |
26 |
115 |
Нет |
77 |
26 |
23.0 |
115 |
26 |
auto |
115 |
115 |
предварительная версия |
101 |
26 |
115 |
Нет |
77 |
26 |
23.0 |
115 |
26 |
none |
115 |
115 |
предварительная версия |
101 |
26 |
115 |
Нет |
77 |
26 |
23.0 |
115 |
26 |
scroll |
115 |
115 |
предварительная версия |
101 |
26 |
115 |
Нет |
77 |
26 |
23.0 |
115 |
26 |
view |
115 |
115 |
предварительная версия |
101 |
26 |
115 |
Нет |
77 |
26 |
23.0 |
115 |
26 |
См. также
-
animation,animation-composition,animation-delay,animation-direction,animation-duration,animation-fill-mode,animation-iteration-count,animation-name,animation-play-state,animation-timing-function -
scroll-timeline-name,scroll-timeline-axis,scroll-timeline -
view-timeline-name,view-timeline-axis,view-timeline,view-timeline-inset AnimationTimeline- Руководство: использование CSS-анимаций
- Модуль CSS-анимации
- Модуль CSS-анимации, управляемые прокруткой
© 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-timeline