Chargement✨ Premium

Skeleton Screen

Trois lignes de 16 px (60/100/80 %) animées par un shimmer sombre en 1,5 s — skeleton de texte minimal, synchrone, zéro JavaScript.

CSSContent

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

Fil de prévisualisation — liste de messages en cours de chargement — Skeleton Screen exemple 1

① Fil de prévisualisation — liste de messages en cours de chargement

QuandApplication de messagerie (email, SMS, chat) où chaque élément de liste affiche expéditeur, objet et extrait : les données arrivent en lot depuis l'API.
PourquoiLe gabarit 60/100/80 % mime naturellement la structure d'un aperçu de message : la ligne courte figure le nom de l'expéditeur, la longue l'objet, la troisième l'extrait de contenu. La synchronie des trois lignes forme un bloc cohérent, perçu comme un seul élément en attente.
Réglages.loader-skeleton répété 5 à 8 fois dans la liste, gap: 20px entre les blocs, animation-duration: 2s pour un rythme plus posé.
Réponse en cours — placeholder d'un espace de génération IA — Skeleton Screen exemple 2

② Réponse en cours — placeholder d'un espace de génération IA

QuandInterface de chatbot ou de complétion de texte : la bulle de réponse est vide pendant la génération du modèle, avant que le texte commence à s'afficher.
PourquoiUn skeleton de lignes brutes (sans carte ni image) est moins affirmé sémantiquement qu'un squelette de carte complet : il ne promet pas une mise en forme que la réponse n'aura peut-être pas. La synchronie évite la distraction d'un stagger pendant une attente déjà perçue.
Réglageswidth: 100% sur .loader-skeleton pour occuper toute la largeur de la bulle ; height: 14px sur .skeleton-line pour coller à la taille de police du chat.
Fiche produit — la description attend l'API catalogue, photo et prix déjà affichés — Skeleton Screen exemple 3

③ Fiche produit — la description attend l'API catalogue, photo et prix déjà affichés

QuandPage produit d'une boutique en ligne : la photo, le prix, la note et le bouton d'achat viennent du cache et s'affichent immédiatement ; seul le paragraphe descriptif est demandé à l'API catalogue et arrive quelques centaines de millisecondes plus tard.
PourquoiIci, ce qui manque n'est pas la page mais un paragraphe. Trois lignes de 16 px en 60/100/80 % ont exactement la silhouette d'un bloc de texte : une première ligne courte comme l'accroche d'une fiche, une ligne pleine, une dernière ligne interrompue — l'œil lit « du texte arrive ici, à cette taille » et non « la page charge ». Le squelette réserve la hauteur du paragraphe, donc le bouton d'achat ne saute pas quand la description tombe. Un spinner au même endroit ferait douter de la page entière alors que tout le reste est déjà utilisable.
Réglages.loader-skeleton en width: 100% de la colonne texte (les 200 px d'origine laisseraient un vide à droite) ; height: 16px, gap: 12px et border-radius: 4px conservés : ils correspondent au corps et à l'interligne du paragraphe qui les remplacera. Pour une description en deux paragraphes, répéter le bloc une fois.

Comment ça marche

Le squelette repose sur deux classes. .loader-skeleton est une colonne flex de 200 px de large avec gap: 12px ; elle contient trois .skeleton-line, chacune haute de 16 px et arrondie à 4 px. Les largeurs sont posées directement en CSS : la première ligne vaut 60 % (120 px), la deuxième 100 % (200 px), la troisième 80 % (160 px) — un profil décroissant-montant qui mime la longueur variable d'un texte. La hauteur totale du bloc mesuré est de 72 px (3 × 16 px + 2 × 12 px de gap).

L'unique @keyframes shimmer déplace background-position de 200% 0 à -200% 0, ce qui fait traverser le pic du dégradé de droite à gauche sur 400 % de la largeur. Le dégradé — linear-gradient(90deg, #1a1a24 25%, #2a2a34 50%, #1a1a24 75%) avec background-size: 200% 100% — emploie deux tons sombres : le fond à rgb(26, 26, 36) et le pic à rgb(42, 42, 52), soit un écart de 16 sur chaque canal RVB. La durée est de 1,5 s, courbe ease, sans délai sur aucune des trois lignes : les trois shimment en phase. Mesuré sous Chromium, la position passe de ~80 % à ~-134 % en 500 ms, soit ~270 % par seconde.

Deux limites à connaître avant d'intégrer. Premièrement, le code ne contient aucune règle @media (prefers-reduced-motion: reduce) : mesuré sous Playwright avec l'émulation de la préférence, l'animation tourne à la même vitesse — il faut l'arrêter manuellement (voir Accessibilité). Deuxièmement, le HTML vendu englobe le squelette dans un .demo-preview — conteneur du site avec background: #0a0a0f et min-height: 300px — qui n'est pas nécessaire pour l'effet lui-même : la structure utile est uniquement le .loader-skeleton et ses trois enfants (voir Structure HTML).

Accessibilité

  • prefers-reduced-motion absent : aucune règle @media (prefers-reduced-motion: reduce) dans le CSS vendu — mesuré, l'animation tourne à 1,5 s quelle que soit la préférence. Ajoutez @media (prefers-reduced-motion: reduce) { .skeleton-line { animation: none } } pour immobiliser le shimmer chez les utilisateurs concernés.
  • Rôle sémantique manquant : posez role="status" et aria-label="Chargement en cours" sur le .loader-skeleton (ou sur l'élément parent qui prend le relais), afin que les lecteurs d'écran annoncent l'état de chargement sans lire les trois div vides.
  • Texte alternatif : les trois .skeleton-line sont des éléments graphiques vides. Ajoutez aria-hidden="true" sur chacun ; le texte annoncé à l'arbre d'accessibilité doit venir du role="status" parent, pas des enfants.
  • Retrait du DOM : .loader-skeleton doit être supprimé ou masqué (display: none) dès que le contenu réel est inséré, sinon les assistants techniques continuent d'annoncer un chargement pour un contenu déjà disponible.

Compatibilité navigateur

CSS pur — @keyframes, linear-gradient, background-size, animation : propriétés disponibles dans tous les navigateurs courants sans préfixe depuis 2013. Zéro dépendance.

Chrome 26+✓ Complet
Firefox 16+✓ Complet
Safari 7+✓ Complet
Edge 12+✓ Complet
Mobile iOS 7+✓ Complet
Android Chrome 30+✓ Complet

Sans animations CSS (navigateur très ancien), les trois lignes s'affichent comme des blocs gris sombres uniformes sans mouvement — la mise en page du skeleton reste intacte, seul le shimmer disparaît.

Le code

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

index.html — structure
<div class="loader-skeleton">
  <div class="skeleton-line"></div>
  <div class="skeleton-line"></div>
  <div class="skeleton-line"></div>
</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
Largeur du bloc (CSS — .loader-skeleton { width }) 200px Largeur totale du skeleton ; les pourcentages des lignes s'y rapportent. 100% pour remplir le conteneur parent ; une valeur fixe pour verrouiller la mise en page.
Espacement entre lignes (CSS — .loader-skeleton { gap }) 12px Distance verticale entre chaque ligne. 8px pour une liste dense ; 20px pour imiter l'interlignage d'un texte plus aéré.
Hauteur des lignes (CSS — .skeleton-line { height }) 16px Épaisseur de chaque barre. Calquer sur la taille de police du contenu qu'elle remplace : 14px pour un corps de texte, 24px pour un titre.
Rayon des coins (CSS — .skeleton-line { border-radius }) 4px 0 pour des barres rectangulaires (style tabulaire) ; 8px pour un rendu plus doux ; 9999px pour des pilules.
Vitesse du shimmer (CSS — animation-duration: 1.5s) 1.5s Durée d'un cycle complet. 2s : plus lent, moins distrayant ; 0.8s : haché, à éviter sur de longues attentes.
Couleurs du dégradé (CSS — #1a1a24 / #2a2a34) gris très sombre, delta de 16/256 par canal Sur fond clair, remplacez par rgba(0,0,0,.06) / rgba(0,0,0,.14) pour un shimmer semi-transparent adaptatif. Sur fond de couleur, utilisez deux teintes adjacentes dans la même palette.
Largeurs des lignes (CSS — :nth-child(1/2/3) { width }) 60 % / 100 % / 80 % Profil des lignes. 100% / 90% / 60% pour un paragraphe qui se rétrécit ; 30% / 100% / 100% pour simuler une étiquette suivie de deux lignes de données.

FAQ

Skeleton Text (fx-0470) distingue un titre (24 px, dégradé blanc semi-transparent plus lumineux) d'un paragraphe (lignes de 14 px) avec un stagger de 0,1 à 0,3 s entre les lignes. Skeleton Screen utilise trois lignes uniformes de 16 px, synchrones, en couleurs sombres absolues (#1a1a24 → #2a2a34). fx-0470 structure un bloc éditorial avec hiérarchie titre/corps ; fx-0428 représente une rangée de lignes de même importance — liste de données, messages, champs de formulaire.
Aucun animation-delay n'est posé sur les lignes — toutes démarrent à 0s. La synchronie est volontaire : le bloc forme une unité visuelle unique plutôt qu'une cascade perceptible. Pour ajouter un stagger, posez .skeleton-line:nth-child(1) { animation-delay: 0s }, .skeleton-line:nth-child(2) { animation-delay: .15s }, .skeleton-line:nth-child(3) { animation-delay: .3s }.
Les barres (#1a1a24 = gris très sombre) s'affichent bien sur fond blanc, mais le shimmer lui-même (écart de 16/256 entre les deux tons) peut paraître peu perceptible. Pour un fond clair, remplacez le dégradé par linear-gradient(90deg, rgba(0,0,0,.06) 25%, rgba(0,0,0,.14) 50%, rgba(0,0,0,.06) 75%) : le delta relatif reste identique mais s'adapte à n'importe quelle teinte de fond.