transition-behavior
Базовая версия 2024
Новое
С августа 2024 года эта функция работает на последних версиях устройств и браузеров. Возможно, эта функция не будет работать на старых устройствах или браузерах.
Свойство transition-behavior CSS определяет, будут ли инициированы переходы для свойств, поведение анимации которых является дискретным.
Синтаксис
/* Keyword values */ transition-behavior: allow-discrete; transition-behavior: normal; /* Global values */ transition-behavior: inherit; transition-behavior: initial; transition-behavior: revert; transition-behavior: revert-layer; transition-behavior: unset;
Значения
allow-discrete-
Переходы будут инициированы на элементе для дискретных анимированных свойств.
normal-
Переходы не будут инициированы на элементе для дискретных анимированных свойств.
Описание
Свойство transition-behavior актуально только при совместном использовании с другими свойствами переходов, особенно с transition-property и transition-duration, так как переход не происходит, если свойства не анимируются в течение ненулевого промежутка времени.
.card {
transition-property: opacity, display;
transition-duration: 0.25s;
transition-behavior: allow-discrete;
}
.card.fade-out {
opacity: 0;
display: none;
}
Значение transition-behavior может быть включено в качестве части объявления короткой записи transition. Когда оно включено в короткую запись, при использовании или по умолчанию для всех свойств, значение allow-discrete не влияет на обычные анимируемые свойства. Следующий CSS эквивалентен объявлениям выше:
.card {
transition: all 0.25s;
transition: all 0.25s allow-discrete;
}
.card.fade-out {
opacity: 0;
display: none;
}
В приведенном выше фрагменте свойство transition указано дважды. Первый случай не включает значение allow-discrete — это обеспечивает кроссбраузерную поддержку, гарантируя, что другие свойства карточки по-прежнему будут переходить в браузерах, которые не поддерживают transition-behavior.
Дискретное поведение анимации
Дискретно анимируемые свойства обычно переключаются между двумя значениями на 50% пути анимации между ними.
Однако существует исключение, когда анимация выполняется к или от display: none или content-visibility: hidden. В этом случае браузер будет переключаться между двумя значениями таким образом, что переходящий контент будет отображаться в течение всей длительности анимации.
Например:
- При анимации
displayотnoneдоblock(или другого видимогоdisplayзначения), значение переключится наblockв0%длительности анимации, чтобы оно было видно на протяжении всего времени. - При анимации
displayотblock(или другого видимогоdisplayзначения) доnone, значение переключится наnoneв100%длительности анимации, чтобы оно было видно на протяжении всего времени.
Формальное определение
| Начальное значение | normal |
|---|---|
| Применимо к | всем элементам |
| Наследуется | нет |
| Вычисленное значение | как указано |
| Тип анимации | Не анимируется |
Формальный синтаксис
Примеры
Анимация всплывающей подсказки
В этом примере всплывающая подсказка popover анимируется при переходе из скрытого состояния в видимое и обратно.
HTML
HTML содержит элемент <div>, объявленный как всплывающая подсказка с помощью атрибута popover, и элемент <button>, обозначенный как элемент управления отображением всплывающей подсказки с помощью атрибута popovertarget.
<button popovertarget="mypopover">Show the popover</button> <div popover="auto" id="mypopover">I'm a Popover! I should animate.</div>
CSS
[popover]:popover-open {
opacity: 1;
transform: scaleX(1);
}
[popover] {
/* Final state of the exit animation */
opacity: 0;
transform: scaleX(0);
transition-property: opacity, transform, overlay, display;
transition-duration: 0.7s;
transition-behavior: allow-discrete;
/* Using the shorthand transition property, we could write:
transition:
opacity 0.7s,
transform 0.7s,
overlay 0.7s allow-discrete,
display 0.7s allow-discrete;
or even:
transition: all 0.7s allow-discrete;
*/
}
/* Needs to be included after the previous [popover]:popover-open
rule to take effect, as the specificity is the same */
@starting-style {
[popover]:popover-open {
opacity: 0;
transform: scaleX(0);
}
}
Два свойства, которые мы хотим анимировать, это opacity и transform: мы хотим, чтобы всплывающая подсказка появлялась и исчезала, одновременно увеличиваясь и уменьшаясь в горизонтальном направлении. Мы задаём начальное состояние этих свойств в скрытом состоянии элемента всплывающей подсказки (выбирается с помощью [popover]), и конечное состояние в открытом состоянии всплывающей подсказки (выбирается с помощью псевдокласса :popover-open). Затем мы устанавливаем свойство transition для анимации между двумя состояниями.
Поскольку анимируемый элемент переносится на верхний уровень при отображении и удаляется с верхнего уровня при скрытии (а также, это означает, что для его скрытого состояния установлено свойство display: none), следующие свойства добавляются в список анимируемых элементов, чтобы анимация работала в обоих направлениях. В обоих случаях transition-behavior: allow-discrete устанавливается в сокращённой форме для включения дискретной анимации.
-
display: Требуется, чтобы анимируемый элемент был видимым (установлено значениеdisplay: block) на протяжении всей анимации входа и выхода. Без этого анимация выхода не будет видна; по сути, всплывающая подсказка просто исчезнет. -
overlay: Требуется для того, чтобы удаление элемента с верхнего уровня откладывалось до завершения анимации. Это не имеет большого значения для простых анимаций, таких как эта, но в более сложных случаях без этого элемент может быть удалён с верхнего слоя слишком быстро, что означает, что анимация не будет плавной или эффективной.
Кроме того, начальное состояние для анимации устанавливается внутри правила @starting-style. Это необходимо для предотвращения неожиданного поведения. По умолчанию, переходы не запускаются при первых обновлениях стиля элементов или когда тип display меняется с none на другой тип. @starting-style позволяет вам переопределить это значение по умолчанию определённым образом. Без этого анимация входа не произойдёт, и всплывающая подсказка просто отобразится.
Результат
Код отображается следующим образом:
Примечание: Поскольку всплывающие подсказки меняют своё состояние с display: none на display: block каждый раз, когда они отображаются, всплывающая подсказка переходит от своих стилей @starting-style к своим стилям [popover]:popover-open каждый раз, когда происходит анимация входа. Когда всплывающая подсказка закрывается, она переходит от её состояния [popover]:popover-open к стандартному состоянию [popover].
В таких случаях переход стиля при входе и выходе может отличаться. См. наш пример Демонстрация использования начальных стилей для доказательства этого.
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
transition-behavior |
117 | 117 | 129 | 103 | 17.4 | 117 | 129 | 78 | 17.4 | 24.0 | 117 |
См. также
overlay@starting-style- Переходы CSS модуль
- Четыре новых возможности CSS для плавных анимаций входа и выхода на developer.chrome.com (2023)
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/transition-behavior