Qu'est-ce qu'un curseur personnalisé, et quand l'utiliser ?

Un curseur personnalisé remplace ou habille le pointeur par défaut avec un élément qui suit la souris. On l'obtient en masquant le curseur natif avec cursor: none, en déplaçant un élément positionné sur l'événement pointermove, et en lissant son mouvement par interpolation linéaire dans une boucle requestAnimationFrame.

Comment choisir, performances et accessibilité
  • Les curseurs personnalisés conviennent aux portfolios créatifs, aux agences et aux lancements de produit, où Magnetic Effect, Spotlight Reveal ou Cursor Trail renforcent la marque ; ils apportent peu à une documentation ou à une page de paiement.
  • Ne les activez que sur les appareils à pointeur précis (@media (pointer: fine)), gardez le curseur texte natif dans les champs de formulaire et respectez prefers-reduced-motion.
  • Dot Follower est gratuit avec son code complet ; les autres curseurs de la page sont inclus dans Premium.
Survolez cette zone Curseur point + anneau

Dot Follower

Point central avec anneau qui suit avec délai.

JS Smooth
Page de l’effet →
Voir le code source
HTML
<div class="custom-cursor cursor-dot" id="cursorDot"></div>
<div class="custom-cursor cursor-ring" id="cursorRing"></div>
<div class="cursor-zone" id="zone-dot">
  Survolez cette zone
  <span class="info-text">Curseur point + anneau</span>
</div>
CSS
.custom-cursor {
  position: fixed;
  pointer-events: none;
  z-index: 9999;
  display: none
}

.cursor-dot {
  width: 8px;
  height: 8px;
  background: #6366f1;
  border-radius: 50%
}

.cursor-ring {
  width: 40px;
  height: 40px;
  border: 2px solid #6366f1;
  border-radius: 50%;
  transition: all .15s ease-out
}

.cursor-zone {
  /* Ces variables venaient du design system du SITE : chez l'acheteur
     elles n'existent pas, le fond disparaissait et les coins devenaient carres.
     Scopees ici, elles cascadent sans polluer sa page. */
  --bg-elevated: #1a1a24;
  --radius-xl: 1rem;
  --space-4: 1rem;
  --text-muted: #8b8b93;
  --text-secondary: #a1a1aa;

   width: 100%;
   height: 300px;
   background: var(--bg-elevated);
   border-radius: var(--radius-xl);
   display: flex;
   align-items: center;
   justify-content: center;
   font-weight: 600;
   color: var(--text-secondary);
   position: relative;
   overflow: hidden;
   }

.info-text  {
   position: absolute;
   bottom: var(--space-4);
   left: 50%;
   transform: translateX(-50%);
   font-size: 0.875rem;
   color: var(--text-muted);
   }

/* Le JS pose cette classe au survol d'une cible : sans regle, le curseur
   natif restait visible par-dessus le curseur personnalise. */
.cursor-active {
  cursor: none
}
JavaScript
// Zone 1: Dot Follower
    (function(){
      const zoneDot = document.getElementById('zone-dot');
      if (!zoneDot) return;
      const cursorDot = document.getElementById('cursorDot');
      const cursorRing = document.getElementById('cursorRing');
      if (!cursorDot || !cursorRing) return;
      let ringX = 0, ringY = 0;
      let dotX = 0, dotY = 0;

      zoneDot.addEventListener('mouseenter', () => {
        zoneDot.classList.add('cursor-active');
        cursorDot.style.display = 'block';
        cursorRing.style.display = 'block';
      });
      zoneDot.addEventListener('mouseleave', () => {
        zoneDot.classList.remove('cursor-active');
        cursorDot.style.display = 'none';
        cursorRing.style.display = 'none';
      });
      zoneDot.addEventListener('mousemove', (e) => {
        dotX = e.clientX;
        dotY = e.clientY;
        cursorDot.style.left = dotX - 4 + 'px';
        cursorDot.style.top = dotY - 4 + 'px';
      });

      function animateRing() {
        ringX += (dotX - ringX) * 0.15;
        ringY += (dotY - ringY) * 0.15;
        cursorRing.style.left = ringX - 20 + 'px';
        cursorRing.style.top = ringY - 20 + 'px';
        requestAnimationFrame(animateRing);
      }
      animateRing();
    })();

Glow Effect

Halo lumineux qui suit le curseur.

JS Glow

Cursor Trail

Traînée de points qui suit le mouvement.

JS Trail

Magnetic Effect

L'élément est attiré vers le curseur.

JS Interactive

Spotlight Reveal

Le curseur révèle le contenu caché.

JS Reveal

Emoji Cursor

Remplace le curseur par un emoji.

JS Fun

Cursor Spotlight

Effet projecteur qui illumine le contenu au passage.

JS Spotlight

Cursor Ripple

Crée des ondulations au mouvement du curseur.

JS Ripple

Cursor Text

Affiche les coordonnées ou un texte personnalisé.

JS Info

Cursor Morph

Le curseur change de forme selon l'élément survolé.

JS Adaptive

Custom Circle Cursor

Curseur cercle avec effet de contraste et agrandissement au survol.

JS Blend

Cursor Trail Effect

Traînée du curseur avec 5 points et opacité dégradée.

JS Trail

Cursor Expand

Le curseur s'agrandit différemment selon le type d'élément.

JS Interactive

Magnetic Cursor

L'élément suit le curseur avec un effet magnétique subtil.

JS CSS Variables

Spotlight Cursor

Effet de projecteur qui suit le curseur avec un gradient radial.

JS Gradient

Cursor Text Reveal

Le curseur révèle le texte avec un effet de clip-path circulaire.

JS Clip-path
✨
X: 0 Y: 0

Magnetic Elements

Les éléments se déplacent vers le curseur quand il est proche, avec un retour élastique.

JS Mouse Transform

Cursor Spotlight

Un halo de lumière suit le curseur et révèle le contenu caché sous un voile sombre.

CSS Radial Gradient Custom Properties

Trail Particles

Le curseur laisse une traînée de particules lumineuses qui s'estompent avec la physique.

JS Canvas requestAnimationFrame

Cursor Ripple Field

Le mouvement du curseur crée des cercles qui s'étendent comme des gouttes de pluie.

JS Animation Ripple

Custom Cursor States

Le curseur change de forme selon le contexte : cercle, losange ou cercle en pointillés.

JS CSS Cursor

Cursor Tilt Effect

La carte s'incline en 3D vers la position du curseur avec un reflet lumineux dynamique.

JS CSS 3D Perspective

Cursor Text Scramble

Le texte proche du curseur se brouille puis se reconstitue progressivement.

JS Text Interactive

Elastic Cursor

Un curseur personnalisé qui s'étire dans la direction du mouvement et rebondit à l'arrêt.

JS Transform Physics

Cursor Color Sampler

Le curseur capte la couleur de la zone survolée et l'utilise comme halo lumineux.

JS CSS Variables Color

Gravity Well Cursor

Les particules proches du curseur sont repoussées, créant un champ de distorsion autour du pointeur.

JS Physics requestAnimationFrame

Jack-o'-Lantern Cursor

Curseur tête de citrouille qui sème une traînée de petites citrouilles s'estompant rapidement. Ludique, immersif, 100% canvas (aucun modèle ni image externe).

💡 Idéal pour : page/landing Halloween, jeu-concours saisonnier, easter-egg, header d'événement, page enfants.

Curseur Canvas Traînée Premium

Séance Cursor

Planche Ouija interactive : la planchette suit le curseur, les lettres proches s'embrasent et un fil spectral trace le message. Mystique, immersif, parfait pour Halloween.

💡 Idéal pour : hero/landing Halloween, easter-egg de page, quiz/jeu interactif, page 404 « hantée », teaser événement.

Curseur Canvas Interactif Premium

Questions fréquentes

Comment créer un curseur custom en JavaScript ? +

Masquez le curseur natif avec cursor:none. Créez un élément div qui suit la souris via mousemove. Utilisez transform:translate(x,y) avec un lissage (lerp) pour un mouvement fluide. RequestAnimationFrame pour la boucle de rendu.

Comment faire un curseur follower avec lissage ? +

Utilisez le Linear Interpolation (lerp) : position = position + (target - position) * vitesse. Avec vitesse=0.1 pour un suivi lent et élégant, 0.5 pour un suivi plus réactif. Mettez à jour dans requestAnimationFrame.

Les curseurs custom impactent-ils les performances ? +

Un seul curseur follower a un impact négligeable. Les traînées de particules (trail) sont plus lourdes — limitez à 20-30 particules. Pausez l'animation quand la fenêtre n'est pas active (visibilitychange event).

Les curseurs custom fonctionnent-ils sur mobile ? +

Non — les appareils tactiles n'ont pas de curseur. Détectez le type de pointeur avec window.matchMedia('(pointer: fine)') et n'activez les effets de curseur que sur desktop. Prévoyez toujours un fallback.

Comment créer un curseur magnétique sur des boutons ? +

Écoutez mousemove sur le bouton. Calculez la distance entre le curseur et le centre du bouton. Si elle est inférieure à un seuil, déplacez le bouton vers le curseur avec transform:translate. Ajoutez une transition pour le retour.