Atmosphère✨ Premium

Dust Motes

Dix particules de poussière dorée dérivent dans un rayon de lumière oblique — animation purement CSS, sans JavaScript, par stagger de durées et délais pour un mouvement organique.

CSSAnimationParticles

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. Atmosphère comprend 57 effets, dont 10 gratuits. Découvrir la catégorie →

3 exemples d'usage

Hero / Landing — Studio créatif ou portfolio nocturne — Dust Motes exemple 1

① Hero / Landing — Studio créatif ou portfolio nocturne

QuandPage d'accueil d'un studio photo, d'un label musical ou d'une agence créative dark-theme cherchant une ambiance cinématique et enveloppante.
PourquoiLes motes créent une profondeur atmosphérique sans attirer l'attention — le visiteur ressent l'ambiance avant de lire le titre. L'absence totale de JavaScript simplifie l'intégration dans des CMS ou des générateurs statiques.
RéglagesMotes en rgba(200,170,100,.6) pour un doré plus discret ; beam width:160px, rotate(12deg) pour couvrir plus de la moitié de la scène ; durées 9–14 s pour une lenteur cinématique.
Composant produit — Carte « Traitement en cours » — Dust Motes exemple 2

② Composant produit — Carte « Traitement en cours »

QuandIndicateur de fond sur un état de chargement long — analyse de fichiers, transcription audio, génération IA — où un spinner serait trop intrusif.
PourquoiLe mouvement subtil indique que « quelque chose se passe » sans agressivité. L'animation CSS continue sans code côté serveur simplifie l'état loading dans un composant React ou Web Component.
RéglagesMotes en rgba(180,190,255,.45) pour une teinte neutre bleutée ; beam rgba(200,210,255,.05) ; durées 10–16 s pour un rythme lent non distrayant.
Micro-interaction de conversion — Écran « Accès accordé » — Dust Motes exemple 3

③ Micro-interaction de conversion — Écran « Accès accordé »

QuandConfirmation d'inscription ou de validation d'e-mail — l'utilisateur vient d'obtenir l'accès à un outil, un espace membres ou un produit premium.
PourquoiL'atmosphère lumineuse du rayon de poussière évoque la découverte et la clarté. Plus intime qu'un confetti, plus durable qu'un spinner — le fond continue de vivre pendant que l'utilisateur lit le message.
RéglagesMotes en rgba(255,255,200,.85) ; beam plus intense (rgba(255,255,150,.14), width:180px) ; durées accélérées 4–7 s pour un léger dynamisme à l'affichage.

Comment ça marche

L'effet repose entièrement sur trois @keyframes CSS (dustFloat1, dustFloat2, dustFloat3) appliqués à dix <div class="dust-mote"> circulaires (1–3 px, border-radius:50%). Chaque keyframe définit 4 points intermédiaires (0 %, 25 %, 50 %, 75 %) avec des translations X/Y décalées (±3–8 px horizontalement, −5 à −30 px verticalement) et des variations d'opacité (0,3–0,9). Le timing ease-in-out ralentit aux extrémités de chaque segment, imitant l'inertie réelle de particules en suspension dans l'air.

La diversité des trajectoires provient uniquement du CSS : chaque règle .dust-mote:nth-child(N) assigne une durée différente (6–10 s) et un délai décalé (0–3 s). Cette désynchronisation brise le motif régulier et donne l'illusion de mouvement indépendant. Aucune valeur n'est tirée aléatoirement à l'exécution — la variété est intégralement bâtie dans les règles statiques.

Le rayon de lumière est un <div class="dust-beam"> positionné en absolu (top:−20%; right:10%; width:120px; height:140%) avec un linear-gradient de rgba(255,220,150,.08) vers transparent, tourné de 15° depuis transform-origin:right top. Le contraste entre ce voile doré et le fond sombre (#1a1a2e → #16213e) produit l'effet de lumière qui découpe l'obscurité.

Sans JavaScript, sans requestAnimationFrame, sans canvas, le moteur d'animation du navigateur gère tout via la couche de composition GPU. Les motes sont en position:absolute avec des dimensions fixes en px : elles n'affectent pas le layout et ne déclenchent aucun reflow. La performance est négligeable même sur mobile.

Accessibilité

  • Pas de prefers-reduced-motion dans le code livré : les animations CSS tournent quelle que soit la préférence système. Pour une intégration accessible, ajoutez @media (prefers-reduced-motion: reduce) { .dust-mote { animation: none; } .dust-beam { opacity: 0.5; } }.
  • Le .dust-container ne porte ni role, ni aria-label, ni aria-hidden. L'effet étant purement décoratif, ajoutez aria-hidden="true" sur le wrapper pour l'exclure de l'arbre d'accessibilité.
  • Aucune interaction clavier ou souris n'est exposée : aucune zone cliquable, aucun piège de focus. Le contenu overlay doit rester en dehors du .dust-container pour rester tabulable.
  • Couleur des motes : rgba(255,220,150,.7) sur fond sombre — la particule est clairement visible (contraste > 4,5:1 en mode normal) mais, étant un élément décoratif non textuel, WCAG 1.4.11 ne s'applique pas.
  • Le fond du conteneur (background de .dust-container) peut être supprimé si l'effet est superposé sur une vraie page — ajoutez pointer-events:none pour que ni les motes ni le rayon ne captent les clics.

Compatibilité navigateur

Nécessite @keyframes CSS et la propriété animation — disponibles depuis Chrome 43, Firefox 16, Safari 9. Aucune dépendance JavaScript.

Chrome 43+✓ Complet
Firefox 16+✓ Complet
Safari 9+✓ Complet
Edge 79+✓ Complet
Mobile iOS 9+✓ Complet
Android Chrome✓ Complet

Sans support des animations CSS (navigateurs < 2015), les motes restent immobiles à leur position initiale avec l'opacité de départ — aucune erreur, l'effet se dégrade en fond statique.

Le code

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

index.html — structure
<div class="dust-container" aria-hidden="true">
  <div class="dust-beam"></div>
  <div class="dust-mote"></div>
  <div class="dust-mote"></div>
  <div class="dust-mote"></div>
  <div class="dust-mote"></div>
  <div class="dust-mote"></div>
  <div class="dust-mote"></div>
  <div class="dust-mote"></div>
  <div class="dust-mote"></div>
  <div class="dust-mote"></div>
  <div class="dust-mote"></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
.dust-mote { background } rgba(255, 220, 150, .7) Couleur et opacité des particules — changez la teinte (ex. bleu rgba(150,190,255,.7)) pour adapter à votre palette sans toucher aux keyframes.
.dust-beam { background } (premier stop) rgba(255, 220, 150, .08) Intensité et couleur du rayon de lumière — montez à .16 pour un rayon très visible, descendez à .04 pour subtil.
.dust-beam { width } 120px Largeur du rayon — 80 px pour un pinceau fin, 200 px pour une nappe lumineuse qui traverse la scène.
.dust-beam { transform: rotate(Ndeg) } 15deg Angle du rayon depuis transform-origin:right top — 0° = vertical tombant, 45° = diagonale prononcée.
.dust-mote:nth-child(N) { animation-duration } 6s – 10s (selon nth-child) Vitesse individuelle de chaque mote — valeurs basses (3–5 s) = poussière agitée, valeurs hautes (12–18 s) = lenteur atmosphérique.
.dust-mote:nth-child(N) { width / height } 1px – 3px (selon nth-child) Taille individuelle de chaque mote — restez sous 6 px pour garder l'aspect « grain de poussière » ; au-delà vous obtenez des particules type « bokeh ».
.dust-container { background } linear-gradient(135deg, #1a1a2e 0, #16213e 100%) Couleur du fond de scène — supprimez la propriété ou passez background:transparent pour superposer l'effet sur votre propre fond (ajoutez alors pointer-events:none).

FAQ

Oui — c'est du CSS pur, sans JavaScript. Collez le HTML dans n'importe quel composant et les styles dans le CSS global ou scoped. Aucune initialisation, aucun hook de cycle de vie, aucune dépendance à installer.
Ajoutez un <div class="dust-mote"></div> dans .dust-container, puis créez une règle .dust-mote:nth-child(N) avec une position (top/left), une taille (width/height), et une animation (dustFloat1, dustFloat2 ou dustFloat3) avec une durée et un délai uniques. Pour supprimer, retirez le div et sa règle nth-child.
Oui : passez .dust-container en position:absolute; inset:0 sur un parent position:relative, ajoutez pointer-events:none sur le container, et placez votre contenu dans un frère sibling avec position:relative; z-index:1. Le contenu reste interactif et accessible.