Hover✨ Premium

Magnetic Pull

L'élément se translate vers la souris (facteur 0,2 de la distance centre-curseur) et revient en place sur mouseleave — attraction magnétique pure en JavaScript, sans bibliothèque, 400 octets.

JSMousePhysics

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

Bouton CTA 'Rejoindre la liste d'attente' — landing page de startup — Magnetic Pull exemple 1

① Bouton CTA 'Rejoindre la liste d'attente' — landing page de startup

QuandBouton CTA centré dans la hero ; il se rapproche légèrement du curseur pour inviter physiquement au clic, avec une zone de réaction de 32 px autour (padding).
PourquoiUn bouton qui vient vers vous crée une invitation implicite plus subtile qu'un changement de couleur ou une ombre portée : c'est un affordance physique dans une interface numérique.
RéglagesBouton 220×52 px centré, dégradé rose-rouge, padding 16 px autour de la racine pour absorber le déplacement de 20 %, fond quasi-noir.
Icônes de réseaux sociaux — pied de page d'un studio open source — Magnetic Pull exemple 2

② Icônes de réseaux sociaux — pied de page d'un studio open source

QuandCinq icônes de liens sociaux (GitHub, X, LinkedIn, Dribbble, Figma) en ligne dans le pied de page ; chaque icône se rapproche du curseur indépendamment.
PourquoiDes icônes qui avancent vers le curseur dans un pied de page discret rendent la zone plus vivante et signalent les liens sans couleur de fond ni bordure ajoutée.
RéglagesCinq instances data-magnetic-box de 44×44 px, border-radius 10 px, fond transparent au repos, padding 6 px autour de chaque racine.
Cartes de membres d'une équipe — section 'À propos' — Magnetic Pull exemple 3

③ Cartes de membres d'une équipe — section 'À propos'

QuandTrois cartes de membres côte à côte ; chaque carte se rapproche du curseur comme si elle voulait être consultée, invitant à cliquer pour voir le profil complet.
PourquoiUne carte qui avance vers vous crée une invitation implicite à l'interaction plus naturelle que surligner ou agrandir la carte.
RéglagesTrois instances data-magnetic-box de taille de carte, padding 10 px autour de chaque racine, dégradé foncé 1a1f2e, avatar + nom + rôle.

Comment ça marche

La racine .fx-0358-root centre un bloc .hover-box.hover-magnetic de 200 × 200 px portant l'attribut data-magnetic-box. L'élément a un fond dégradé rose-rouge et une transition transform .2s ease-out pour amortir les micro-secousses entre deux événements mousemove.

Le script (!function(){...}()) recherche tous les .fx-0358-root [data-magnetic-box] et leur attache deux écouteurs. Sur mousemove : il calcule l'écart entre la position du curseur et le centre de l'élément (clientX − rect.left − width/2) et applique transform: translate(a×0.2 px, b×0.2 px) — l'élément se déplace de 20 % de la distance centre-curseur vers le pointeur. Sur mouseleave : transform: translate(0,0) remet l'élément à sa position d'origine (la transition CSS adoucit le retour).

Sous prefers-reduced-motion: reduce, le script skippe le mousemove et l'élément reste immobile. Mesuré dans Chromium 151 : attraction visible, retour automatique, deux copies sur une page — chaque élément suit sa propre souris.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, l'attraction est désactivée et l'élément reste immobile. mouseleave reste actif pour remettre l'élément en place si le mode est activé après un survol.
  • Clavier et toucher : l'attraction suit mousemove uniquement — pas reproductible au clavier ni au toucher. L'élément reste fonctionnel (clic, focus) sans l'effet magnétique. Pour signaler le focus clavier, ajoutez :focus-visible { outline: 2px solid #6366f1; } dans votre CSS de page.
  • Contenu : l'effet translate l'élément entier. Sur des mises en page serrées, le déplacement de 20 % peut sortir l'élément de son espace alloué — augmentez le padding autour de la zone pour absorber le déplacement.
  • Accessibilité de la zone cliquable : comme l'élément se déplace, la zone de clic se déplace aussi. Évitez des zones de déplacement trop grandes pour ne pas désorienter les utilisateurs.

Compatibilité navigateur

400 octets de JavaScript (mousemove, mouseleave, getBoundingClientRect, matchMedia), aucune dépendance. CSS : transform, transition. Mesuré dans Chromium 151 : attraction précise, retour fluide, deux copies indépendantes. Fonctionne dans tous les navigateurs modernes.

Chrome 36+✓ Complet (mesuré)
Firefox 16+✓ Complet
Safari 9+✓ Complet
Edge 79+✓ Complet (moteur Chromium)
Mobile iOS✓ Non applicable (sans souris, l'attraction ne se déclenche pas)
Android Chrome 36+✓ Non applicable (sans souris, l'attraction ne se déclenche pas)

Sans JavaScript, l'élément reste statique. Sans transform ou transition, l'attraction ne fonctionne pas.

Le code

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

index.html — structure
<div class="fx-0358-root">
  <div class="hover-box hover-magnetic" data-magnetic-box="">
    <span>…</span>
  </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
Facteur d'attraction (JS — le 0.2 de .2*a et .2*l) 20 % de la distance centre-curseur 0.1 rend l'attraction très subtile (10 %) ; 0.3 la rend plus prononcée. Au-delà de 0.4, l'élément peut sortir de son conteneur sur les curseurs aux bords.
Durée de transition CSS (transition: transform .2s ease-out) 200 ms .1s rend le suivi plus réactif ; .4s ajoute une inertie supplémentaire. ease-out est recommandé pour amortir les artefacts entre événements.
Couleur de fond (CSS — background de .hover-magnetic) linear-gradient(135deg, #ec4899, #f43f5e) Remplacez par n'importe quel fond (couleur unie, dégradé, image). Le fond ne change pas l'attraction — seul le JS pilote le transform.
Zone d'écoute (HTML — data-magnetic-box) L'élément .hover-magnetic lui-même Mettez data-magnetic-box sur un conteneur parent plus grand pour déclencher l'attraction à distance, avant que la souris ne touche l'élément visible.
Retour au repos (JS — mouseleave) translate(0,0) La transition CSS (transform .2s ease-out) anime le retour. Pour supprimer l'animation de retour (retour instantané), retirez la propriété transition de .hover-magnetic.

FAQ

Non : il repose sur mousemove qui n'est pas émis lors d'un toucher ordinaire. Sur mobile, l'élément reste immobile. L'effet est conçu pour les interfaces à curseur.
Oui si le conteneur a overflow: hidden. Sans overflow: hidden sur le parent, l'élément peut empiéter sur ses voisins. Prévoyez un padding autour de la zone d'attraction (au moins 20 % × facteur × taille de l'élément).
Bornez les valeurs de déplacement dans le JS : remplacez .2*a par Math.max(-30, Math.min(30, .2*a)) (limite de ±30 px) et faites de même pour l.