Progress Bar
Une barre de 200 × 6 px ; un pseudo-élément ::after de 80 px (40 % du rail) en dégradé indigo–fuchsia glisse de translateX(−100 %) à translateX(350 %) en 1,5 s ease-in-out, infini. Aucun JavaScript — l'intégralité du mouvement tient en un @keyframes et un sélecteur ::after.
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



Comment ça marche
Le code expose un seul élément : .loader-bar, 200 × 6 px, fond rgba(99, 102, 241, .2) (indigo à 20 % d'opacité), border-radius: 3px, overflow: hidden. Il n'a aucun descendant dans le HTML vendu ; tout le mouvement vient du pseudo-élément ::after. Celui-ci fait 40 % de la largeur du rail — soit 80 × 6 px — et affiche le dégradé linear-gradient(90deg, #6366f1, #d946ef) (indigo → fuchsia).
barProgress déplace la pilule de translateX(−100 %) à translateX(350 %). Ces valeurs sont relatives à sa propre largeur (80 px) : elle entre par −80 px (hors du rail côté gauche) et sort à 280 px du bord gauche du rail (hors du rail côté droit, le rail ne faisant que 200 px). Le déplacement total est de 360 px. La durée est 1,5 s, la courbe ease-in-out : la pilule accélère en entrant depuis la gauche, atteint sa vitesse maximale au centre et ralentit avant de disparaître à droite. Mesuré dans Chromium : −67,8 px à 200 ms (toujours hors du rail côté gauche), −0,7 px à 500 ms (pilule qui entre dans la zone visible). La boucle est infinite, délai 0 s : lors du redémarrage, la pilule se retrouve instantanément en dehors du rail côté gauche — la coupure est invisible grâce à overflow: hidden.
Il n'y a aucun JavaScript dans le code vendu. Arrêter ou déclencher l'animation demande uniquement de basculer animation-play-state: paused / running sur .loader-bar::after, ce qui s'obtient en ajoutant ou retirant une classe sur le rail. La largeur 200px est fixe et non responsive : sur un conteneur plus étroit la barre déborde ; sur un conteneur plus large, elle reste centrée mais ne s'étire pas. Remplacez par width: 100% pour qu'elle suive son parent.
Accessibilité
- prefers-reduced-motion absent du code : mesuré dans Playwright avec
reducedMotion: 'reduce', la pilule est à −68,3 px à 200 ms et à −2,1 px à 500 ms — l'animation tourne sans changement. Ajoutez@media (prefers-reduced-motion: reduce) { .loader-bar::after { animation: none; } }. - Aucun marqueur d'accessibilité : la barre est un
divvide sansrole,aria-live,aria-busyni texte alternatif. Pour un lecteur d'écran, l'état de chargement est invisible. Ajoutez au minimum un élément frère avecrole="status" aria-live="polite"et un texte masqué visuellement (clip-rectou classesr-only) : « Chargement en cours… ». - Le rail est purement décoratif : posez
aria-hidden="true"sur.loader-baret confiez l'état à un élément dédié. Si la barre est intégrée dans un bouton (bouton en cours d'envoi), l'attributaria-busy="true"va sur le bouton, pas sur la barre. - Contraste : la pilule (#6366f1 → #d946ef) sur fond #0a0a0f mesure 3,4:1 pour l'indigo et 3,8:1 pour le fuchsia — au-dessus du seuil des éléments graphiques (3:1). Sur fond blanc, ces valeurs tombent à 2,8:1 et 3,4:1 ; descendez la luminosité ou renforcez la saturation pour tenir le seuil sur fond clair.
Compatibilité navigateur
Requiert @keyframes, translateX(), linear-gradient(), border-radius, overflow: hidden et le pseudo-élément ::after avec content: "". Toutes ces propriétés sont disponibles depuis Chrome 26, Firefox 16, Safari 7. Aucune dépendance.
Sans animation CSS (navigateurs très anciens), le rail s'affiche vide : la pilule est dans le DOM (::after généré par le CSS) mais immobile à sa position initiale (translateX(−100 %)), donc hors du rail et invisible. Sans linear-gradient (IE 9, ancienne syntaxe), la pilule s'affiche avec un fond transparent — invisible. Sans CSS, le rail est un div vide.
Le code
Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :
<div class="loader-bar"></div>
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éfaut | Effet |
|---|---|---|
Largeur du rail (CSS — .loader-bar, width) |
200px | Largeur totale de la piste. Changez en 100% pour qu'elle suive son parent ; la course de la pilule s'adapte automatiquement car sa largeur est en pourcentage. |
Épaisseur (CSS — .loader-bar, height) |
6px | Hauteur partagée par le rail et la pilule (::after height: 100%). 4px pour un indicateur intégré dans un bouton ; 8px pour un en-tête de page plus visible. |
Couleur du rail (CSS — .loader-bar, background) |
rgba(99, 102, 241, .2) | Fond de la piste. Reprenez la teinte principale à 15–25 % d'opacité pour rester dans la même famille chromatique que la pilule. |
Largeur de la pilule (CSS — .loader-bar::after, width) |
40 % (= 80 px sur un rail de 200 px) | Fraction du rail occupée par la pilule. 25% = course plus longue, effet plus vif ; 60% = pilule large qui couvre presque le rail au passage. |
Gradient de la pilule (CSS — .loader-bar::after, background) |
linear-gradient(90deg, #6366f1, #d946ef) | Couleur de la pilule. Une couleur unie (background: #6366f1) ou un dégradé inversé (#d946ef, #6366f1) pour une direction visuelle opposée. |
Durée du cycle (CSS — .loader-bar::after, animation-duration) |
1.5s | Temps d'un aller complet. 0.8s = chargement nerveux (requête réseau) ; 3s = traitement lent (calcul, génération). Remplacez aussi ease-in-out par linear pour une vitesse constante au-delà de 2 s. |
Arrondi (CSS — .loader-bar et .loader-bar::after, border-radius) |
3px | Les deux doivent partager la même valeur pour des extrémités cohérentes. 0 = barre angulaire ; 9999px = pilule ovale sur rail arrondi. |
FAQ
width en JavaScript. Pour ce comportement, ajoutez une variable CSS --progress sur .loader-bar::after et modifiez sa valeur depuis votre code.animation-play-state: paused sur .loader-bar::after fige la pilule à sa position actuelle — le mouvement s'arrête mais la barre reste visible. (2) display: none ou visibility: hidden sur .loader-bar la retire visuellement. Pour une transition soignée, ajoutez opacity: 0; transition: opacity .3s sur .loader-bar et appliquez la classe via JavaScript dès la réponse reçue.stroke-dashoffset — l'arc passe de 157 à 0 puis à −157 en 2 s (entrée puis sortie de l'arc). Le format carré convient à un indicateur isolé ou placé à côté d'un libellé. La Progress Bar (fx-0424) est horizontale, 200 × 6 px, et peut s'étirer à 100 % de son parent : elle se pose au-dessus ou en dessous d'un contenu (tableau, bouton, zone de texte) et prend toute la largeur disponible sans ajouter de hauteur.