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 :
| Classe | Effet |
|---|---|
anim-fade-in | Fondu |
anim-fade-in-up | Fondu + montée |
anim-fade-in-down | Fondu + descente |
anim-fade-in-left | Fondu depuis la gauche |
anim-fade-in-right | Fondu depuis la droite |
anim-scale-in | Zoom avant |
anim-scale-in-up | Zoom + montée |
anim-slide-in-up | Glissement depuis le bas (fort) |
anim-slide-in-down | Glissement depuis le haut (fort) |
anim-slide-in-left | Glissement depuis la gauche |
anim-slide-in-right | Glissement depuis la droite |
anim-rotate-in | Rotation + 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
| Classe | Délai |
|---|---|
anim--delay-1 à anim--delay-10 | 100ms à 1000ms (incréments de 100ms) |
Durée
| Classe | Durée |
|---|---|
anim--duration-fast | 300ms |
anim--duration-slow | 1000ms |
anim--duration-slower | 1500ms |
Easing
| Classe | Effet |
|---|---|
anim--ease-bounce | Rebond à l'arrivée |
anim--ease-elastic | Élastique |
anim--ease-smooth | Doux (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
| Classe | Effet |
|---|---|
anim-click-pulse | Pulsation |
anim-click-shake | Secousse |
anim-click-bounce | Rebond vertical |
anim-click-ripple | Effet 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.
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>
| Classe | Effet |
|---|---|
anim-svg-draw | Dessin progressif du tracé (stroke) |
anim-svg-draw-fade | Dessin + fondu d'apparition |
anim-svg-fade | Fondu simple (pour les éléments fill) |
anim-svg-fade-up | Fondu + 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
| Classe | Durée |
|---|---|
anim-svg--fast | 0.8s |
anim-svg--slow | 2.5s |
anim-svg--slower | 4s |
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
| Classe | Effet |
|---|---|
anim-font-weight-hover | Poids 400→700 au survol |
anim-font-weight-scroll | Poids 400→700 au scroll |
anim-font-weight-loop | Boucle 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>
| Attribut | Défaut | Description |
|---|---|---|
data-font-from | 400 | Poids de départ |
data-font-to | 700 | Poids d'arrivée |
data-font-duration | 0.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 : h1–h6, 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
| Valeur | Effet |
|---|---|
rise (défaut) | Montée depuis le bas |
fade | Fondu progressif |
drop | Descente depuis le haut |
slide | Glissement latéral |
scale | Zoom (scale 0 → 1) |
blur | Flou + fondu |
Attributs
| Attribut | Défaut | Description |
|---|---|---|
data-text-anim | rise | Type d'animation (requis) |
data-text-anim-stagger | 30 | Délai entre caractères (ms) |
data-text-anim-duration | 600 | Durée par caractère (ms) |
data-text-anim-delay | 0 | Délai d'apparition global avant le début de l'animation (ms) |
data-text-anim-easing | cubic-bezier(...) | Easing CSS |
data-text-anim-exit | — | Re-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.jsest chargé avecdeferet que l'élément a une classeanim-*. - 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-10couvrent 100ms à 1000ms. Pour des délais plus longs, utilisez un style inlinetransition-delay.