Hover✨ Premium

Elastic String

Vingt nœuds forment une corde horizontale qui se courbe vers le curseur quand il s'en approche, puis revient en oscillant comme un ressort amorti — réponse instantanée au survol, mouvement qui s'efface en quelques secondes.

JSElasticMouse

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

Cordes de basse — appli de studio musical — Elastic String exemple 1

① Cordes de basse — appli de studio musical

QuandDans Quelvo, trois cordes colorées (E, A, D) s'affichent dans le panneau d'instrument. Le musicien passe le curseur sur chaque corde pour la faire vibrer ; la corde s'incurve vers le pointeur puis revient en oscillant.
PourquoiLa physique du ressort amorti reproduit fidèlement la sensation d'un pincement de corde : un pic d'amplitude immédiat, puis une décroissance naturelle. L'interaction directe sur chaque corde rend la démo d'instrument intuitive et tactile.
RéglagesTrois instances .fx-0382-root empilées. Nœuds stylisés en lignes horizontales (height: 3/2/1 px, border-radius:1px, flex:1) pour ressembler à de vraies cordes. Couleurs E=rouge, A=orange, D=vert. Hauteur de wrap 100 %, préfixe k382-.
Séparateur de section vivant — portfolio créatif — Elastic String exemple 2

② Séparateur de section vivant — portfolio créatif

QuandEntre la section Projets et la section À propos d'un portfolio, la corde s'étire vers le curseur au passage. Elle invite subtilement à continuer la lecture sans interrompre le scroll.
PourquoiUn séparateur statique passe inaperçu ; une corde qui réagit transforme un élément neutre en moment d'interaction. Le visiteur retient l'attention une fraction de seconde, ce qui crée un rythme dans la lecture.
RéglagesHauteur de wrap 40 px. Nœuds en ligne (height:1px, background:#334155). La corde occupe toute la largeur entre les deux sections. Aucune étiquette visible.
Waveform scrubber — lecteur audio web — Elastic String exemple 3

③ Waveform scrubber — lecteur audio web

QuandDans Trellox, la corde élastique remplace la barre de progression classique. Le visiteur passe le curseur sur la waveform : la corde se déforme vers le pointeur, indiquant la position souhaitée dans la piste. Les 20 nœuds dégradé bleu-violet rendent la timeline vivante.
PourquoiUne barre plate est perçue comme un élément passif ; une corde qui réagit au survol transforme le scrubber en point d'interaction sensoriel. La déflexion locale autour du curseur indique naturellement la précision du pointage.
RéglagesHauteur de wrap 110 px. Nœuds par défaut (20 px, dégradé bleu-violet). La corde occupe toute la largeur du player entre le header et les repères temporels. Préfixe k382-s3-wave.

Comment ça marche

La corde est formée de 20 div.es382-node créés dynamiquement dans .es382-string. Chaque nœud a un déplacement vertical y et une vélocité vy. À chaque image de la boucle requestAnimationFrame, si la souris est proche du nœud (distance horizontale < 60 px), une force proportionnelle à cette proximité pousse le nœud vers la souris : vy += (target − y) × 0.1 × f. La force de rappel ramène chaque nœud vers sa position de repos (vy += −y × 0.3 × f). L'amortissement (vy *= 0.9^f) fait décroître les oscillations. Le déplacement final est appliqué en translateY.

Un lissage de Catmull-Rom (via la propriété CSS filter + SVG, ou simplement des transitions CSS) n'est pas utilisé ici : c'est la juxtaposition de 20 petits éléments qui crée l'illusion de continuité. La résolution peut être augmentée en changeant la constante de nœuds. Un IntersectionObserver met la boucle en pause quand l'effet est hors écran. Le step est normalisé à 60 fps : f = dt / 16.67.

Accessibilité

  • Toucher : touchmove déplace la corde vers le doigt comme la souris. L'événement preventDefault() bloque le défilement de la page pendant l'interaction. touchend laisse la corde osciller librement.
  • Clavier : l'effet ne réagit pas au clavier. Il n'y a rien à sélectionner ni à activer ; l'élément est purement décoratif.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, la boucle ne démarre pas et les nœuds restent à translateY(0) — la corde est visible comme une ligne horizontale fixe.
  • Rôle décoratif : le .es382-wrap n'a pas de rôle ARIA. Si la corde illustre un séparateur de section, ajoutez role="separator" et un aria-label décrivant les deux zones séparées.

Compatibilité navigateur

DOM pur et CSS, aucune dépendance. IntersectionObserver disponible depuis Chrome 51, Firefox 55, Safari 12.1. requestAnimationFrame depuis Chrome 10, Firefox 11, Safari 6. Non vérifié sur Safari réel ; attendu complet.

Chrome 51+✓ Complet (mesuré)
Firefox 55+✓ Complet (mesuré)
Safari 12.1+✓ Attendu complet (non mesuré)
Edge 79+✓ Complet (mesuré)
Mobile iOS 12.2+✓ Complet au toucher (non mesuré)
Android Chrome 51+✓ Complet au toucher (non mesuré)

Sans JavaScript, la corde s'affiche comme une ligne horizontale fixe. Sans IntersectionObserver, la boucle tourne aussi hors écran.

Le code

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

index.html — structure
<div class="fx-0382-root">
  <div class="es382-wrap">
    <div class="es382-track">
      <div class="es382-string"></div>
    </div>
    <span class="es382-label" aria-hidden="true">Survolez la corde</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
Nombre de nœuds (JS — constante NODE_COUNT) 20 30 donne une résolution plus fine ; 10 un aspect « perlier » discret. Chaque nœud est un div : au-delà de 40, la performance sur mobile peut baisser.
Raideur du ressort (JS — vy += -y * 0.3 * f) 0,3 0,5 donne une corde plus raide qui revient vite ; 0,08 une corde très souple qui oscille longtemps.
Amortissement (JS — vy *= Math.pow(0.9, f)) 0,9 0,95 donne des oscillations qui durent plusieurs secondes ; 0,7 un retour presque immédiat sans rebond visible.
Épaisseur et couleur (CSS — .es382-node) 2 px de haut, dégradé indigo-violet 4 px pour un câble visible ; une teinte unie pour un aspect fil de fer.
Rayon d'influence de la souris (JS — if (Math.abs(dx) < 60)) 60 px 120 px crée une vague plus large ; 30 px un effet pincé et local.

FAQ

Oui. Accédez au tableau interne des nœuds et assignez une vélocité : nodes[10].vy = -20; crée un pic au centre. Pour une vague qui se propage, assignez des vélocités décroissantes sur une plage de nœuds consécutifs avec un délai.
Les 20 divs sont des rectangles ; les coins visibles créent un léger effet de pixellisation quand la courbure est forte. Augmentez le nombre de nœuds à 30-40 pour l'atténuer, ou remplacez les div par un canvas et tracez la corde avec bezierCurveTo.
Ajoutez un clamp sur la position y après le calcul : if (node.y > 80) node.y = 80;. Faites de même vers le haut (if (node.y < -80)) si vous voulez une amplitude symétrique.