La propriété animation-timeline permet d'associer une animation à autre chose que le temps.
Par défaut, une animation est une variation de la valeur d'une propriété en fonction du temps, compté à partir du chargement de la page (temps 0).
Avec animation-timeline il est possible de faire varier la valeur d'une propriété en fonction d'autre chose que le temps, le plus souvent
le défilement (scrolling) d'un élément.
Par exemple : l'opacité de l'élément ci-dessous est associée à son défilement.
⚠ Attention ! Cela ne fonctionne pas encore avec tous les navigateurs.
En faisant défiler le contenu de cet élément pour en lire la suite, vous constaterez qu'il est de plus en plus difficile de voir les caractères.
En effet, l'opacité de l'élément a été liée à son défilement.
Heureusement que l'opacité ne descend pas à 0 sinon il vous aurait été impossible de lire la fin de ce texte.
Valeurs pour animation-timeline.
animation-timeline: auto;
L'animation est synchronisée sur la ligne de temps du document.
animation-timeline: none;
L'animation n'est associée à aucune ligne de temps, pas même celle du document par défaut : elle ne se déroule plus.
animation-timeline: --xxx;
--xxx est un identifiant précédé d'un double tiret. Il doit avoir été défini avec la propriété scroll-timeline-name ou la propriété résumée
scroll-timeline.
animation-timeline: scroll(block self);
x s
La fonction scroll() accepte deux arguments : l'axe à prendre en compte, et l'élément dont le défilement servira à synchroniser
l'animation.
Le paramètre x peut prendre une des valeurs suivantes :
block
inline
x
y
Les valeurs horizontal et vertical sont reconnues par Firefox mais ne sont pas standardisées.
Le paramètre s peut prendre une des valeurs suivantes :
root : le document dans son ensemble.
nearest : l'élément défilable le plus proche dans les parents.
self : l'élément lui-même : celui sur lequel l'animation est appliquée.
animation-timeline: view(block 50% 10%);
a b c
Avec view() la ligne de temps est calée sur la visibilité d'un élément. Celui-ci doit donc faire partie du contenu qui défile.
a : l'axe à considérer (block, inline, x ou y).
Ce paramètre est optionnel : la valeur est par défaut block.
b : fin de l'animation (coté to de la directive @keyframes). Il s'agit d'un pourcentage ou d'une longueur,
positif ou négatif.
S'il s'agit d'un pourcentage il est calculé par rapport à la dimension de l'élément qui défile, dans le sens de l'axe de défilement.
Dans le cas d'une valeur négative, l'animation démarre alors que l'élément n'est pas encore affiché.
c : début de l'animation (coté from de la directive @keyframes). Un pourcentage ou une longueur, positif ou négatif.
Ces deux valeurs sont calculées conformément au dessin ci-dessous.
Valeurs globales (communes à toutes les propriétés)
Exemples d'utilisation de la propriété animation-timeline.
Un indicateur de défilement.
Voici une petite application amusante de la possibilité de synchroniser la valeur d'une propriété sur un défilement.
Ici, c'est l'angle de rotation d'une image qui est associé au défilement d'un élément.
Cela se traduit par un indicateur en forme d'un compteur de vitesse.
Cet indicateur est composé de deux images : la graduation, qui est fixe, et l'aiguille du compteur, dont l'angle de rotation est associé au défilement de l'élément
autrement dit à la position de la barre de défilement verticale.
Ces deux images sont positionnée en stiky pour ne pas défiler avec le reste du contenu.
Les différents éléments constituant cet exemple sont identifiés de la façon suivante :
container : le conteneur avec défilement.
graduation : l'image représentant la graduation.
indicator : l'image représentant l'aiguille.
content : l'élément contenant le texte.
Attention ! Ce code ne fonctionne pas sur certains navigateur, comme Firefox par exemple.
Cet élément a été défini comme un conteneur avec défilement, condition indispensable pour qu'il puisse piloter une animation.
(overflow-y:scroll;)
Le code réellement nécessaire pour faire fonctionner l'indicateur se résume à la définition d'une animation avec @keyframes et aux quelques
propriétés ci-dessous. Mais le CSS complet comporte de nombreuses autres règles pour dimensionner et positionner les éléments de cet exemple.
L'exemple ci-dessous est construit avec view() : il affiche sur fond orange un partie du texte. L'animation se déroule lorsque cette partie est visible.
Ceci est du texte suffisamment grand pour nécessiter un défilement. Utilisez l'ascenseur pour faire défiler ce texte et déclencher l'animation.
Ceci est la partie où l'animation est appliquée
Exemple d'animation de animation-timeline.
Étant elle-même une propriété définissant les animations, animation-timeline ne peut pas être animée.
Accéder à la propriété animation-timeline par programme.
Les modifications de la propriété animation-timeline sont prises en compte immédiatement. Si l'animation n'est pas encore démarrée, l'effet de
la modification sera visible au prochain démarrage. Si l'animation est déjà en cours, la modification de animation-timeline provoque généralement
un saut dans la progression de l'animation.
Modifier la valeur de animation-timeline en Javascript.
En Javascript, voici comment modifier la valeur de animation-timeline.
On voit que Javascript propose une syntaxe avec la notation kebab-case classique en CSS (un tiret pour séparer les mots),
et une autre syntaxe avec la notation camel-case (une majuscule pour séparer les mots).
let el = document.getElementById('id');
el.style['animation-timeline'] = 'scroll(block self)';
// ou
let el = document.getElementById('id');
el.style.animationTimeline = 'scroll(block self)';
Lire en Javascript la valeur de animation-timeline.
Le code ci-dessous renvoie la valeur de animation-timeline lorsque celle-ci a été affectée via l'attribut style du HTML.
La valeur affectée dans la feuille de styles, via un sélecteur CSS, n'est pas prise en compte.
let el = document.getElementById('id');
let value = el.style['animation-timeline'];
// ou
let el = document.getElementById('id');
let value = el.style.animationTimeline;
Lire la valeur calculée de animation-timeline en Javascript.
La valeur calculée est celle qui résulte de l'évaluation de la cascade des héritages : ce sera en priorité la valeur éventuellement affectée via l'attribut
style du HTML, puis la valeur affectée via un sélecteur CSS (après résolution des contradictions en fonction des priorités des sélecteur),
une valeur héritée, ou enfin la valeur initiale de animation-timeline.
Dans le cas de animation-timeline, la valeur est renvoyée en secondes, quelque soit l'unité utilisée pour la définir.
Si plusieurs animations sont associées à l'élément, les différentes valeurs de animation-timeline sont renvoyées séparées par des virgules.
let el = document.getElementById('id');
let value = window.getComputedStyle(el).getPropertyValue('animation-timeline');
Modifier la valeur de la propriété animation-timeline avec JQuery.
$('#id').css('animation-timeline', 'scroll(block self)'); // ou $('#id').css('animationTimeline', 'scroll(block self)');
Lire la valeur calculée de la propriété animation-timeline avec JQuery.
Comme en Javascript, la ou les valeurs de animation-timeline sont retournées en secondes.
let value = $('#id').css('animation-timeline');
Testez vous-même.
Les deux boutons ci-dessous appliquent une valeur à la propriété animation-timeline. Ils relisent ensuite, soit la valeur affectée pour le premier bouton,
soit la valeur calculée pour le deuxième. Ce deuxième bouton vous permet de visualiser comment sont mémorisées les différentes valeurs pour la propriété.
Si votre navigateur ne reconnaît pas les animations pilotées par un défilement, la valeur calculée sera vide.
Exemple interactif avec la propriété animation-timeline.
L'élément ci-dessous est défini comme un container avec défilement. Utilisez l'ascenseur pour activer l'animation : changement de la couleur du fond.
animation-timeline :
Cet élément a été défini comme un conteneur avec défilement, condition indispensable pour qu'il puisse piloter une animation.
Utiliser l'ascenseur pour faire défiler ce container et pour activer l'animation : le fond doit passer progressivement du blanc au noir.
Compatibilité des navigateurs avec animation-timeline.
Sur Firefox , les fonctionnalités de la propriété animation-timeline sont désactivées par défaut. Elle peuvent être activées en fixant à true
l'option layout.css.scroll-driven-animation.enabled (2024). Voir accéder aux flags sur Firefox.
Colonne 1
Support de la propriété animation-timeline. Sur Firefox cette fonctionnalité doit être activée.
Colonne 2
Support de la fonction view() utilisée avec la propriété animation-timeline.
Colonne 3
Support de la fonction scroll() utilisée avec la propriété animation-timeline.
Remarques :
(1) Désactivé par défaut. Peut être activé en positionnant le flag layout.css.scroll-driven-animations.enabled à true.
1
Propriété animation-timeline
2
Fonction view()
3
Fonction scroll()
Estimation de la prise en charge globale.
74%
74%
74%
Navigateurs sur ordinateurs :
Navigateurs sur mobiles :
Navigateurs obsolètes ou marginaux :
Internet Explorer
UC Browser pour Androïd
Opéra Mobile
QQ Browser
Baidu Browser
Opéra
Samsung Internet
Firefox pour Androïd
Edge
Firefox
1
1
1
Chrome pour Androïd
Androïd Brower
Safari
Safari sur IOS
Chrome
KaiOS Browser
Opéra mini
Voir le site Caniuse.com pour plus d'informations de compatibilité.
Toutes les définitions concernant les animations en CSS sont regroupées dans la spécification "Module CSS - Animations" (voir CSS Animations).
La propriété animation-timeline, ainsi que les suivantes, figurent donc dans cette spécification.
Définit le nom d'une animation et quelles sont les propriétés qui sont animées.
Et à propos des animations pilotées par un défilement.
Les animations pilotées par un défilement (Scroll-driven Animations) sont quant à elles décrites dans un module de spécification à part :
Scroll-driven Animations.