Le mouvement est un élément essentiel de toute expérience numérique, car il guide l'utilisateur d'une interaction à l'autre. Cependant, il existe quelques lacunes dans les animations fluides sur la plate-forme Web. Vous pouvez par exemple animer facilement des animations d'entrée et de sortie, et animer de manière fluide vers et depuis la couche supérieure pour les éléments pouvant être ignorés, tels que les boîtes de dialogue et les pop-ups.
Pour combler ces lacunes, Chrome 116 et Chrome 117 inclut quatre nouvelles fonctionnalités de plate-forme Web, qui permettent des animations et des transitions fluides pour les propriétés discrètes.
Ces quatre nouvelles fonctionnalités sont les suivantes:
- Possibilité d'animer
display
etcontent-visibility
sur une timeline d'image clé (dans Chrome 116). - Propriété
transition-behavior
avec le mot cléallow-discrete
pour permettre des transitions de propriétés discrètes telles quedisplay
(depuis Chrome 117). - La règle
@starting-style
pour animer les effets d'entrée depuisdisplay: none
et dans la couche supérieure (depuis Chrome 117). - Propriété
overlay
permettant de contrôler le comportement de la couche supérieure lors d'une animation (depuis Chrome 117).
Afficher des animations dans des images clés
À partir de Chrome 116, vous pouvez utiliser display
et content-visibility
dans les règles d'image clé. Ceux-ci sont alors échangés au moment où l'image clé se produit. Aucune nouvelle valeur supplémentaire n'est requise pour cela:
.card {
animation: fade-out 0.5s forwards;
}
@keyframes fade-out {
100% {
opacity: 0;
display: none;
}
}
L'exemple précédent anime l'opacité sur 0 pour une durée de 0,5 s, puis définit l'affichage sur "aucun". De plus, le mot clé forwards
garantit que l'animation reste à son état final, de sorte que l'élément auquel elle est appliquée reste display: none
et opacity: 0
.
Cet exemple simple reprend le fonctionnement d'une transition (voir la démonstration dans la section relative à la transition). Toutefois, les transitions ne sont pas en mesure de créer des animations plus complexes, telles que l'exemple suivant:
.card {
animation: spin-and-delete 1s ease-in forwards;
}
@keyframes spin-and-delete {
0% {
transform: rotateY(0);
filter: hue-rotate(0);
}
80% {
transform: rotateY(360deg);
filter: hue-rotate(180deg);
opacity: 1;
}
100% {
opacity: 0;
display: none;
}
}
L'animation spin-and-delete
est une animation de sortie. Tout d'abord, la carte pivote sur l'axe Y, effectue une rotation des teintes, puis fait passer son opacité de 1 à 0 à 80%
dans la chronologie. Enfin, la carte passe de display: block
à display: none
.
Pour ces animations de sortie, au lieu de les appliquer directement à un élément, vous pouvez configurer un déclencheur pour les animations. Par exemple, en associant un écouteur d'événements à un bouton qui déclenche l'application de l'animation par une classe, comme suit:
.spin-out {
animation: spin-and-delete 1s ease-in forwards;
}
document.querySelector('.delete-btn').addEventListener('click', () => {
document.querySelector('.card').classList.add('spin-out');
})
L'exemple ci-dessus présente désormais un état final défini sur display:none
. Dans de nombreux cas, il peut être utile d'aller plus loin et de supprimer le nœud DOM avec un délai d'inactivité afin de permettre à l'animation de se terminer en premier.
Ajouter des transitions à des animations discrètes
Contrairement à l'animation de propriétés discrètes avec des images clés, vous devez utiliser le mode de comportement de transition allow-discrete
pour effectuer la transition de propriétés discrètes.
Propriété transition-behavior
Le mode allow-discrete
rend possibles les transitions discrètes. Il s'agit d'une valeur de la propriété transition-behavior
. transition-behavior
accepte deux valeurs: normal
et allow-discrete
.
.card {
transition: opacity 0.25s, display 0.25s;
transition-behavior: allow-discrete; /* Note: be sure to write this after the shorthand */
}
.card.fade-out {
opacity: 0;
display: none;
}
Le raccourci transition
définit également cette valeur. Vous pouvez donc omettre la propriété et utiliser le mot clé allow-discrete
à la fin du raccourci transition
pour chaque transition.
.card {
transition: opacity 0.5s, display 0.5s allow-discrete;
}
.card.fade-out {
opacity: 0;
display: none;
}
Si vous animez plusieurs propriétés discrètes, vous devez inclure allow-discrete
après chaque propriété que vous souhaitez animer. Exemple :
.card {
transition: opacity 0.5s, display 0.5s allow-discrete, overlay 0.5s allow-discrete;
}
.card.fade-out {
opacity: 0;
display: none;
}
La règle @starting-style
pour les animations d'entrée
Pour l'instant, cet article traite des animations de sortie. Pour créer des animations d'entrée, vous devez utiliser la règle @starting-style
.
Utilisez @starting-style
pour appliquer un style que le navigateur peut rechercher avant que l'élément ne soit ouvert sur la page. Il s'agit de l'état "avant ouverture" (à partir duquel vous créez l'animation).
/* 0. BEFORE-OPEN STATE */
/* Starting point for the transition */
@starting-style {
.item {
opacity: 0;
height: 0;
}
}
/* 1. IS-OPEN STATE */
/* The state at which the element is open + transition logic */
.item {
height: 3rem;
display: grid;
overflow: hidden;
transition: opacity 0.5s, transform 0.5s, height 0.5s, display 0.5s allow-discrete;
}
/* 2. EXITING STATE */
/* While it is deleting, before DOM removal in JS, apply this
transformation for height, opacity, and a transform which
skews the element and moves it to the left before setting
it to display: none */
.is-deleting {
opacity: 0;
height: 0;
display: none;
transform: skewX(50deg) translateX(-25vw);
}
Vous disposez maintenant d'un état d'entrée et de sortie pour ces éléments de liste de tâches:
Animer des éléments vers et depuis la couche supérieure
Pour animer des éléments vers et depuis la couche supérieure, spécifiez @starting-style
à l'état "ouvert" afin d'indiquer au navigateur d'où s'effectue l'animation. Pour une boîte de dialogue, l'état ouvert est défini avec l'attribut [open]
. Pour un pop-up, utilisez la pseudo-classe :popover-open
.
Voici un exemple simple de boîte de dialogue:
/* 0. BEFORE-OPEN STATE */
@starting-style {
dialog[open] {
translate: 0 100vh;
}
}
/* 1. IS-OPEN STATE */
dialog[open] {
translate: 0 0;
}
/* 2. EXIT STATE */
dialog {
transition: translate 0.7s ease-out, overlay 0.7s ease-out allow-discrete, display 0.7s ease-out allow-discrete;
translate: 0 100vh;
}
Dans l'exemple suivant, les effets d'entrée et de sortie sont différents. Lancez une animation à partir du bas de la fenêtre d'affichage et quittez l'effet pour remonter vers le haut de la fenêtre d'affichage. Il est également écrit avec du CSS imbriqué pour une encapsulation visuelle plus importante.
Lorsque vous animez un pop-up, utilisez la pseudo-classe :popover-open
au lieu de l'attribut open
utilisé précédemment.
.settings-popover {
&:popover-open {
/* 0. BEFORE-OPEN STATE */
/* Initial state for what we're animating *in* from,
in this case: goes from lower (y + 20px) to center */
@starting-style {
transform: translateY(20px);
opacity: 0;
}
/* 1. IS-OPEN STATE */
/* state when popover is open, BOTH:
what we're transitioning *in* to
and transitioning *out* from */
transform: translateY(0);
opacity: 1;
}
/* 2. EXIT STATE */
/* Initial state for what we're animating *out* to ,
in this case: goes from center to (y - 50px) higher */
transform: translateY(-50px);
opacity: 0;
/* Enumerate transitioning properties,
including display and allow-discrete mode */
transition: transform 0.5s, opacity 0.5s, display 0.5s allow-discrete;
}
overlay
établissement
Enfin, pour effectuer un fondu d'une popover
ou d'une dialog
à partir de la couche supérieure, ajoutez la propriété overlay
à votre liste de transitions. popover
et dialog
échappent les extraits ancêtres et les transformations, et placent également le contenu dans la couche supérieure. Si vous n'effectuez pas de transition overlay
, l'élément est immédiatement rogné, transformé et recouvert, et la transition ne se produit pas.
[open] {
transition: opacity 1s, display 1s allow-discrete;
}
À la place, incluez overlay
dans la transition ou l'animation pour animer overlay
avec les autres fonctionnalités et assurez-vous qu'il reste dans la couche supérieure lors de l'animation. Le rendu sera beaucoup plus fluide.
[open] {
transition: opacity 1s, display 1s allow-discrete, overlay 1s allow-discrete;
}
De plus, lorsque plusieurs éléments sont ouverts dans la couche supérieure, la superposition vous aide à contrôler la transition fluide entre la couche supérieure et la couche supérieure. Pour voir la différence, consultez cet exemple simple. Si vous n'appliquez pas overlay
au deuxième pop-up lors de la transition, il sortira d'abord de la couche supérieure, puis passera derrière l'autre pop-up avant de lancer la transition. Cet effet n'est pas très fluide.
Remarque sur les transitions de vue
Si vous apportez des modifications au DOM, par exemple en ajoutant et en supprimant des éléments, les transitions entre les vues constituent une autre solution idéale pour créer des animations fluides. Voici deux des exemples ci-dessus créés à l'aide de transitions de vue.
Dans cette première démonstration, au lieu de configurer @starting-style
et d'autres transformations CSS, les transitions de vue géreront la transition. La transition d'affichage est configurée comme suit:
Tout d'abord, en CSS, vous devez attribuer un view-transition-name
individuel à chaque fiche.
.card-1 {
view-transition-name: card-1;
}
.card-2 {
view-transition-name: card-2;
}
/* etc. */
Ensuite, en JavaScript, encapsulez la mutation DOM (dans ce cas, en supprimant la carte) dans une transition de vue.
deleteBtn.addEventListener('click', () => {
// Check for browser support
if (document.startViewTransition) {
document.startViewTransition(() => {
// DOM mutation
card.remove();
});
}
// Alternative if no browser support
else {
card.remove();
}
})
Désormais, le navigateur peut gérer le fondu et la transformation de chaque carte à sa nouvelle position.
La démo peut également vous aider à ajouter/supprimer des éléments de liste. Dans ce cas, n'oubliez pas d'ajouter un view-transition-name
unique pour chaque fiche créée.
Conclusion
Ces nouvelles fonctionnalités nous rapprochent de la fluidité des animations d'entrée et de sortie sur la plate-forme Web. Pour en savoir plus, consultez ces liens: