Générateur CSS de loaders et spinners, gratuit

Choisissez une animation de chargement, personnalisez couleurs et vitesse, et copiez le code CSS pur.

Choisir un style

Aperçu

Code CSS + HTML

Comment utiliser

  1. Choisissez un style de loader dans la galerie ci-dessus.
  2. Personnalisez couleur, taille, vitesse et épaisseur.
  3. Copiez le CSS + HTML généré et collez-le dans votre projet.

Questions fréquentes

Ces loaders utilisent-ils du JavaScript ?

Non ! Toutes les animations sont en pur CSS avec @keyframes. Elles fonctionnent sans aucun JavaScript.

Ces loaders sont-ils accessibles ?

Oui, si vous ajoutez role="status" et une aria-label à l'élément loader. Les utilisateurs qui préfèrent moins d'animations peuvent être pris en compte avec une media query prefers-reduced-motion.

Comment utiliser

  1. Choisissez un style de loader : sélectionnez parmi spinners, points, barres, anneaux, pulsations ou squelettes.
  2. Personnalisez l'apparence : ajustez couleur, taille, vitesse d'animation et épaisseur avec les curseurs.
  3. Prévisualisez l'animation : le loader s'anime en direct dans la zone d'aperçu, pour voir exactement le rendu.
  4. Copiez le HTML et le CSS : récupérez le balisage HTML minimal et le CSS requis, sans dépendance JavaScript.

Pourquoi utiliser le générateur de loaders CSS ?

Les indicateurs de chargement sont des éléments UX essentiels qui signalent une activité en cours et évitent aux utilisateurs de croire que la page est figée pendant des opérations asynchrones. Les loaders en CSS pur (uniquement à base d'animations CSS, sans JavaScript ni images) sont légers, fiables et rendent à 60 i/s grâce aux transformations accélérées par GPU. Ce générateur produit du code de spinner prêt pour la production que vous pouvez intégrer directement dans votre projet. Toutes les animations utilisent @keyframes avec transform et opacity, les deux propriétés CSS qui s'animent sans provoquer de reflow, garantissant un rendu fluide à 60 i/s même sur des appareils modestes.

Types de loaders disponibles

Brève histoire de l'animation CSS qui alimente votre spinner

La règle @keyframes et le raccourci animation que ce générateur émet sont définis dans le module CSS Animations Niveau 1. Le premier Working Draft du W3C a été publié le 20 mars 2009 et la spec a finalement atteint la Recommandation W3C le 11 décembre 2018, neuf ans plus tard. À ce moment-là, chaque navigateur en service supportait la syntaxe depuis des années : Safari 4 (juin 2009) avec le préfixe -webkit-, Firefox 5 (juin 2011), Internet Explorer 10 (octobre 2012), et sans préfixe par Chrome 43 en avril 2015. Le module CSS Animations Niveau 2 est le Working Draft actuel et ajoute les animations pilotées par le défilement via animation-timeline (livré dans Chrome 115, juillet 2023 ; Safari et Firefox ont suivi fin 2024). La rotation du préréglage « spinner » vient du module CSS Transforms Niveau 1, une spec séparée en Candidate Recommendation depuis février 2019 mais universellement livrée : transform: rotate(360deg) à 100% dans un bloc @keyframes est ce qui fait tourner l'anneau.

L'accessibilité n'est pas optionnelle : la préférence « Réduire les mouvements »

Chaque système d'exploitation publié depuis 2014 inclut un paramètre d'accessibilité « Réduire les mouvements », macOS « Réduire les animations » (dans Accessibilité → Affichage), iOS « Réduire les animations », Windows « Afficher les animations », Android « Supprimer les animations », GNOME « Activer les animations » désactivé. La media query prefers-reduced-motion (définie dans Media Queries Niveau 5, premier Working Draft public W3C de novembre 2017) permet à votre CSS de détecter cette préférence et d'arrêter le spinner. Enveloppez toujours tout spinner dans :

@media (prefers-reduced-motion: reduce) {
  .spinner { animation: none; }
}

Le critère de succès WCAG 2.1 2.3.3 « Animations à partir d'interactions » (niveau AAA, Recommandation W3C 5 juin 2018) exige que toute animation de mouvement déclenchée par une interaction puisse être désactivée à moins que le mouvement ne soit essentiel. Un spinner est rarement essentiel. WCAG 2.2 (octobre 2023) hérite de la même règle.

Pour les lecteurs d'écran, enveloppez le spinner dans <div role="status" aria-live="polite"> avec un texte « Chargement… » masqué visuellement. Quand le chargement se termine, remplacez le contenu ; la région live annonce « Chargé » aux technologies d'assistance sans crier. Définissez aria-busy="true" sur la région contenante pendant le chargement et aria-busy="false" après. Ce modèle est documenté dans le chapitre régions live du Guide des pratiques de création ARIA du W3C.

Pourquoi les spinners CSS restent fluides à 60 fps

Les pipelines de rendu des navigateurs modernes ont trois étapes : layout (calcul des positions), paint (remplissage des pixels) et composite (combinaison des couches sur le GPU). Les propriétés transform et opacity sont les deux seules qui sautent le layout et le paint et s'exécutent purement sur le thread de compositing. Les animer est essentiellement gratuit à n'importe quelle fréquence. Animer width, height, top, left, margin, ou quoi que ce soit qui change la box model force un cycle layout-et-paint complet à chaque frame et tombe rapidement sous 60 fps sur les appareils bas de gamme. Chaque préréglage de ce générateur anime uniquement transform et opacity pour cette raison. Si vous avez besoin d'un indice pour le navigateur, will-change: transform (défini dans module CSS Will Change Niveau 1, Candidate Recommendation W3C 26 avril 2022) promeut l'élément à sa propre couche de compositing ; à utiliser avec parcimonie car chaque couche coûte de la mémoire GPU.

Quand un spinner est la bonne réponse, et quand il ne l'est pas

Dans Response Times: The 3 Important Limits (1993, redit en 2014), Jakob Nielsen du Nielsen Norman Group a défini trois seuils de perception : 0,1 seconde est « instantanée », 1 seconde est la limite pour un flux de pensée ininterrompu, 10 secondes est la limite pour garder l'attention de l'utilisateur. Mappez votre stratégie de loader sur ces seuils :

Fonctions d'accélération et ce que chacune ressent

La propriété animation-timing-function (et le module CSS Easing Functions Niveau 1, Candidate Recommendation 6 décembre 2022) choisit comment la valeur progresse entre les keyframes :

Erreurs courantes

Plus de questions fréquentes

Ces spinners fonctionneront-ils dans les anciens navigateurs ?

Tous les navigateurs modernes (Chrome 43+, Firefox 16+, Safari 9+, Edge 12+) supportent @keyframes et transform sans aucun préfixe. Internet Explorer 10 et 11 nécessitent le préfixe -ms- à certains endroits mais fonctionnent par ailleurs. IE 9 et inférieur n'ont aucun support d'animation CSS : tomber sur un GIF animé, ou utiliser @supports (animation: spin 1s) pour détecter la fonctionnalité.

Comment arrêter le spinner quand le contenu se charge ?

Soit retirer l'élément du DOM, le cacher avec display: none ou l'attribut hidden, ou mettre en pause l'animation avec animation-play-state: paused. La pause est la moins chère si vous pourriez le remontrer. Si vous avez utilisé le modèle ARIA, définissez aussi aria-busy="false" sur le conteneur et remplacez le texte de chargement par l'annonce de l'état chargé.

Puis-je personnaliser les couleurs du spinner plus que ce que le sélecteur permet ?

Oui. Le CSS de sortie utilise des valeurs hex / rgb / hsl régulières ; remplacez-les par des variables CSS (var(--brand-primary)) pour que le spinner suive votre design system. Pour un spinner bicolore, éditez le raccourci border-color : border-color: var(--brand) transparent transparent transparent donne le look classique « arc d'un quart ».

Pourquoi ne pas simplement utiliser une animation SVG ou Lottie ?

Les spinners CSS pèsent moins de 200 octets, n'ont besoin d'aucune requête supplémentaire, d'aucun runtime JavaScript, et s'affichent avant tout chargement de ressource externe. SVG est bon pour les formes complexes ; Lottie est bon pour les animations créées par des designers depuis After Effects. Pour un indicateur générique « quelque chose charge », CSS est l'outil le moins cher qui fait correctement le travail.

Quelque chose est-il suivi ou envoyé à un serveur ?

Non. Le générateur tourne entièrement dans le JavaScript de votre navigateur. Vos choix de couleur, ajustements de taille et CSS copié ne quittent jamais la page. Vérifiez dans l'onglet Réseau de DevTools.

Outils associés