Заменять, добавлять или накапливать? Вот в чём вопрос.
Объединение нескольких анимационных эффектов
Свойство animation-composition позволяет контролировать то, что должно происходить, когда несколько анимаций одновременно воздействуют на одно и то же свойство.
Допустим, к элементу применено следующее базовое преобразование:
transform-origin: 50% 50%;
transform: translateX(50px) rotate(45deg);
И у вас также есть этот набор ключевых кадров:
@keyframes adjust {
to {
transform: translateX(100px);
}
}
При применении этих ключевых кадров к элементу transform в ключевом кадре to заменяет существующее transform . Это поведение по умолчанию.
С помощью animation-composition вы теперь можете управлять тем, что должно происходить вместо стандартного replace . Допустимые значения:
-
replace: значение эффекта заменяет базовое значение. (по умолчанию) -
add: значение эффекта добавляется к базовому значению. -
accumulate: значение эффекта объединяется с базовым значением.
Разница между сложением и накоплением тонка. Например, возьмём два значения blur(2) и blur(3) . При сложении они дадут blur(2) blur(3) , а при сложении — blur(5) .
Это можно сравнить с чашкой, наполненной чаем. Если налить в неё молоко, то произойдёт следующее:
-
replace: чай убирается и заменяется молоком. -
add: молоко добавляется в чашку, но остается слоем поверх чая. -
accumulate: молоко добавляется в чай, и, поскольку они оба являются жидкостями, они хорошо смешиваются.
Демо
В демонстрации ниже показаны три серых блока, к которым применена базовая transform и animation .
Несмотря на то, что эти блоки имеют одинаковую анимацию, они дают разный результат, поскольку у них разный набор animation-composition :
Для первого поля задано значение animation-composition: replace . Это поведение по умолчанию. В конечном положении исходное значение translateX(50px) rotate(45deg) для transform просто заменяется на translateX(100px) .
Для второго блока задано значение animation-composition: add . В конечном положении translateX(100px) добавляется к исходному translateX(50px) rotate(45deg) , в результате чего получается translateX(50px) rotate(45deg) translateX(100px) . Это перемещает блок на 50 пикселей, затем поворачивает его на 45 градусов, а затем перемещает на 100 пикселей.
Третье поле настроено на animation-composition: accumulate . В конечном положении translateX(100px) будет математически добавлен к translateX(50px) исходного преобразования, что приведет к преобразованию translateX(150px) rotate(45deg) .
Фото Алекса Бойда на Unsplash