Curseurs✨ Premium

Emoji Cursor

Cinq émojis dans un tableau, un index qui avance à chaque clic : dès que la souris entre dans la zone, le curseur système s'efface et un caractère Unicode le remplace, repositionné à chaque mousemove sur les coordonnées exactes du pointeur.

JSFun

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. Curseurs comprend 26 effets, dont 1 gratuits. Découvrir la catégorie →

3 exemples d'usage

Campagne saisonnière d'une boutique mode ou beauté — Emoji Cursor exemple 1

① Campagne saisonnière d'une boutique mode ou beauté

QuandLa boutique lance sa collection automne et veut que le curseur reflète l'ambiance du moment sur le hero, sans vidéo en autoplay.
PourquoiCinq émojis liés à la saison (🍂, 🎃, ✨, 🕯️, 🦊) installent l'atmosphère au premier survol. Le clic pour changer de symbole offre un moment de jeu avant l'achat. Le curseur redevient normal sitôt sorti du hero — les pages catalogue ne sont pas parasitées.
RéglagesRemplace le tableau par les émojis de la collection ; cible une <section> autour du hero. Teste sous Windows : certains émojis sombres (🍂) disparaissent sur fond beige. Préfère ✨ et ⭐ qui restent lisibles sur presque tous les fonds.
Page d'invitation à un anniversaire ou un événement privé — Emoji Cursor exemple 2

② Page d'invitation à un anniversaire ou un événement privé

QuandUn site éphémère (fête d'entreprise, anniversaire) cherche une signature interactive personnalisée sans mobiliser un développeur pour chaque déclinaison.
PourquoiModifier un tableau de cinq entrées suffit à changer l'ambiance complète. Le cycle d'émojis au clic crée un moment léger entre deux sections. L'aspect unique de la page rend ce registre fantaisiste acceptable, là où un site institutionnel ne le permettrait pas.
RéglagesCinq émojis thématiques (🎂, 🎉, 🥂, 🎶, 🎊 pour un anniversaire). Pour couvrir toute la page, pose les écouteurs sur document.body et ajoute cursor: none sur body.
Page produit pour stickers, papeterie ou jeux enfants — Emoji Cursor exemple 3

③ Page produit pour stickers, papeterie ou jeux enfants

QuandUn produit destiné aux enfants ou aux ados fait de l'expérience du site un argument de vente : le curseur émoji est un signal immédiat que la marque ne se prend pas au sérieux.
PourquoiLes émojis font partie du langage graphique de cette audience. Un curseur qui change au clic correspond à leur attente d'interactivité. Sois honnête sur le registre : cet effet n'a pas sa place sur un portail B2B ou un site de santé.
RéglagesCinq entrées maximum — au-delà le cycle perd de son effet. Privilégie des émojis au dessin large et contrasté (🦄, 🌈, 🚀, ⭐, 🎯) lisibles à 24 px sur toutes les plateformes.

Comment ça marche

L'effet mobilise deux acteurs distincts : la zone de détection (#zone-emoji, 300 px de haut) et un élément flottant (#cursorEmoji) positionné hors du flux du document. Dès que mouseenter se déclenche sur la zone, deux opérations ont lieu en même temps : la zone reçoit la classe cursor-active — le point d'accroche CSS pour supprimer le curseur natif via cursor: none — et l'élément émoji passe de display: none à display: block. Le mouseleave symétrique inverse les deux opérations : classe retirée, élément masqué. Le curseur système reprend sa place dès la sortie, sans délai.

Le suivi de position est direct et sans calcul intermédiaire. À chaque mousemove, le script écrit e.clientX dans style.left et e.clientY dans style.top de l'élément émoji. Pas de seuil, pas de force dégressive : l'émoji colle au pointeur pixel pour pixel dans le repère du viewport. Pour que l'écriture de ces coordonnées absolues produise le positionnement attendu, l'élément doit être en position: fixed dans le CSS — il se place alors au bon endroit quelle que soit la hauteur de défilement.

Le troisième écouteur, click, posé sur la zone, gère la rotation. Un index entier initialisé à 0 avance à chaque clic via l'opérateur modulo : (emojiIndex + 1) % emojis.length. Avec un tableau de cinq entrées — ✨ → 🚀 → 💫 → ⭐ → 🔥 → ✨… — la boucle ne s'arrête jamais. Le script met à jour textContent de l'élément avec l'entrée courante. L'index étant persistant entre deux entrées dans la zone (mais remis à 0 au rechargement), le visiteur retrouve le dernier émoji cliqué s'il revient survoler la zone.

Accessibilité

  • L'élément #cursorEmoji porte un caractère Unicode interprété par les lecteurs d'écran : « ✨ » sera annoncé « étincelles » selon la synthèse. Ajoute aria-hidden="true" sur cet élément avant tout déploiement — c'est un décor de pointeur, pas une information à vocaliser.
  • La rotation d'émoji se déclenche au click sur la zone, pas au clavier. Un utilisateur naviguant à la tabulation peut activer des éléments enfants dans la zone, mais il ne verra et ne déclenchera jamais le changement de symbole. Ne fais jamais dépendre une information ou un retour d'action de ce mécanisme.
  • Sur écran tactile, les trois écouteurs souris ne se déclenchent pas en usage normal. Le curseur émoji reste masqué, la zone se comporte comme un bloc ordinaire. Certains navigateurs mobiles émulent un mouseenter au tap — teste ce comportement si la zone contient des éléments cliquables.
  • prefers-reduced-motion n'a pas d'impact direct ici. Si tu ajoutes une transition à l'apparition de l'émoji, cette préférence doit la gouverner — l'effet livré n'a rien à conditionner.

Compatibilité navigateur

La syntaxe JavaScript est ES2015 : fonctions fléchées, const, modulo sur variable — IE 11 s'arrête sur une erreur de syntaxe. Le vrai facteur de compatibilité est le moteur d'émojis de l'OS : Apple Color Emoji (macOS/iOS), Segoe UI Emoji (Windows) et Noto Color Emoji (Android/Linux) peuvent produire des dessins radicalement différents pour le même caractère Unicode.

Chrome 88+✓ Complet
Firefox 87+✓ Complet
Safari 14+✓ Complet (Apple Color Emoji)
Edge 88+✓ Complet (Segoe UI Emoji — rendu différent de macOS)
Mobile iOS✓ Inerte (tactile)
Android Chrome✓ Inerte (tactile)

Sans JavaScript, <code>#cursorEmoji</code> reste en <code>display: none</code> et le curseur natif fonctionne normalement. Sur un moteur ES5, une erreur de syntaxe bloque l'exécution ; la zone reste visible et lisible. L'effet est purement additif : rien ne casse sans lui.

Le code

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

index.html — structure
🔒 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
Le tableau d'émojis ['✨', '🚀', '💫', '⭐', '🔥'] — 5 entrées La seule liste de contenu du script. Le premier s'affiche à chaque entrée dans la zone, les suivants tournent dans l'ordre des clics. Le modulo s'adapte à n'importe quelle longueur — 1 entrée pour un curseur fixe, davantage pour un long cycle.
Émoji initial (emojiIndex = 0) index 0 → '✨' L'index est remis à 0 au rechargement, pas à chaque entrée dans la zone : si le visiteur clique, sort, puis revient, le curseur reprend sur le dernier émoji affiché. Pour démarrer sur un symbole autre que le premier du tableau, change la valeur initiale.
Décalage de positionnement coin supérieur gauche de l'émoji = coordonnées exactes du curseur L'émoji est positionné par son coin supérieur gauche : le curseur pointe dans l'angle du caractère, pas en son centre. Un décalage fixe de quelques pixels corrige ça sans toucher à la logique de positionnement.
Zone d'activation (#zone-emoji) un div de 300 px de haut Les écouteurs sont posés sur l'élément ciblé par getElementById('zone-emoji') — n'importe quel conteneur peut le remplacer. Pour couvrir toute la page, cible document.body et ajoute cursor: none sur body.
Logique d'affichage (display block / none) basculement instantané au mouseenter / mouseleave Basculement instantané, sans transition. Pour un fondu, passe à opacity avec une transition CSS. Ajoute pointer-events: none quand l'élément est invisible — sinon il intercepte les clics.
Classe cursor-active (sur #zone-emoji) ajoutée au mouseenter, retirée au mouseleave Cette classe porte cursor: none sur la zone. Pour rétablir le curseur natif sur un élément imbriqué (lien, champ), ajoute cursor: auto sur cet élément — il prime sur la règle du parent.

FAQ

C'est normal et documenté : chaque OS embarque sa propre police — Apple Color Emoji (macOS/iOS), Segoe UI Emoji (Windows), Noto Color Emoji (Android). Le même Unicode peut donner un dessin très différent (🔥 et 🥰 en sont des exemples courants). Pour un rendu cohérent entre plateformes, remplace les caractères par des images PNG ou SVG de 24–32 px.
Cible document.body à la place du div dédié, pose les écouteurs dessus, ajoute cursor: none sur body. L'élément #cursorEmoji doit rester en position: fixed pour se repositionner lors du défilement. Avec les écouteurs d'entrée/sortie sur body, l'émoji disparaît quand la souris sort de la fenêtre — comportement cohérent.
Non. Le script écrit deux propriétés CSS (style.left et style.top) sans calcul lourd — pas de Math.sqrt, pas de getBoundingClientRect(). Sur un élément en position: fixed hors flux, le navigateur traite cette mise à jour sans reflow de la page. Un requestAnimationFrame autour des écritures peut plafonner la fréquence si besoin — mais c'est une optimisation rarement nécessaire sur cet effet.