Hover✨ Premium

Repel Particles

100 particules DOM fuient le curseur dans un rayon de 80 px avec une force proportionnelle à la distance, puis reviennent doucement à leur position d'origine.

JSParticlesPhysics

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. Hover comprend 48 effets, dont 5 gratuits. Découvrir la catégorie →

3 exemples d'usage

Fond hero plein cadre — studio de branding et identité visuelle — Repel Particles exemple 1

① Fond hero plein cadre — studio de branding et identité visuelle

QuandLe visiteur déplace la souris sur le hero ; les particules s'écartent du curseur puis reviennent, transformant le fond statique en surface vivante sans aucune ressource graphique à charger.
PourquoiUn fond de particules fuyantes donne de la profondeur et du mouvement à un studio dont l'identité repose sur la précision et l'espace — sans distraire le texte, qui reste lisible en premier plan.
RéglagesZone couvrant toute la section (position:absolute;inset:0). Particules HSL 220–280°. Texte en z-index 10 avec pointer-events:none sauf sur le CTA.
Widget « flux en direct » — tableau de bord analytics — Repel Particles exemple 2

② Widget « flux en direct » — tableau de bord analytics

QuandDans la colonne principale d'un dashboard, une carte « Flux de connexions » affiche les particules qui fuient le curseur, métaphore des sessions actives qui se dispersent sous la charge.
PourquoiUn widget de particules réactif dans un dashboard data donne une impression de vivant sans courbe animée complexe ; les particules qui fuient suggèrent le mouvement de flux réels.
RéglagesZone limitée à la zone du widget (position:absolute;inset:0 sur le fx-0372-root). Particules réduites à 4×4 px pour s'intégrer dans la densité de l'interface.
Galerie de catégories — bibliothèque d'effets ou de ressources — Repel Particles exemple 3

③ Galerie de catégories — bibliothèque d'effets ou de ressources

QuandChaque carte de catégorie d'une grille de navigation héberge sa propre instance de particules ; au survol de la carte, les particules fuient le curseur dans son espace, rendant chaque carte réactive indépendamment.
PourquoiTrois instances indépendantes de petite taille (une par carte) montrent que l'effet n'exige pas un grand format : même à 160×278 px, 100 particules créent un micro-univers réactif et lisible.
RéglagesUne instance .fx-0372-root par carte, chacune en position:absolute;inset:0. Gradient sombre superposé en z-index 10 pour la lisibilité du label de catégorie.

Comment ça marche

Au chargement, le script crée 100 éléments <div class="rpe-particle"> dans .rpe-zone et leur attribue une position aléatoire (left, top en pourcentage). Chaque particule mémorise ses coordonnées d'origine. Les particules sont des éléments DOM, pas un canvas : chacune peut être stylisée individuellement en CSS.

Un écouteur mousemove sur la zone met à jour la position du curseur. La boucle requestAnimationFrame calcule pour chaque particule la distance euclidienne au curseur. Si cette distance est inférieure à 80 px, la particule est repoussée avec une force inversement proportionnelle à la distance (force = (100 − dist) / 100 × maxForce) ; sa position temporaire est décalée dans la direction opposée au curseur. Si la particule est hors rayon, sa position revient progressivement vers l'origine par interpolation : x += (origX − x) × 0.05 par image. Un IntersectionObserver arrête la boucle quand la zone quitte l'écran.

Sous prefers-reduced-motion: reduce, la boucle ne démarre pas ; les particules restent à leur position initiale, le fond reste visible et animé. Sur écran tactile, l'événement touchmove met à jour la position du curseur fictif pour que les particules fuient aussi le doigt.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, la boucle d'animation ne démarre pas. Les particules restent à leur position initiale : le fond reste décoratif mais statique.
  • Rôle décoratif : les particules ne transmettent aucune information ; elles portent aria-hidden implicitement par leur contenu vide. Aucun contenu textuel ou fonctionnel ne doit être placé dans les particules.
  • Touch : l'événement touchmove sur la zone met à jour la position virtuelle du curseur. Les particules fuient aussi le doigt sur écran tactile.
  • Pas d'interaction critique : la fuite des particules est purement décorative. Aucune action utilisateur ne doit dépendre de la position des particules — elles ne sont pas des boutons ni des cibles.

Compatibilité navigateur

DOM + requestAnimationFrame + 2,2 Ko de JavaScript, aucune dépendance. 100 éléments DOM transformés par image : mesuré à moins de 2 ms de JS par image dans Chromium sur desktop. Sur mobile entrée de gamme, réduire à 50 particules si l'animation décroche. IntersectionObserver disponible depuis Chrome 51, Firefox 55 et Safari 12.1. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.

Chrome 51+✓ Complet
Firefox 55+✓ Complet
Safari 12.1+✓ Complet
Edge 79+✓ Complet
Mobile iOS 12.2+✓ Complet (tactile)
Android Chrome 51+✓ Complet (tactile)

Sans JavaScript, les 100 div ne sont pas créées ; la zone .rpe-zone s'affiche vide. Sans IntersectionObserver, la boucle tourne aussi hors écran — impact CPU proportionnel au nombre de particules.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0372-root">
  <div class="rpe-zone">
    <span class="rpe-label" aria-hidden="true">Bougez la souris</span>
    <!-- Les 100 div.rpe-particle sont créées par le JS -->
  </div>
</div>

Paiement unique, sans abonnement — le code est à toi pour toujours

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Nombre de particules (JS — count = 100) 100 particules Diminuez à 50 pour un effet plus léger, augmentez à 150 pour un fond plus dense. Évitez plus de 200 sur mobile entrée de gamme.
Rayon de fuite (JS — if (dist < 80)) 80 px Augmentez à 120-160 px pour une réaction dès que le curseur approche, diminuez à 40 px pour un effet plus subtil.
Force maximale (JS — maxForce) 40 px Augmentez à 80-80 px pour des particules qui fuient loin, diminuez à 15-20 px pour un déplacement discret.
Vitesse de retour (JS — lerp = 0.05) 0,05 (5 % par image) 0,02 donne un retour plus lent et fluide, 0,15 un retour vif. À 1, les particules reviennent instantanément.
Apparence des particules (CSS — .rpe-particle) carré blanc 3×3 px, opacity 0.7, border-radius 50% Changez la taille, la couleur, la forme (supprimer le border-radius pour des carrés) ou ajoutez un emoji dans le contenu HTML des particules.

FAQ

Les div DOM permettent de styliser chaque particule individuellement en CSS (couleur, forme, taille différente par classe ou index) et d'y glisser n'importe quel contenu (emoji, icône SVG). Un canvas est plus performant pour 500+ particules ou des effets de dessin ; pour 100 div simples, l'impact est négligeable sur desktop et acceptable sur mobile.
Oui. Modifiez le CSS de .rpe-particle (ou ajoutez des classes variantes) ou injectez un caractère dans les div lors de leur création : p.textContent = '★' dans la boucle de création.
Oui. L'événement touchmove met à jour la position virtuelle du curseur en extrayant touches[0].clientX/Y. Les particules fuient le doigt comme elles fuient la souris.