Article Skeleton
Dix os sur 290 px : hero 130 px, titre 85/60 %, corps 100→70 %, avatar 32 px avec nom et date d'auteur — shimmer 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
La carte .article-skel (290 px de large, padding: 16px, border-radius: 16px, fond rgba(255,255,255,.02), bordure rgba(255,255,255,.05)) regroupe dix os en colonne. L'image hero .article-skel-hero occupe toute la largeur du contenu (256 × 130 px, border-radius: 10px, margin-bottom: 16px), suivie de deux lignes de titre : .article-skel-title à 85 % (218 px, 16 px de hauteur, margin-bottom: 8px) et .article-skel-title2 à 60 % (154 px, margin-bottom: 16px). Viennent ensuite quatre .article-skel-p de 9 px de hauteur dont les largeurs sont fixées par leur position dans le parent via :nth-child : premier enfant en position 4 à 100 % (256 px), 5 à 95 % (243 px), 6 à 88 % (225 px), 7 à 70 % (179 px) — une pyramide inversée qui reproduit visuellement l'étalement d'un paragraphe de prose. Le dernier reçoit un margin-bottom: 16px, les trois autres 8px. Hauteur totale de la carte mesurée : 359 px.
L'animation repose sur le pseudo-élément ::after commun à .skel-bone et .skel-bone-circle. Il est positionné en absolute avec inset: 0 et porte un linear-gradient(90deg, transparent 0, rgba(255,255,255,.1) 50%, transparent 100%) de taille 200% 100%. L'animation shimmerSlide déplace le background-position de −200% 0 à 200% 0, soit un déplacement de 400 %. Sur un os de 256 px, le reflet traverse l'élément en environ 25 % de la durée totale — 0,45 s de balayage visible, puis 1,35 s de surface unie — pour une durée de 1,8 s (ease-in-out, délai 0s, infini). La crête vaut rgba(255,255,255,.1) sur la base rgba(255,255,255,.08) : un reflet intentionnellement discret. Tous les os partagent les mêmes paramètres et shimment en phase.
En bas de la carte, .article-skel-author (flex, gap: 10px, padding-top: 14px, border-top: 1px solid rgba(255,255,255,.05)) aligne un cercle .skel-bone-circle.article-skel-author-avatar de 32 × 32 px avec, à droite, deux lignes empilées : nom (80 × 10 px) et date (60 × 8 px, margin-top: 6px). La hiérarchie des largeurs (80 puis 60 px) imite une ligne prénom·nom suivie d'une date courte. Avertissement d'intégration : les largeurs des quatre lignes de corps reposent sur :nth-child(5/6/7) de .article-skel — si un élément est inséré avant ces lignes, les positions sont décalées et les largeurs ne s'appliquent plus aux bons os. Le conteneur .demo-preview présent dans le code vendu (fond #0a0a0f, flex centré, min-height: 300px) est la démo du site ; l'effet commence à .article-skel.
Accessibilité
- prefers-reduced-motion absent : aucune règle
@media (prefers-reduced-motion: reduce)dans le CSS vendu — mesuré sous émulation Playwright,animationPlayStateresterunningquelle que soit la préférence. Ajoutez@media (prefers-reduced-motion: reduce) { .skel-bone::after, .skel-bone-circle::after { animation: none; } }pour immobiliser le shimmer chez les utilisateurs concernés. - Aucun attribut d'accessibilité : pas de
role="status", pas d'aria-busy, pas d'aria-live. Les lecteurs d'écran voient dixdivvides sans contexte. Pour un état de chargement : posezaria-busy="true"sur le conteneur parent pendant le fetch,aria-live="polite"pour annoncer l'arrivée du contenu réel, et retirez ou remplacez.article-skeldès que les données sont disponibles. - Nœuds fantômes : les dix os sont des éléments vides sans texte ni label. Posez
aria-hidden="true"sur.article-skelpour les masquer de l'arbre d'accessibilité et éviter dix arrêts de navigation au clavier. - Contraste délibérément bas : la base des os (
rgba(255,255,255,.08)sur#0a0a0f) donne environ 1,5:1 — volontairement discret. Aucune information n'est encodée dans la couleur ; le squelette est structurel et décoratif. Le seuil WCAG 1.4.11 (composants d'interface) ne s'applique pas à un placeholder de chargement. Sur fond clair, ajustez la base àrgba(0,0,0,.08).
Compatibilité navigateur
La propriété raccourcie inset: 0 sur le pseudo-élément ::after est le plancher technique : Chrome 87, Firefox 87, Safari 14.1, Edge 87 (2020). Le reste — @keyframes, background-size, linear-gradient, border-radius, display: flex — est disponible depuis 2013. Zéro dépendance, zéro JavaScript.
Sans inset (antérieur à 2020), le ::after se réduit à 0 × 0 px et le shimmer disparaît. Les os restent visibles comme blocs rgba(255,255,255,.08) sans animation — un placeholder de chargement reconnaissable, statique.
Le code
Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :
<div class="article-skel">
<div class="skel-bone article-skel-hero"></div>
<div class="skel-bone article-skel-title"></div>
<div class="skel-bone article-skel-title2"></div>
<div class="skel-bone article-skel-p"></div>
<!-- … 4 au total -->
<div class="article-skel-author">
<div class="skel-bone-circle article-skel-author-avatar"></div>
<div>
<div class="skel-bone article-skel-author-name"></div>
<div class="skel-bone article-skel-author-date"></div>
</div>
</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 |
|---|---|---|
Largeur de la carte (CSS — .article-skel { width: 290px }) |
290 px | Les os exprimés en % (article-skel-hero, titres, lignes de corps) s'adaptent automatiquement. Pour une colonne éditoriale, width: 100%; max-width: 680px avec une hauteur de corps explicite. |
Hauteur de l'image hero (CSS — .article-skel-hero { height: 130px }) |
130 px | Surface visuellement dominante. 80px pour une liste compacte, 200px pour un hero magazine, 0 (ou display: none) pour un article sans image. |
Durée du shimmer (CSS — animation: 1.8s ease-in-out 0s infinite shimmerSlide) |
1,8 s | S'applique à tous les os simultanément (délai 0 s). 1.2s pour un chargement perçu comme rapide ; 2.5s pour une ambiance calme. Pour décaler les os : .article-skel-title::after { animation-delay: .15s; } (cibler le ::after, pas l'os lui-même). |
Intensité du shimmer (CSS — rgba(255,255,255,.1) dans le dégradé du ::after) |
.1 | Opacité de crête du reflet. .15 à .2 pour un effet plus marqué sur fond sombre ; .05 pour l'effacer presque. La base des os est à .08 — ne pas dépasser .3 pour rester dans les codes d'un skeleton. |
Arrondi des os (CSS — .skel-bone { border-radius: 6px }) |
6 px | 3px pour un design strict ; 12px pour une application mobile arrondie. Le hero a son propre arrondi (.article-skel-hero { border-radius: 10px }) à ajuster séparément. |
Largeurs des titres (CSS — .article-skel-title { width: 85% } et .article-skel-title2 { width: 60% }) |
85 % et 60 % | Simulent un titre à deux niveaux ou un titre long suivi d'un sous-titre. Passer à 90/75 pour un titre plus long ; supprimer .article-skel-title2 pour un titre monoligne. |
Hauteur des lignes de corps (CSS — .article-skel-p { height: 9px }) |
9 px | Correspond à environ la moitié de la hauteur de ligne d'un corps 16 px (mi-hauteur de jambage). 11px pour un contenu plus dense ; 7px pour un texte secondaire petit. |
FAQ
.article-skel-p:nth-child(5/6/7) ciblent les enfants 5, 6 et 7 de .article-skel — pas les 2, 3, 4e paragraphes. Si un élément est inséré avant les lignes de corps dans la carte (par exemple un sous-titre supplémentaire), les positions se décalent et les largeurs s'appliquent aux mauvais os. Pour une structure modifiée, remplacez les sélecteurs :nth-child par des classes distinctes (.article-skel-p--95, etc.) ou des styles inline..demo-preview (fond #0a0a0f, flex centré, min-height: 300px) est le cadre de démonstration du site Effect.Labs — il n'est pas requis pour que le skeleton fonctionne. Les deux premiers blocs CSS du code vendu (.demo-preview, .demo-preview *… et .demo-preview {…}) peuvent être supprimés à l'intégration. L'effet commence à .article-skel et ses classes associées.