Hover✨ Premium

Spring Physics

Chaque boîte stocke sa propre physique de ressort : un clic imprime une force initiale, la boucle calcule accélération et amortissement trame par trame jusqu'au retour au repos. Plusieurs boîtes rebondissent indépendamment sur la même page, chacune avec son propre cycle. Sans animation CSS, sans bibliothèque.

JSSpringBounce

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 « Ajouter au panier » dans une fiche produit e-commerce — confirmation visuelle de l'action principale — Spring Physics exemple 1

① Bouton « Ajouter au panier » dans une fiche produit e-commerce — confirmation visuelle de l'action principale

QuandL'utilisateur clique sur le CTA primaire ; le bouton rebondit légèrement vers le haut avant de revenir à sa position, signalant que l'action a bien été prise en compte.
PourquoiUn ressort sur un seul bouton attire l'attention sur le feedback sans animer toute la page ; il remplace le simple changement de couleur et renforce la confiance au moment clé de la conversion.
RéglagesUn seul élément [data-spring] pleine largeur (height: 44px) ; background gradient violet de la charte ; impulsion à −15 (valeur par défaut, rebond visible sans excès).
Icônes d'onglets dans une tab bar de navigation — retour visuel micro au changement de section — Spring Physics exemple 2

② Icônes d'onglets dans une tab bar de navigation — retour visuel micro au changement de section

QuandL'utilisateur tape sur un onglet du bas de page ; l'icône et son libellé bondissent légèrement vers le haut puis reviennent, reproduisant le retour haptique d'une interface native.
PourquoiSur mobile, un micro-spring sur l'icône d'onglet rend la navigation plus tactile sans alourdir l'interface ; il complète la couleur active et supprime l'impression d'interface plate.
RéglagesQuatre éléments [data-spring] en flex (flex:1) dans la tab bar (height: 64px) ; icônes SVG + libellé (10 px) ; min-height:0 sur la racine, physics-container à 64 px.
Boutons de vote ▲ dans un board communautaire — retour gamifié au clic — Spring Physics exemple 3

③ Boutons de vote ▲ dans un board communautaire — retour gamifié au clic

QuandL'utilisateur clique sur ▲ pour voter pour un projet ; le bouton jaillit vers le haut et revient, renforçant la sensation de participation et incitant à voter sur d'autres projets.
PourquoiUn ressort sur un micro-composant (bouton vote 36×38 px) isole le feedback sans distraire du contenu ; la répétition de l'effet sur chaque ligne de liste crée une cohérence d'interaction.
RéglagesUn [data-spring] par ligne de liste, dans un physics-container de 48 px × 48 px ; impulsion −15 par défaut, amortissement 0,7 — le rebond est vif et court pour ne pas bloquer les votes répétés.

Comment ça marche

La racine .fx-0386-root centre horizontalement les trois boîtes (.spring-box[data-spring]) dans un conteneur de 300 px de haut. Le script trouve toutes les racines présentes sur la page — plusieurs instances cohabitent — puis, pour chaque boîte marquée data-spring, crée un contexte de physique isolé : une position t, une accélération a, un drapeau running.

Au clic (ou au toucher), a reçoit une impulsion de −15. À chaque trame, la boucle applique a += 0.3 × −t (force de rappel proportionnelle au déplacement, loi de Hooke), puis a *= 0.7 (amortissement de 30 %) et t += a. La boîte est repositionnée via translateY(t) scale(1 + 0.01 × |t|) : elle monte, dépasse le centre, revient en oscillant de moins en moins. Quand |t| < 0.05 et |a| < 0.05, la boucle s'arrête d'elle-même et repose la boîte à zéro.

Chaque boîte possède son propre requestAnimationFrame, indépendant des autres : cliquer sur « BOUNCE » pendant que « SPRING » rebondit encore ne perturbe pas les deux cycles. Deux copies de l'effet sur la même page fonctionnent de façon identique, chacune trouvée par son propre .fx-0386-root.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, la boucle ne démarre pas et le CSS force transform: none sur les boîtes. Les boîtes restent visibles, cliquables et lisibles — le retour visuel disparaît, pas le contenu.
  • Clavier : les boîtes .spring-box sont des <div> cliquables mais non focusables par défaut — ajouter tabindex="0" et un écouteur keydown sur Entrée/Espace pour les rendre accessibles au clavier si l'effet est utilisé comme bouton fonctionnel.
  • Toucher : un touchstart déclenche le ressort, avec preventDefault pour éviter le double-tir souris/toucher. L'effet fonctionne au doigt sur mobile.
  • Rôle décoratif ou fonctionnel : si les boîtes portent une action (vote, téléchargement), remplacez les <div> par des <button> et supprimez le touchstart superflu — un <button> répond nativement aux événements clavier et tactiles.

Compatibilité navigateur

JavaScript ES5 (closures, requestAnimationFrame, matchMedia), aucune dépendance. Non mesuré dans Firefox et WebKit : le comportement attendu est identique puisque l'effet n'utilise que des APIs universelles.

Chrome 24+✓ Complet (mesuré)
Firefox 23+✓ Complet (non mesuré)
Safari 7+✓ Complet (non mesuré)
Edge 79+✓ Complet (moteur Chromium)
Mobile iOS 7+✓ Complet (non mesuré)
Android Chrome 24+✓ Complet (mesuré sur Chromium)

Sans JavaScript, les boîtes s'affichent à leur position de repos sans animation. Sans matchMedia (navigateurs très anciens), le ressort s'anime même sous mouvement réduit.

Le code

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

index.html — structure
<div class="fx-0386-root"><div class="physics-container"><div class="spring-demo"><div class="spring-box" data-spring="">LABEL</div></div><span class="info-label">Texte d'aide</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
Impulsion initiale (JS — a = -15) −15 −8 donne un ressort plus doux, −25 un bond plus marqué. Valeur négative pour partir vers le bas, positive pour monter.
Rappel (JS — a += 0.3 × −t) 0.3 0.1 ralentit le ressort (oscillations longues), 0.5 l'accélère (retour brusque).
Amortissement (JS — a *= 0.7) 0.7 0.9 donne un ressort presque sans friction (rebondit longtemps), 0.5 l'arrête rapidement.
Couleur des boîtes (CSS — background de .spring-box) linear-gradient(135deg, #6366f1, #8b5cf6) Remplacez par la couleur primaire de votre charte ou par un fond uni. Le texte des boîtes peut être changé directement dans le HTML.
Nombre de boîtes (HTML) 3 boîtes Ajoutez ou supprimez des .spring-box[data-spring] ; chaque nouvelle boîte reçoit automatiquement sa propre physique.

FAQ

Oui. Chaque boîte a sa propre boucle requestAnimationFrame indépendante. Cliquer rapidement sur les trois lance trois ressorts en parallèle, sans interférence.
La boucle s'arrête automatiquement quand la position et l'accélération sont proches de zéro (|t| < 0.05 et |a| < 0.05). Pour accélérer l'arrêt, réduisez la valeur d'amortissement (par exemple a *= 0.5).
Oui : remplacez l'écouteur click par mouseenter et ajoutez un a = 0; t = 0; sur mouseleave si vous voulez réinitialiser l'état à la sortie.