Четыре новые функции CSS для плавной анимации входа и выхода
Рассмотрели четыре новые функции CSS, которые обеспечивают плавную анимацию и переходы в Chrome 116 и 117.
3К открытий6К показов
Noveo Lead Web Developer Екатерина продолжает делиться с коллегами переводами полезных статей. В этот раз речь пойдет о создании плавных анимаций на веб-платформе: с новыми функциями Chrome 116 и 117 возможностей стало больше!
Движение является ключевой частью любого цифрового опыта, направляя пользователя от одного взаимодействия к следующему. Однако существуют определенные пробелы в плавных анимациях на веб-платформе. Сюда входит возможность легко создавать анимации для входа и выхода, а также плавно анимировать переход на верхний уровень для закрываемых элементов, таких как диалоговые окна и всплывающие панели.
Чтобы заполнить эти пробелы, в Chrome 116 и 117 включены четыре новые функции веб-платформы, которые обеспечивают плавную анимацию и переходы для отдельных свойств:
- Возможность анимировать display и content-visibility на временной шкале ключевых кадров (начиная с Chrome 116).
- Свойство transition-behavior с ключевым словом allow-discrete для включения переходов дискретных свойств, таких как display (начиная с Chrome 117).
- Правило @starting-style для анимации эффектов входа из display: none и в верхний уровень (из Chrome 117).
- Свойство overlay для управления поведением верхнего слоя при анимации (из Chrome 117).
Отображение анимации в ключевых кадрах
Начиная с версии Chrome 116, вы можете использовать свойства display и content-visibility в правилах ключевых кадров. Они будут автоматически меняться в момент наступления ключевого кадра. Для поддержки этой функции не требуется использовать дополнительные новые значения:
Другиедискретные свойства меняют состояния, когда функция плавности перехода достигает отметки 50% времени работы. Однако свойства display и content-visibility переключаются в начале перехода (если вы анимируете вход) или в конце его (если вы анимируете выход).
В приведенном примере анимация плавно уменьшает непрозрачность до 0 за 0.5 секунды, после чего устанавливает свойство display в none. Кроме того, ключевое слово “forwards” гарантирует, что анимация сохраняет свое конечное состояние. Таким образом, элемент, к которому она применена, остается с display: none и opacity: 0.
Это простой пример, который имитирует то, что можно сделать с помощью перехода (см. демонстрацию в разделе о переходах). Тем не менее, переходы не способны создавать более сложные анимации, как показано в следующем примере:
Анимация “spin-and-delete” представляет собой анимацию выхода. Сначала карта будет вращаться вокруг оси Y, затем будет осуществляться изменение оттенка цвета и при достижении 80% времени анимации непрозрачность карты будет изменяться с 1 на 0. Наконец, карта переходит из состояния display: block в состояние display: none.
Для этих анимаций выхода, вместо их применения непосредственно к элементу, можно настроить триггер для анимаций. Например, можно добавить к кнопке прослушиватель событий, который активирует класс для применения анимации, как показано ниже:
В приведенном выше примере теперь конечным состоянием является display:none. Существует много случаев, когда вы захотите пойти дальше и удалить узел DOM с задержкой, чтобы сначала дать анимации завершиться.
Переход дискретной анимации
В отличие от анимации дискретных свойств с помощью ключевых кадров, для перехода между дискретными свойствами вам потребуется использовать режим поведения allow-discrete.
Свойство transition-behavior
Режим «allow-discrete» делает возможными дискретные переходы и является значением свойства «transition-behavior». transition-behavior принимает два значения: нормальное и разрешающе-дискретное.
Есливы используете сокращение transition, обязательно используйте transition-behavior после сокращения, чтобы оно применялось в зависимости от специфики.
В этой демонстрации перехода используется не такая техника, как в первой анимационной демонстрации, но с визуальной точки зрения они выглядят похожими.
Сокращенная запись transition также устанавливает это значение, поэтому вы можете опустить свойство и использовать ключевое слово “allow-discrete” в конце сокращенной записи для каждого transition вместо этого.
Если вы анимируете несколько дискретных свойств, вам нужно будет включить параметр allow-discrete после каждого свойства, которое вы хотите анимировать. Например:
Совет: вы всегда можете включить дискретную анимацию с помощью * {transition-behavior: allow-discrete}, но убедитесь, что это находится в конце вашего CSS, чтобы предотвратить конфликты специфичности с сокращением transition.
Правило для анимации входа @starting-style
До сих пор в этой статье рассматривались анимации выхода. Для создания анимации входа вам необходимо использовать правило @starting-style.
Используйте @starting-style, чтобы применить стиль, который браузер сможет найти до того, как элемент будет открыт на странице. Это состояние «до открытия» (из которого вы выполняете анимацию).
Теперь у вас есть состояние входа и выхода для этих элементов списка TODO:
Анимация элементов в верхнем слое и обратно
Чтобы анимировать элементы верхнего слоя в режиме “открыто” и “закрыто”, укажите @starting-style в состоянии “open”, чтобы сообщить браузеру, откуда выполнять анимацию. Для диалогового окна состояние “открыто” определяется атрибутом [open]. Для всплывающих окон используйте псевдокласс :popover-open.
Простой пример диалога может выглядеть так:
В следующем примере эффекты при входе и выходе разные. При входе элемент анимируется, появляясь внизу видимой области и двигаясь наверх, а при выходе – исчезая вверху видимой области. Кроме того, этот пример написан с использованием вложенного CSS для более наглядной инкапсуляции стилей.
При анимации всплывающего окна используйте псевдокласс :popover-open вместо ранее использованного атрибута open.
Свойство overlay
И наконец, чтобы плавно скрыть popover или dialog из верхнего слоя, добавьте свойство overlay в список ваших переходов. Popover или dialog обходят родительские клипы и трансформации, а также помещают контент в верхний слой. Если вы не анимируете свойство overlay, ваш элемент сразу же вернется к обрезанию и трансформации и будет закрыт, так что вы не увидите анимации его скрытия.
Вместо этого включите overlay в переход или анимацию, чтобы анимировать overlay вместе с остальными функциями и убедиться, что оно остается в верхнем слое при анимации. Это будет выглядеть намного более гладко.
Кроме того, когда у вас открыто несколько элементов в верхнем слое, использование свойства overlay помогает контролировать плавные переходы в верхний слой и из него. Вы можете увидеть разницу в этом простом примере. Если вы не применяете свойство overlay ко второму всплывающему окну при его скрытии, оно сначала переместится из верхнего слоя, скрывшись за другим всплывающим окном, прежде чем начнется анимация. Этот эффект не выглядит очень плавным.
Примечание о переходах между видами
Если вы вносите изменения в DOM, такие как добавление и удаление элементов, еще одним отличным способом создания плавных анимаций являются переходы между видами. Вот два из приведенных выше примеров, созданных с использованием межвидовых переходов.
В этой первой демонстрации вместо настройки @starting-style и других преобразований CSS переходы будут обрабатываться переходами представлений. Переход вида настраивается следующим образом:
Во-первых, в CSS присвойте каждой карточке индивидуальный view-transition-name:
Затем в JavaScript оберните мутацию DOM (в данном случае удаление карты) в переход представления.
Теперь браузер может обрабатывать затухание и преобразование каждой карты в новое положение.
Еще одним примером, где это может быть полезно, является демонстрация добавления и удаления элементов из списка. В этом случае вам нужно будет помнить о добавлении уникального имени перехода между видами (view-transition-name) для каждой создаваемой карточки.
Заключение
Эти новые функции платформы приближают нас к созданию плавных анимаций при входе и выходе на веб-платформе. Чтобы узнать больше, ознакомьтесь с этими ссылками:
3К открытий6К показов