Animations

Animations d'entrée au scroll, de sortie, et au clic. Respect automatique de prefers-reduced-motion.

Animations d'entrée (scroll)

Ajoutez simplement une classe CSS. L'élément s'anime quand il entre dans le viewport :

fade-in
fade-in-up
fade-in-down
fade-in-left
fade-in-right
scale-in
scale-in-up
slide-in-up
slide-in-down
slide-in-left
slide-in-right
rotate-in
ClasseEffet
anim-fade-inFondu
anim-fade-in-upFondu + montée
anim-fade-in-downFondu + descente
anim-fade-in-leftFondu depuis la gauche
anim-fade-in-rightFondu depuis la droite
anim-scale-inZoom avant
anim-scale-in-upZoom + montée
anim-slide-in-upGlissement depuis le bas (fort)
anim-slide-in-downGlissement depuis le haut (fort)
anim-slide-in-leftGlissement depuis la gauche
anim-slide-in-rightGlissement depuis la droite
anim-rotate-inRotation + zoom
<div class="anim-fade-in-up">Je m'anime au scroll</div>

Éléments above-the-fold

Les éléments déjà visibles dans le viewport au chargement de la page sont rendus visibles immédiatement, sans transition. Cela évite un flash invisible (l'élément commence en opacity: 0) et garantit un bon score Largest Contentful Paint (LCP) pour les performances Lighthouse.

Ce comportement est automatique — aucune configuration nécessaire. Les éléments hors viewport s'animent normalement au scroll. Si l'élément a l'attribut data-anim-exit, il reste observé pour les ré-entrées.

Implémentation technique : la détection above-the-fold est exécutée par animations.js immédiatement à son chargement (script defer), c'est‑à‑dire avant DOMContentLoaded. Dès que le body est parsé, la fonction collecte les éléments visibles au premier rendu et déclenche leur animation via requestAnimationFrame : le navigateur peint d'abord l'état initial (opacity 0) puis joue la transition vers .anim--visible, ce qui ramène le LCP des éléments hero animés très près du FCP tout en gardant l'animation visible.

Protection contre les conflits CSS : les classes anim-* définissent leurs transition-property, transition-duration, transition-timing-function et transition-delay avec !important. Sans cela, n'importe quelle règle CSS projet définissant transition: <autre-prop> <duration> en shorthand reseterait les 4 sous-propriétés et casserait silencieusement les animations framework — l'élément sauterait instantanément à opacity: 1 sans fade. Les modificateurs .anim--delay-*, .anim--duration-* et .anim--ease-* sont eux aussi en !important pour pouvoir surcharger la base.

Modificateurs

Délai

ClasseDélai
anim--delay-1 à anim--delay-10100ms à 1000ms (incréments de 100ms)

Durée

ClasseDurée
anim--duration-fast300ms
anim--duration-slow1000ms
anim--duration-slower1500ms

Easing

ClasseEffet
anim--ease-bounceRebond à l'arrivée
anim--ease-elasticÉlastique
anim--ease-smoothDoux (décélération)
<div class="anim-fade-in-up anim--delay-3 anim--ease-bounce">
  Fondu + montée, délai 300ms, rebond
</div>

Animations de sortie

Ajoutez data-anim-exit="true" pour que l'animation se redéclenche quand l'élément sort et revient dans le viewport :

<div class="anim-fade-in-up" data-anim-exit="true">
  Animation re-déclenchable
</div>

Animations au clic

ClasseEffet
anim-click-pulsePulsation
anim-click-shakeSecousse
anim-click-bounceRebond vertical
anim-click-rippleEffet ripple Material Design
<button class="btn btn--primary anim-click-ripple">
  Cliquez-moi
</button>

Animations SVG

Animez vos SVG au scroll avec des classes simples. Idéal pour les icônes, graphiques et illustrations.

SVG draw
SVG draw-fade
SVG fade-up

Dessin de tracé (stroke)

Utilisez --svg-length pour définir la longueur du tracé (approximative, en pixels) :

<svg viewBox="0 0 120 120" fill="none" stroke="currentColor" stroke-width="3">
  <circle class="anim-svg-draw" style="--svg-length: 283;"
          cx="60" cy="60" r="45" />
  <path class="anim-svg-draw anim--delay-3" style="--svg-length: 60;"
        d="M40 60 L55 75 L80 45" />
</svg>
ClasseEffet
anim-svg-drawDessin progressif du tracé (stroke)
anim-svg-draw-fadeDessin + fondu d'apparition
anim-svg-fadeFondu simple (pour les éléments fill)
anim-svg-fade-upFondu + montée

Variable --svg-length

Définissez la longueur approximative du tracé SVG pour que l'animation fonctionne correctement. Vous pouvez obtenir cette valeur avec path.getTotalLength() dans la console.

Pour trouver cette valeur : ouvrez votre navigateur, faites F12 (outils développeur), allez dans l'onglet Console, collez document.querySelector('svg path').getTotalLength() et appuyez sur Entrée. Copiez le nombre affiché.

Modificateurs SVG

ClasseDurée
anim-svg--fast0.8s
anim-svg--slow2.5s
anim-svg--slower4s

Les modificateurs de délai standards (anim--delay-1 à anim--delay-10) fonctionnent également avec les animations SVG.

Animations Variable Font

Animez le poids des polices variables (comme Inter). Si la police n'est pas variable, l'animation est ignorée.

Hover : survolez ce titre

Scroll : apparition au scroll

Loop : boucle 200→900

ClasseEffet
anim-font-weight-hoverPoids 400→700 au survol
anim-font-weight-scrollPoids 400→700 au scroll
anim-font-weight-loopBoucle 400↔700 infinie
<h2 class="anim-font-weight-hover">Survolez-moi</h2>
<h2 class="anim-font-weight-scroll">Au scroll</h2>
<h2 class="anim-font-weight-loop">Boucle</h2>

<!-- Custom -->
<h2 class="anim-font-weight-loop"
    data-font-from="200"
    data-font-to="900"
    data-font-duration="3s">
  Boucle custom
</h2>
AttributDéfautDescription
data-font-from400Poids de départ
data-font-to700Poids d'arrivée
data-font-duration0.4s / 2s (loop)Durée

Animations de texte

Animez du texte caractère par caractère au scroll. Compatible avec tous les éléments texte : h1h6, p, span, a, etc.

Rise : montée caractère par caractère

Fade : fondu progressif

Drop : descente depuis le haut

Slide : glissement latéral fluide

Scale : effet zoom

Blur : dévoilement progressif

Fade : fondu progressif

Chaque caractère apparaît avec un fondu d’opacité (0 → 1). L’effet est doux et subtil, idéal pour les sous‑titres et paragraphes :

<h2 data-text-anim="fade" data-text-anim-stagger="50">Fondu progressif</h2>

Scale : effet zoom

Chaque caractère apparaît avec un effet de zoom (scale 0 → 1). L’effet est plus marqué, idéal pour les titres percutants :

<h3 data-text-anim="scale" data-text-anim-stagger="25">Effet zoom</h3>

Utilisation

Ajoutez data-text-anim sur n'importe quel élément texte :

<h1 data-text-anim>Mon titre animé</h1>

<!-- Avec type spécifique -->
<h2 data-text-anim="fade">Fondu progressif</h2>

<!-- Avec options -->
<p data-text-anim="rise"
   data-text-anim-stagger="40"
   data-text-anim-duration="800">
  Texte animé personnalisé
</p>

Types d'animation

ValeurEffet
rise (défaut)Montée depuis le bas
fadeFondu progressif
dropDescente depuis le haut
slideGlissement latéral
scaleZoom (scale 0 → 1)
blurFlou + fondu

Attributs

AttributDéfautDescription
data-text-animriseType d'animation (requis)
data-text-anim-stagger30Délai entre caractères (ms)
data-text-anim-duration600Durée par caractère (ms)
data-text-anim-delay0Délai d'apparition global avant le début de l'animation (ms)
data-text-anim-easingcubic-bezier(...)Easing CSS
data-text-anim-exitRe-déclenche au re-scroll

Séquencer plusieurs éléments

Utilisez data-text-anim-delay pour décaler les animations et créer un effet de séquence :

<h1 data-text-anim="rise">Premier titre</h1>
<h2 data-text-anim="rise" data-text-anim-delay="500">Deuxième titre</h2>
<p data-text-anim="fade" data-text-anim-delay="1000">Puis le paragraphe</p>

Inclure dans une page

<link rel="stylesheet" href="core/css/text-anim.css">
<script src="core/js/text-anim.js" defer></script>

Créateur d'animations

Configurez visuellement vos animations et copiez le code généré :

Ouvrir le constructeur Animations dans le configurateur →

Accessibilité

Toutes les animations (y compris SVG) respectent prefers-reduced-motion: reduce. Si l'utilisateur a désactivé les animations dans son système, tous les éléments apparaissent immédiatement sans animation.

Problèmes courants

  • L'animation ne se déclenche pas : vérifiez que animations.js est chargé avec defer et que l'élément a une classe anim-*.
  • L'élément reste invisible : les animations démarrent à opacity: 0. Si l'élément n'est jamais dans le viewport, l'animation ne se déclenchera pas. Vérifiez qu'il n'est pas caché par un parent.
  • L'animation de sortie ne fonctionne pas : ajoutez data-anim-exit="true" sur l'élément. L'animation s'inverse quand l'élément sort du viewport.
  • Les délais ne vont que jusqu'à 10 : les classes anim--delay-1 à anim--delay-10 couvrent 100ms à 1000ms. Pour des délais plus longs, utilisez un style inline transition-delay.

Voir aussi