Dashboard Skeleton
Seize os en shimmer synchrone — 3 cartes de KPI, une zone graphique de 80 px, 3 lignes de tableau — CSS pur, 1,8 s, zéro JavaScript.
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 conteneur .dash-skel mesure 310 × 222 px (mesuré), padding 14 px, fond rgba(255,255,255,.02), bordure à 5 % d'opacité. Il abrite trois zones empilées. La première : 3 cartes de statistiques en grille CSS 3 colonnes (grid-template-columns: 1fr 1fr 1fr, gap 8 px) — chaque carte contient deux os, un label de 8 px de haut (60 % de la carte, soit 41 px mesuré) et une valeur de 18 px de haut (50 %, soit 34 px). La deuxième : un os de zone graphique (.dash-skel-chart, 280 × 80 px mesuré, 100 % de la largeur interne du conteneur). La troisième : 3 lignes de tableau à 3 cellules chacune ; la première ligne utilise les largeurs CSS par défaut (30 % / 45 % / 20 %), les deux suivantes imposent des largeurs différentes en attribut style (25 % et 35 % pour la première colonne), simulant des contenus de longueur variable. Décompte total : 16 .skel-bone, tous présents dans le HTML vendu, aucun créé par script.
Le shimmer est entièrement en CSS. Chaque .skel-bone porte un pseudo-élément ::after en inset: 0 qui remplit l'os. Ce pseudo-élément a pour fond un dégradé linéaire horizontal : transparent → rgba(255,255,255,.1) au pic à 50 % → transparent, taille 200% 100% — soit deux fois la largeur de l'os. @keyframes shimmerSlide anime background-position de -200% 0 à 200% 0 : le dégradé, deux fois plus large que l'os, parcourt une plage de 400 % par cycle. La raie lumineuse (pic à 10 % d'opacité) traverse l'os une fois par cycle, de la gauche hors-cadre vers la droite hors-cadre. L'animation est déclarée explicitement : 1.8s ease-in-out 0s infinite normal none running shimmerSlide. Aucun décalage (animation-delay: 0s) : les 16 lueurs défilent en phase, comme un seul champ qui balaie l'interface.
Aucun JavaScript. Le CSS ne fait appel à aucune variable var(--…) du design system du site — aucune dépendance externe, aucune valeur transparente par manque de déclaration. Le HTML vendu inclut .demo-preview, le conteneur de centrage du site (display: flex ; min-height: 300px ; background: #0a0a0f), qui n'est pas nécessaire au fonctionnement : .dash-skel s'intègre directement dans n'importe quel gabarit. La classe .skel-bone-circle est définie dans le CSS (border-radius 50 %) mais absente du HTML vendu — elle est disponible si l'acheteur souhaite ajouter un avatar rond.
Accessibilité
prefers-reduced-motionabsent du code : l'animationshimmerSlidetourne en continu quelle que soit la préférence système (mesuré sous contextereducePlaywright :animationName “ shimmerSlide”,animationDuration “1.8s”). Ajoutez@media (prefers-reduced-motion: reduce) { .skel-bone::after, .skel-bone-circle::after { animation: none; } }— le fond grisrgba(255,255,255,.08)reste visible comme repère de chargement statique.- Aucun rôle ARIA ni texte alternatif : ni
role="status", niaria-busy, niaria-live, ni libellé accessible. Pour les lecteurs d'écran, enveloppez.dash-skeldans<div role="status" aria-label="Chargement du tableau de bord…">; retirez l'élément entier du DOM quand le contenu réel apparaît. - Fond des os sur fond clair :
rgba(255,255,255,.08)sur fond blanc mesure < 1 % de différence — les barres sont invisibles. Sur un thème clair, remplacez parrgba(0,0,0,.08)dans.skel-boneet adaptez la couleur de pic du dégradé::afterenrgba(0,0,0,.1). - Cycle de vie : les 16
divsont vides et muets, l'arbre d'accessibilité n'est jamais modifié par le code vendu. Prévoyez de retirer ou masquer.dash-skelune fois les données reçues — laisser un skeleton visible indéfiniment est une fausse information pour les utilisateurs de technologies d'assistance.
Compatibilité navigateur
CSS pur : @keyframes, pseudo-éléments ::after, animation, CSS Grid, inset. La propriété inset est la plus récente (Chrome 87, Firefox 87, Safari 14.1, Edge 87). Zéro dépendance.
Remplacez inset: 0 par top:0;right:0;bottom:0;left:0 dans .skel-bone::after pour remonter à Chrome 57 / Firefox 52 / Safari 10.1 (limite : CSS Grid). Sans CSS Grid (IE), les 3 cartes de stats s'empilent verticalement au lieu de s'aligner en colonnes.
Le code
Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :
<div class="dash-skel">
<div class="dash-skel-stats">
<div class="dash-skel-stat-card">
<div class="skel-bone dash-skel-stat-label"></div>
<div class="skel-bone dash-skel-stat-val"></div>
</div>
<!-- … 2 autres cartes identiques -->
</div>
<div class="skel-bone dash-skel-chart"></div>
<div class="dash-skel-table">
<div class="dash-skel-row">
<div class="skel-bone dash-skel-cell1"></div>
<div class="skel-bone dash-skel-cell2"></div>
<div class="skel-bone dash-skel-cell3"></div>
</div>
<!-- … 2 autres lignes (largeurs variables en style="width:…") -->
</div>
</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 |
|---|---|---|
Nombre de cartes de stats — HTML : 3 .dash-skel-stat-card |
3 | Retirer ou dupliquer un .dash-skel-stat-card ; la grille grid-template-columns: 1fr 1fr 1fr s'adapte automatiquement (modifier la valeur en 1fr 1fr pour 2 cartes ou repeat(4, 1fr) pour 4). |
Hauteur de la zone graphique — CSS : .dash-skel-chart { height: 80px } |
80 px | 80 px par défaut ; porter à 120px pour un graphe temps réel, descendre à 40px pour un sparkline, ou supprimer l'élément entièrement si votre interface n'a pas de graphe. |
Largeurs des colonnes — CSS : .dash-skel-cell1 30 %, .dash-skel-cell2 45 %, .dash-skel-cell3 20 % |
30 % / 45 % / 20 % | Aligner ces pourcentages sur les vraies colonnes du tableau cible : les largeurs par défaut et les surcharges style="width:…" sur les lignes 2 et 3 simulent déjà une variabilité de longueur ; adaptez-les à votre contenu réel. |
Nombre de lignes de tableau — HTML : 3 .dash-skel-row |
3 | Ajouter ou retirer des .dash-skel-row dans .dash-skel-table ; chaque ligne contient 3 cellules. Pour adapter les largeurs de chaque nouvelle ligne, surcharger en style="width:…" sur chaque .skel-bone. |
Durée du shimmer — CSS : animation: 1.8s ease-in-out 0s infinite… |
1,8 s | 1s pour un chargement rapide, 3s pour simuler un contenu lourd ; modifier la première valeur de la déclaration animation sur .skel-bone::after. |
Intensité du shimmer — CSS : rgba(255,255,255,.1) au pic du dégradé |
.1 (10 % d'opacité) | Porter à .18 pour un éclat plus marqué ; descendre à .06 pour un effet très discret. Sur fond clair, remplacer par rgba(0,0,0,.1) conjointement avec le fond des os. |
Fond des os — CSS : .skel-bone { background: rgba(255,255,255,.08) } |
rgba(255,255,255,.08) | Base grise des barres ; sur fond clair, remplacer par rgba(0,0,0,.08). La classe .skel-bone-circle est définie dans le CSS (border-radius 50 %) mais absente du HTML — ajouter cette classe à un div vide pour un avatar rond. |
FAQ
::after ont animation-delay: 0s : les 16 lueurs défilent en phase. C'est le comportement habituel pour un skeleton de tableau de bord — la lecture est globale. Pour un léger effet en cascade (les cartes s'allument l'une après l'autre), ajoutez des délais sur les pseudo-éléments : .dash-skel-stat-card:nth-child(2) .skel-bone::after { animation-delay: .15s } et :nth-child(3) à .3s..dash-skel du DOM et affichez le contenu réel dans le même espace. Pour une transition douce : dashSkel.style.transition = 'opacity .3s' ; dashSkel.style.opacity = '0', puis retirez l'élément en fin de transition (transitionend). Le code vendu n'installe aucun écouteur d'événement — rien à nettoyer côté JS.