Chargement✨ Premium

Text Loading

Pseudo-élément ::after animé par @keyframes qui défile en quatre états de contenu — vide, un point, deux points, trois points — sur un cycle de 1,5 s ; un seul div, zéro JavaScript.

CSSText

Vous aurez accès à la démo interactive avec un compte gratuit.

Cet effet fait partie d'Effect.Labs — 811 effets vanilla, une partie gratuite, une partie premium. Chargement comprend 29 effets, dont 4 gratuits. Découvrir la catégorie →

3 exemples d'usage

Bouton d'envoi — le label indique lui-même son état — Text Loading exemple 1

① Bouton d'envoi — le label indique lui-même son état

QuandFormulaire de contact ou de paiement : au clic sur « Envoyer », le texte du bouton est remplacé par un span.loader-text contenant « Envoi en cours ».
PourquoiContrairement à un spinner ajouté à côté du texte, ce loader ne consomme aucun espace supplémentaire dans le bouton. La légère variation de largeur avec les points est absorbée par le conteneur.
Réglagesfont-size: 0.875rem (taille courante d'un bouton) ; color: inherit pour suivre la couleur du label parent ; font-weight: 600 conservé.
Suivi de commande — l'étape active dit ce qu'on attend — Text Loading exemple 2

② Suivi de commande — l'étape active dit ce qu'on attend

QuandPage de suivi d'une livraison : sur la chronologie des étapes, la ligne active porte « Préparation en cours » suivi des points animés, entre les étapes validées au-dessus et celles à venir en dessous.
PourquoiUn spinner ou une barre indéterminée dirait seulement « ça travaille ». Ici le loader est une phrase, et la phrase nomme l'étape : le client sait de quoi il attend la fin. Les points disent que la chronologie avance, sans inventer un pourcentage que le vendeur ne connaît pas.
Réglagesfont-size: 1.2rem, font-weight: 600 et color: #6366f1 du code conservés tels quels : l'étape active est la seule ligne en indigo et la plus grande de la liste ; texte « Préparation en cours ».
Barre d'outils d'un éditeur — enregistrement discret — Text Loading exemple 3

③ Barre d'outils d'un éditeur — enregistrement discret

QuandÉditeur de texte ou de document avec autosauvegarde : un indicateur dans la barre d'outils signale « Enregistrement... » le temps de l'appel API.
PourquoiUn loader textuel reste en ligne avec les autres libellés de la barre sans imposer un spinner qui attirerait trop le regard. La taille et la couleur s'ajustent en deux propriétés CSS.
Réglagesfont-size: 0.75rem ; color: #71717a (gris neutre) ; texte « Enregistrement ».

Comment ça marche

L'effet tient dans un seul <div class="loader-text"> : le texte statique (ici « Loading ») est écrit directement dans le HTML, et ::after porte l'animation. Le CSS attribue au div font-size: 1.2rem, font-weight: 600 et color: #6366f1 (indigo). Le pseudo-élément démarre avec content: "" et reçoit animation: 1.5s ease 0s infinite normal none running loadingDots — durée 1,5 s, fonction ease, délai nul, boucle infinie, aucun état de remplissage. Rendu mesuré dans Chromium : 74,7 × 22 px pour le texte « Loading » en 19,2 px/600. Aucun JavaScript.

@keyframes loadingDots définit quatre paliers : 0 % → "", 25 % → ".", 50 % → "..", 75 % → "...". La propriété content est discrète : elle ne s'interpole pas, elle bascule. Avec la fonction ease, la bascule se produit au moment où la courbe de Bézier atteint 50 % de progression sur chaque intervalle de 375 ms — ce qui ne coïncide pas exactement avec la mi-intervalle. Il n'y a pas de palier à 100 % : la valeur "..." persiste jusqu'à la moitié implicite de l'intervalle 75 %–100 %, puis le cycle repart à "". Mesuré dans Chromium : séquence conforme, aucune erreur console.

Pour quatre états d'une durée strictement identique (375 ms chacun), remplacez ease par steps(1, end) dans la déclaration animation, ou ajoutez un palier explicite 100 % { content: "" }. L'effet est CSS pur : il s'intègre à l'identique dans un iframe, un composant Shadow DOM ou un bouton, sans position absolue, sans z-index et sans dépendance externe.

Accessibilité

  • prefers-reduced-motion absent du code : aucune règle @media (prefers-reduced-motion: reduce) ne suspend l'animation. Mesuré sous Playwright avec émulation reduce : animationPlayState reste running. Correctif : @media (prefers-reduced-motion: reduce) { .loader-text::after { animation: none; content: "…"; } }.
  • role="status" absent : un indicateur de chargement doit avertir les lecteurs d'écran quand il apparaît ou disparaît. Ajoutez role="status" (ou aria-live="polite") sur le div pour que VoiceOver et NVDA annoncent l'élément à son entrée dans le DOM.
  • Les points animés (::after) ne sont pas lus par les lecteurs d'écran : les pseudo-éléments sont absents de l'arbre d'accessibilité. Le texte statique (« Loading ») est bien annoncé — les points sont décoratifs, ce qui est acceptable si le texte décrit l'état. Si le div est laissé vide (points seuls), ajoutez aria-label="Chargement".
  • L'effet est CSS pur et indépendant de la souris : il fonctionne à l'identique sur mobile, tablette et dans tout conteneur statique. Aucun position: fixed, aucun z-index, aucun débordement — le div suit le flux normal du document.

Compatibilité navigateur

CSS pur : requiert animation, @keyframes et content sur les pseudo-éléments. Aucune variable CSS du site, aucune dépendance, aucun JavaScript.

Chrome 43+✓ Complet
Firefox 16+✓ Complet
Safari 9+✓ Complet
Edge 79+✓ Complet
Mobile iOS✓ Complet
Android Chrome✓ Complet

Sans prise en charge des animations CSS (IE 9 et antérieurs), le div affiche le texte statique sans points — contenu lisible, état de chargement communiqué par le texte seul. Sans pseudo-éléments, même résultat.

Le code

Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :

index.html — structure
<div class="loader-text">Loading</div>
🔒 Débloquer le code complet — à partir de 2,99 € le 1er mois

HTML + CSS + JS complet, prêt à coller — avec des centaines d'effets premium.

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Texte statique (HTML — contenu du div) "Loading" N'importe quelle chaîne, y compris vide pour n'afficher que les points. Le CSS ne change pas.
Couleur (CSS — color: #6366f1) #6366f1 (indigo) Couleur du texte et des points. Le pseudo-élément hérite de color.
Taille (CSS — font-size: 1.2rem) 1.2rem (19,2 px sur une base 16 px) Taille du bloc entier — texte et points. Rendu mesuré : 74,7 × 22 px pour « Loading » en 19,2 px.
Graisse (CSS — font-weight: 600) 600 400 pour un loader discret en corps de page ; 700 pour un titrage en chargement.
Durée du cycle (CSS — animation: 1.5s …) 1.5s 1s = points vifs (~250 ms par état) ; 2.4s = rythme lent (~600 ms par état).
Uniformité du timing (CSS — ease dans animation) ease Avec ease, les bascules de contenu discret ne sont pas strictement à 375 ms chacune. Remplacez par steps(1, end) pour un rythme rigoureusement uniforme.
États de points (CSS — valeurs content dans @keyframes) "" / "." / ".." / "..." Remplacez par "•" / "••" / "•••" pour des points médians, ou réduisez à deux états ("" et "...") pour une alternance franche.

FAQ

Oui : la déclaration animation utilise ease, une courbe cubique de Bézier. Pour content (propriété discrète), la bascule se produit quand la courbe atteint 50 % de progression sur chaque intervalle de 375 ms, ce qui ne coïncide pas avec la mi-durée. Les quatre états restent tous visibles, mais leurs durées effectives diffèrent légèrement. Pour un rythme strictement uniforme, remplacez ease par steps(1, end).
Glitch Text est un effet typographique : décalage chromatique et clip-path sur ::before/::after, il communique une distorsion ou une esthétique rétro, pas une attente. Text Loading anime content sur ::after pour signaler une progression : le rythme des points est un code visuel universel. Les deux effets partagent un div de texte comme cible, mais n'ont ni le même rendu, ni le même usage, ni la même technique.
Oui : laissez le contenu HTML du div vide (<div class="loader-text"></div>). L'animation affichera "", ".", "..", "..." — trois points purs en indigo, visuellement proches de l'indicateur de frappe d'un chat. Dans ce cas, ajoutez aria-label="Chargement" sur le div : le texte statique étant absent, les lecteurs d'écran n'ont rien à lire sans cet attribut.