Texte✨ Premium

Split Hover

Au survol, chaque lettre explose aléatoirement dans l'espace — un ressort CSS élastique la rappelle à sa position dès que la souris s'éloigne.

JSHoverInteractive

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. Texte comprend 56 effets, dont 4 gratuits. Découvrir la catégorie →

3 exemples d'usage

Portfolio créatif — Headline interactive pleine largeur — Split Hover exemple 1

① Portfolio créatif — Headline interactive pleine largeur

QuandLa page d'accueil d'un portfolio design ou d'une agence créative affiche le nom du studio ou un mot-clé fort en très grand corps.
PourquoiL'explosion des lettres au survol signale immédiatement que la page est vivante — sans JS visible ni framework. Sur un fond sombre, l'effet est spectaculaire à grande taille.
RéglagesFont-size 5–8 rem, amplitude X portée à 160 (±80 px), amplitude Y à 120 (±60 px), rotation à 180 (±90°), durée 0,6 s pour un mouvement plus ample.
Jeu ou app dark — Titre d'écran d'accueil interactif — Split Hover exemple 2

② Jeu ou app dark — Titre d'écran d'accueil interactif

QuandL'écran d'accueil d'un jeu browser ou d'une app à identité dark invite l'utilisateur à « toucher » le titre avant de démarrer.
PourquoiLa dispersion chaotique + rappel élastique donne une texture ludique et mécanique qui renforce le registre gaming sans nécessiter de librairie d'animation.
RéglagesFont-size 3,5 rem bold, amplitude X à 120 (±60 px), cubic-bezier accentué (ex. .68,-.8,.265,1.8) pour un ressort plus prononcé, opacité dispersée à 0.15 pour l'effet de dissolution.
Affiche événementielle — Titre de festival pleine largeur — Split Hover exemple 3

③ Affiche événementielle — Titre de festival pleine largeur

QuandUne page d'événement culturel ou de festival affiche le nom de la manifestation en très grand format sur fond sombre — sans élément cliquable dans la zone.
PourquoiÀ grande échelle, l'explosion des lettres est spectaculaire sans aucune contrainte d'usabilité : pas de lien de navigation à préserver, pas d'affordance à respecter. L'effet est vécu comme un geste expressif, pas comme une perturbation.
RéglagesFont-size 5–7 rem, amplitude X à 160 (±80 px), Y à 120 (±60 px), rotation à 180 (±90°), durée 0,6 s, opacité dispersée à 0,08 pour un quasi-disparition.

Comment ça marche

Au chargement, initSplitHover() découpe la chaîne caractère par caractère et enveloppe chaque lettre dans un <span data-index> rendu en inline-block. Ce préfixe rend chaque glyphe indépendamment transformable par le moteur CSS, sans toucher au flux de texte environnant.

Sur mouseenter, la classe .scattered s'ajoute au conteneur (ce qui abaisse l'opacity de chaque span à 0.3 via CSS) et chaque lettre reçoit un transform: translate(Xpx, Ypx) rotate(Rdeg) calculé avec Math.random() : amplitude X ±50 px, Y ±40 px, rotation ±45°. Les valeurs diffèrent à chaque survol — pas de trajectoire mémorisée.

Sur mouseleave, les transforms sont réinitialisés à translate(0,0) rotate(0deg) et la classe .scattered est retirée. La transition CSS cubic-bezier(.68, -.55, .265, 1.55) (courbe « back-out ») produit un dépassement bref au-delà de la position cible avant stabilisation — l'effet de ressort qui donne à l'animation son caractère élastique.

L'ensemble repose sur des transitions CSS et des événements DOM standard : aucun requestAnimationFrame, aucune librairie. Retirer les deux listeners mouseenter/mouseleave suffit à désactiver l'effet proprement, sans état résiduel.

Accessibilité

  • prefers-reduced-motion ABSENT : le code ne détecte pas la préférence système. Les lettres s'animent systématiquement, même lorsque l'OS demande à réduire le mouvement. À implémenter manuellement en guarde autour des listeners si le contexte le requiert.
  • Les <span> de lettres ne portent aucun attribut ARIA. Un lecteur d'écran lit chaque lettre isolément (« H », « O », « V »…). Ajoutez aria-label="texte complet" sur le conteneur et aria-hidden="true" sur les spans enfants pour une restitution naturelle.
  • L'effet n'est déclenché que par mouseenter/mouseleave — il est inactif au clavier et sur écran tactile. Aucun équivalent focus/touchstart n'est prévu dans le code de référence.
  • Le contraste du texte au repos dépend entièrement du fond fourni par l'intégrateur. Prévoir un ratio ≥ 4,5:1 (WCAG AA) entre la couleur du texte et le fond.
  • Le bouton Reset présent dans la démo ne porte pas de aria-label : l'étiquette visible « Reset » suffit en production, mais l'attribut onclick inline est à remplacer par un listener pour respecter la séparation des responsabilités.

Compatibilité navigateur

Nécessite les transitions CSS et les événements DOM — supportés nativement dans tous les navigateurs modernes. Aucun Canvas, aucune API expérimentale.

Chrome 100+✓ Complet
Firefox 100+✓ Complet
Safari 15+✓ Complet
Edge 100+✓ Complet
Mobile iOS✓ Statique — hover inactif
Android Chrome✓ Statique — hover inactif

Sur mobile et écran tactile, <code>mouseenter</code> ne se déclenche pas : les lettres restent dans leur position d'origine et le texte reste lisible. Aucune erreur JS, aucune mise en page cassée.

Le code

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

index.html — structure
<div class="demo-preview">
  <!-- Le JS reconstruit ces spans via initSplitHover() -->
  <span class="demo-text text-split-hover" id="splitHoverText">
    <span data-index="0">H</span>
    <span data-index="1">O</span>
    <span data-index="2">V</span>
    <span data-index="3">E</span>
    <span data-index="4">R</span>
    <span data-index="6">M</span>
    <span data-index="7">E</span>
  </span>
  <!-- Bouton reset (démo) -->
  <button class="replay-btn" onclick="replaySplitHover()">Reset</button>
</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
Constante JS randomX (ligne ~14) 100 Amplitude de dispersion horizontale. Chaque lettre part jusqu'à ±(valeur/2) px. Augmenter pour un effet plus explosif, réduire pour un frémissement subtil.
Constante JS randomY (ligne ~15) 80 Amplitude de dispersion verticale (±(valeur/2) px). À égaliser avec randomX pour une dispersion isotrope, ou réduire pour un effet purement horizontal.
Constante JS randomRotate (ligne ~16) 90 Plage de rotation (±(valeur/2) degrés). Mettre à 0 pour supprimer la rotation et conserver uniquement la translation.
CSS transition-duration sur .text-split-hover span .4s Durée du retour élastique. Réduire à .2s pour une réponse nerveuse, augmenter à .7s pour une animation cinématique.
CSS cubic-bezier sur .text-split-hover span (.68,-.55,.265,1.55) Courbe d'élasticité du retour. Augmenter les valeurs négatives (ex. -.8) pour un ressort plus prononcé. Remplacer par ease-out pour supprimer le rebond.
CSS opacity sur .text-split-hover.scattered span 0.3 Opacité des lettres en état dispersé. 0 = disparition totale, 1 = pas d'atténuation (translation seule visible).
CSS font-size sur .demo-text 2.5rem Taille du texte — à adapter au contexte (1.5 rem pour une nav, 6 rem pour une headline pleine page).

FAQ

Oui. La fonction initSplitHover() reconstruit les spans à partir d'une constante interne ('HOVER ME'). Modifiez cette chaîne dans le JS pour changer le texte affiché — la découpe en spans et les events sont régénérés automatiquement à l'appel.
La courbe élastique est définie dans la règle CSS .text-split-hover span { transition: transform .4s cubic-bezier(.68, -.55, .265, 1.55) }. Remplacez cubic-bezier(.68, -.55, .265, 1.55) par ease-out ou cubic-bezier(0,.8,.4,1) pour un retour fluide sans dépassement.
Non dans sa forme actuelle : mouseenter et mouseleave ne se déclenchent pas sur les appareils sans pointeur. Sur mobile, les lettres restent statiques — le texte reste lisible et aucune erreur n'est levée. Pour une version tactile, ajoutez des listeners touchstart/touchend qui appellent la même logique.