Свойство CSS `animation-composition`
Baseline Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она доступна во всех браузерах с июля 2023 года.
Свойство animation-composition CSS задаёт операцию композитинга, которая используется, когда несколько анимаций одновременно воздействуют на одно и то же свойство.
Синтаксис
/* Single animation */ animation-composition: replace; animation-composition: add; animation-composition: accumulate; /* Multiple animations */ animation-composition: replace, add; animation-composition: add, accumulate; animation-composition: replace, add, accumulate; /* Global values */ animation-composition: inherit; animation-composition: initial; animation-composition: revert; animation-composition: revert-layer; animation-composition: unset;
Значения
Для этого свойства задаётся одно или несколько значений-ключевых слов, разделённых запятыми:
-
replace - Значение эффекта заменяет базовое значение свойства. Это значение по умолчанию.
-
add - Значение эффекта дополняет базовое значение свойства. Эта операция даёт аддитивный эффект. Для типов анимации, в которых операция сложения не является коммутативной, сначала используется базовое значение, а затем значение эффекта.
-
accumulate - Значение эффекта объединяется с базовым значением. Для типов анимации, в которых операция сложения не является коммутативной, сначала используется базовое значение, а затем значение эффекта.
Описание
Каждое свойство, на которое нацелено правило @keyframes, связано со стеком эффектов. Значение стека эффектов вычисляется путём объединения базового значения свойства в правиле стилей CSS со значением эффекта этого свойства в ключевом кадре. Свойство animation-composition позволяет задать способ объединения базового значения со значением эффекта.
Например, в приведённом ниже CSS blur(5px) — это базовое значение, а blur(10px) — значение эффекта. Свойство animation-composition задаёт операцию, выполняемую для получения итогового значения эффекта после композитинга эффекта базового значения и значения эффекта.
.icon:hover {
filter: blur(5px);
animation: 3s infinite pulse;
animation-composition: add;
}
@keyframes pulse {
0% {
filter: blur(10px);
}
100% {
filter: blur(20px);
}
}
Рассмотрим различные значения свойства animation-composition в приведённом выше примере. Итоговое значение эффекта в каждом случае вычисляется описанным ниже образом:
- При значении
replaceblur(10px)заменитblur(5px)в ключевом кадре0%. Это поведение свойства по умолчанию. - При значении
addитоговое значение эффекта в ключевом кадре0%будетblur(5px) blur(10px). - При значении
accumulateитоговое значение эффекта в ключевом кадре0%будетblur(15px).
Примечание: Операцию композитинга также можно задать в ключевом кадре. В этом случае указанная операция композитинга сначала применяется к каждому свойству внутри этого ключевого кадра, а затем — к каждому свойству в следующем ключевом кадре.
Несколько значений
Если для свойства animation-* указать несколько значений, разделённых запятыми, они будут применены к анимациям в том порядке, в котором появляются animation-name. Если число анимаций и операций композитинга различается, значения, перечисленные в свойстве animation-composition, будут циклически повторяться от первого до последнего animation-name, пока для всех анимаций не будет назначено значение animation-composition. Подробнее см. в разделе Задание нескольких значений свойств анимации.
Формальное определение
| Начальное значение | replace |
|---|---|
| Применяется к | всем элементам |
| Наследуется | нет |
| Вычисленное значение | как задано |
| Тип анимации | Не анимируется |
Формальный синтаксис
animation-composition = <single-animation-composition># <single-animation-composition> = replace | add | accumulate
Примеры
Разбираемся со значениями animation-composition
В приведённом ниже примере рядом показан эффект различных значений animation-composition.
HTML
<div class="container"> replace <div id="replace" class="target"></div> </div> <div class="container"> add <div id="add" class="target"></div> </div> <div class="container"> accumulate <div id="accumulate" class="target"></div> </div>
CSS
body {
display: flex;
flex-wrap: wrap;
gap: 3px;
}
.container {
flex: 1;
min-width: 200px;
height: 200px;
background: lightblue;
display: inline-block;
text-align: center;
}
.target {
width: 20px;
height: 50px;
background: green;
border-radius: 10px;
margin: 20px 0;
}
@keyframes slide {
50% {
transform: translateY(30px);
}
100% {
transform: translateX(150px);
}
}
.target {
transform: translateX(30px) rotate(45deg);
animation: slide 5s linear infinite;
}
#replace {
animation-composition: replace;
}
#add {
animation-composition: add;
}
#accumulate {
animation-composition: accumulate;
}
Результат
Во всех случаях базовое значение свойства transform — translateX(30px) rotate(45deg). Эффекты различных значений animation-composition:
-
При значении
replaceсвойствоtransformв каждом ключевом кадре полностью заменяет базовое свойствоtransform, заданное для анимируемого элемента. Итоговое значение эффекта для свойстваtransformв ключевом кадре50%—translateY(30px)(безrotateилиtranslateX); в ключевом кадре100%оно равноtranslateX(150px)(безrotateилиtranslateY).Элемент начинает с
transform: translateX(30px) rotate(45deg)и фактически анимируется доtransform: translateY(30px), а затем доtransform: translateX(150px). -
При значении
addитоговое значение эффекта в каждом ключевом кадре — это базовое значениеtransform, за которым непосредственно следует значение эффекта.Поэтому элемент начинает с
transform: translateX(30px) rotate(45deg)и фактически сначала анимируется доtransform: translateX(30px) rotate(45deg) translateY(30px)(то есть на30px«вниз» по повёрнутой оси Y), а затем доtransform: translateX(30px) rotate(45deg) translateX(150px). Поскольку аддитивная операция выполняется относительно базовогоtransform, а не предыдущего ключевого кадра, вtranslateY(30px)нет100%, и элемент оказывается на150pxвдоль повёрнутой оси X относительно исходного положения. -
При значении
accumulateитоговое значение эффекта — это значение эффектаtransformиз ключевого кадра, объединённое с исходным базовым значением. В50%значениеtranslateY(30px)объединяется с исходнымtranslateX(30px)в одно смещение (translate(30px, 30px)). В100%значениеtranslateX(150px)объединяется с исходнымtranslateX(30px), образуяtranslateX(180px).Поэтому элемент начинает с
transform: translateX(30px) rotate(45deg)и фактически сначала анимируется доtransform: translate(30px, 30px) rotate(45deg), а затем доtransform: translateX(180px) rotate(45deg).
Спецификации
| Спецификация |
|---|
| CSS Animations Level 2 # animation-composition |
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на iOS | |
animation-composition |
112 |
112 |
115 |
98 |
16 |
112 |
115 |
75 |
16 |
23.0 |
112 |
16 |
accumulate |
112 |
112 |
115 |
98 |
16 |
112 |
115 |
75 |
16 |
23.0 |
112 |
16 |
add |
112 |
112 |
115 |
98 |
16 |
112 |
115 |
75 |
16 |
23.0 |
112 |
16 |
replace |
112 |
112 |
115 |
98 |
16 |
112 |
115 |
75 |
16 |
23.0 |
112 |
16 |
См. также
- Использование CSS-анимаций
- Свойство composite объекта KeyFrameEffect
- Другие связанные свойства анимации:
animation,animation-delay,animation-direction,animation-duration,animation-fill-mode,animation-iteration-count,animation-name,animation-play-state,animation-timeline,animation-timing-function
© 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-composition