Chargement✨ Premium

Orbit

Un satellite de 12 px tourne autour d'un centre fixe de 8 px en 1 s exactement — rayon mesuré de 19 px, deux pseudo-éléments, zéro JavaScript.

CSSCircular

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

Écran d'attente d'une app VPN : connexion au serveur — Orbit exemple 1

① Écran d'attente d'une app VPN : connexion au serveur

QuandÉcran principal d'une app VPN (ou d'un jeu en ligne, d'un objet connecté) entre le choix du serveur et l'ouverture du tunnel : le client cherche son serveur, échange les clés, monte le tunnel — 2 à 6 s pendant lesquelles la zone principale n'a rien d'autre à montrer.
PourquoiLe loader est ici le seul contenu de l'écran, à 60 px au centre : il doit raconter la situation, pas seulement occuper l'attente. Deux corps distincts font exactement cela — le centre fixe est le serveur, le satellite qui tourne est le client qui le cherche et n'est pas encore « posé ». Un anneau ou une barre indéterminée disent « patientez » ; l'orbite dit « deux parties, pas encore reliées », ce qui est précisément l'état montré. Une piste pointillée de 46 px tracée autour (décor de scène) rend l'orbite explicite dès la première image.
RéglagesConteneur width: 60px; height: 60px ; ::before à 14px, transform-origin: 50% 30px (rayon : 30 − 7 = 23 px) ; ::after à 10px ; couleurs par défaut (#6366f1 / #d946ef) et durée par défaut 1 s ; piste facultative posée par la scène sous le loader : 46 × 46 px, border: 1px dashed rgba(255,255,255,.14), border-radius: 50%, centrée.
Lecteur vidéo — mise en mémoire tampon — Orbit exemple 2

② Lecteur vidéo — mise en mémoire tampon

QuandLecteur vidéo en plein cadre : le contenu stoppe sur une image figée, le loader apparaît en surimpression au centre pendant la mise en mémoire tampon.
PourquoiL'orbite circulaire — distincte de la roue CSS classique (fx-0421) — évoque un « en orbite », cohérente avec les interfaces de streaming qui empruntent le vocabulaire de l'espace. La paire de couleurs (indigo + magenta) tient sur tout fond sombre de poster vidéo.
RéglagesTaille par défaut 50 × 50 px ; ::before { background: #fff; animation-duration: 1.2s } pour une orbite légèrement plus calme ; ::after { background: rgba(255,255,255,.6) } pour un centre discret ; conteneur en position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%) sur le wrapper du lecteur.
Acquisition du signal GPS dans une app de randonnée — Orbit exemple 3

③ Acquisition du signal GPS dans une app de randonnée

QuandÉcran de démarrage d'activité d'une app de suivi GPS (randonnée, course, flotte) : la carte est là, mais le point de position n'existe pas encore — le récepteur attend un point de 4 satellites, 10 à 30 s à ciel dégagé, davantage en forêt ou en ville.
PourquoiL'orbite représente littéralement ce que l'utilisateur attend : un satellite qui passe au-dessus d'un récepteur. Le centre fixe tient la place du point de position à venir, le satellite tournant montre le signal en cours d'acquisition. Aucun autre loader ne porte cette lecture — une roue ou des points sautillants diraient seulement « ça charge », alors qu'ici la forme explique le délai, et l'orbite lente (2 s) l'accorde à une attente de plusieurs dizaines de secondes.
RéglagesGéométrie par défaut (conteneur 50 × 50 px, satellite 12 px, transform-origin: 50% 25px, rayon 19 px) ; ::before { background: #fff; animation-duration: 2s } ; centre en anneau creux : ::after { width: 12px; height: 12px; background: none; border: 2px solid #a5b4fc } — sa taille n'a aucune incidence sur la trajectoire ; le loader est centré en tête d'un panneau translucide posé sur la carte.

Comment ça marche

Le conteneur .loader-orbit est un carré de 50 × 50 px en position: relative. Deux pseudo-éléments, aucun DOM ajouté. ::after : disque de 8 × 8 px, couleur #d946ef, centré par left: 50%; top: 50%; transform: translate(-50%, -50%) — il ne bouge jamais. ::before : disque de 12 × 12 px, couleur #6366f1, ancré en left: 50%; top: 0, avec transform-origin: 50% 25px.

La valeur transform-origin: 50% 25px place le pivot à (6 px, 25 px) dans le repère local du ::before : 6 px est la moitié de 12 px (centre horizontal du disque), 25 px est la moitié de 50 px (milieu exact du conteneur en Y). La keyframe unique to { transform: translateX(-50%) rotate(360deg) } combine deux effets simultanés : translateX(-50%) décale le centre d'orbite de 6 px vers la gauche, ramenant le pivot de (31 px, 25 px) à (25 px, 25 px) — le centre géométrique du conteneur ; rotate(360deg) fait pivoter le disque autour de ce point. Rayon résultant : 25 − 6 = 19 px, mesuré constant sur 8 échantillons successifs espacés de 125 ms.

L'animation 1s linear infinite donne 360 °/s constant, sens horaire. Aucun JavaScript, aucune variable CSS, aucun élément créé au chargement. La valeur implicite du keyframe from est le transform: translateX(-50%) déclaré dans le CSS de l'élément, ce qui assure une transition sans rupture entre la position de départ (disque au sommet, centré) et la boucle continue.

Accessibilité

  • prefers-reduced-motion absent du code : l'animation tourne en permanence quelle que soit la préférence système. Mesuré sous reducedMotion: reduce en Playwright : la composante sinus du transform passe de 0,5430 à −0,5450 en 500 ms — l'orbite ne ralentit pas. Ajoutez @media (prefers-reduced-motion: reduce) { .loader-orbit::before { animation: none } } pour stopper la rotation et laisser le satellite immobile en position de départ.
  • Pour un indicateur de chargement, aucune sémantique n'est fournie : le .loader-orbit est un div vide sans role, sans aria-busy, sans aria-label et sans aria-live. Les lecteurs d'écran ignorent les deux pseudo-éléments (contenu CSS). Ajoutez au minimum role="status" et aria-label="Chargement en cours" ; si ce loader remplace un contenu dynamique, enveloppez-le dans une région aria-live="polite".
  • L'effet fonctionne pleinement sur mobile (CSS Animations ne requiert pas d'interaction tactile) : le satellite orbite dès le chargement sans geste préalable. Aucun curseur personnalisé, aucun événement souris — intégrable tel quel dans un contexte tactile.
  • Contraste : les deux disques sont des indicateurs d'état, pas du texte (seuil WCAG 3:1 pour les composants UI). #6366f1 sur #0a0a0f : 4,4:1 ✓. #d946ef sur #0a0a0f : 5,3:1 ✓. Sur fond clair, les deux couleurs chutent sous 3:1 — remplacez #6366f1 par #4338ca et #d946ef par #a21caf pour tenir le seuil sur blanc.

Compatibilité navigateur

CSS pur : @keyframes, transform avec translateX() et rotate(), transform-origin, border-radius: 50%, pseudo-éléments ::before/::after. Aucune dépendance.

Chrome 36+✓ Complet
Firefox 16+✓ Complet
Safari 9+✓ Complet
Edge 12+✓ Complet
Mobile iOS 9+✓ Complet
Android Chrome 36+✓ Complet

Sans CSS Animations (IE 9 et antérieurs), le ::before s'affiche à l'état initial — disque #6366f1 immobile en haut du conteneur, centré horizontalement. Le ::after reste centré. Aucun JavaScript à charger, aucune erreur console.

Le code

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

index.html — structure
<div class="loader-orbit"></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
Taille du conteneur (CSS — .loader-orbit { width: 50px; height: 50px }) 50 × 50 px Redimensionne tout le système. Après un changement, recalculez le transform-origin du satellite : sa valeur Y doit rester égale à la moitié de la nouvelle hauteur pour que le pivot reste au centre. Les tailles des deux disques sont indépendantes et se règlent séparément.
Rayon d'orbite (CSS — ::before { transform-origin: 50% 25px }) 25 px → rayon effectif 19 px La valeur Y du transform-origin est le bras de rotation ; le rayon effectif vaut bras − demi-hauteur du satellite (25 − 6 = 19 px). Réduire à 20px donne un rayon de 14 px (orbite serrée) ; augmenter à 30px donne 24 px (adapter le conteneur à ≥ 62 × 62 px en conséquence).
Taille du satellite (CSS — ::before { width: 12px; height: 12px }) 12 × 12 px Ajustez aussi transform-origin X : 50 % de la nouvelle largeur (ex. 8pxtransform-origin: 4px 25px). Sans cet ajustement, le satellite orbite légèrement décalé du centre.
Couleur du satellite (CSS — ::before { background: #6366f1 }) #6366f1 (indigo) Indépendante du centre. Toute couleur CSS est acceptée : dégradé (background: linear-gradient(...)), semi-transparent, blanc. Pas de border ni de box-shadow dans le code vendu — à ajouter si un halo est souhaité.
Couleur du centre (CSS — ::after { background: #d946ef }) #d946ef (rose/magenta) Peut aussi être transparent pour supprimer le point central et ne laisser que le satellite tournant, ou background: none; border: 2px solid #d946ef; border-radius: 50% pour un anneau creux.
Durée (CSS — animation: 1s linear) 1 s — 360 °/s 0.5s : orbite rapide, indique une activité intense. 2s : orbite lente, convient aux états d'attente prolongée ou aux contextes éditoriaux. La valeur linear maintient la vitesse angulaire constante ; ease-in-out produirait une accélération/décélération perceptible à chaque passage au sommet.
Taille du centre (CSS — ::after { width: 8px; height: 8px }) 8 × 8 px Aucune incidence sur la trajectoire du satellite. Un centre de 0 px (display: none) donne un effet de comète solitaire. Un centre de 20 px (occupant 40 % du conteneur) renforce la métaphore planète/lune.

FAQ

Trois valeurs sont couplées : la hauteur du conteneur, la valeur Y du transform-origin et la moitié de la hauteur du satellite. La formule est : rayon = transform-origin-Y − (satellite-height / 2). Pour un conteneur de 60 × 60 px avec un satellite de 14 px, posez transform-origin: 7px 30px (30 = 60/2, 7 = 14/2) : rayon = 30 − 7 = 23 px. Ne changez jamais l'une sans recalculer les autres, sinon le pivot dérive du centre.
Classic Spinner (fx-0421) est un anneau à épaisseur de bordure variable qui tourne sur lui-même — un seul corps, métaphore « roue ». Gradient Ring (fx-0435) est un anneau en conic-gradient qui tourne — un seul corps, métaphore « arc de cercle progressif ». Orbit propose deux corps distincts : un centre fixe et un satellite en mouvement — métaphore planétaire, lisible même à 24 px, sans épaisseur de bordure ni dégradé. Choisissez Orbit quand le design demande un système plutôt qu'un cercle.
Oui, en ajoutant un deuxième élément HTML (ou en imbriquant un enfant dans .loader-orbit) avec un transform-origin et une durée différents. Le code vendu ne contient qu'un satellite (le ::before) ; ajouter un second div enfant en position: absolute avec ses propres pseudo-éléments ou sa propre animation de rotation est la voie la plus propre — pas de modification du code existant.