Hover✨ Premium

Interactive Newton's Cradle

Cinq billes canvas suspendues à une barre par des fils de 120 px répondent à la physique angulaire : l'élan se transfère de bille en bille lors des collisions. Cliquer et tirer une bille l'élève, puis la relâcher la lance. Canvas net sur Retina, boucle suspendue hors écran, billes fixes sous mouvement réduit.

CanvasPhysicsMomentum

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

Carte KPI « Élan commercial T4 » dans un tableau de bord analytics Arvion — Interactive Newton's Cradle exemple 1

① Carte KPI « Élan commercial T4 » dans un tableau de bord analytics Arvion

QuandL'analyste clique sur la bille de droite pour relancer la simulation et visualiser l'élan commercial du trimestre.
PourquoiUn pendule de Newton interactif dans une carte de dashboard traduit visuellement la notion d'élan et de transfert d'énergie entre indicateurs.
RéglagesCanvas dans un conteneur flex (height: 100% !important) ; fond de la carte #111128 ; billes en dégradé violet (#8b5cf6 → #4338ca).
Section hero plein écran du studio de jeux Frixan — pendule en fond animé — Interactive Newton's Cradle exemple 2

② Section hero plein écran du studio de jeux Frixan — pendule en fond animé

QuandLe visiteur arrive sur la homepage du studio ; le pendule s'est déjà lancé automatiquement et peut être tiré librement.
PourquoiUn pendule de Newton cliquable en arrière-plan démontre immédiatement la spécialité du studio (physique réelle) sans détourner l'attention du message.
RéglagesCanvas 300 px à top: 40 px en position: absolute ; texte hero en z-index: 10 avec text-shadow sur fond sombre ; angle initial −0,5 rad.
Mini-jeu « Élan Maximum » — interface complète avec score et minuteur — Interactive Newton's Cradle exemple 3

③ Mini-jeu « Élan Maximum » — interface complète avec score et minuteur

QuandLe joueur tire précisément la bille extérieure pour maximiser la force avant le lâcher, puis la relâche au bon moment pour accumuler des points.
PourquoiLa mécanique naturelle de tir-et-lâcher du pendule devient une règle de jeu immédiatement compréhensible ; le score récompense la précision.
RéglagesHeader 46 px + zone de jeu flex:1 + footer 46 px ; setInterval pour le compte à rebours et l'animation de la barre de force.

Comment ça marche

Interactive Newton's Cradle — à distinguer de Newton's Cradle Loop (fx-0384, animation automatique) : ici l'utilisateur tire lui-même les billes et déclenche les collisions. La racine .fx-0389-root contient un canvas .fx-0389-canvas de 100 % × 300 px. Le script calcule le devicePixelRatio à l'init, dimensionne le bitmap en conséquence et dessine en pixels CSS grâce à ctx.scale(dpr, dpr). Les cinq billes sont réparties à 40 px d'intervalle autour du centre horizontal ; la première commence à −0,5 radian pour amorcer l'oscillation.

À chaque trame, l'accélération angulaire de chaque bille libre vaut −0,0015 × sin(angle) (pendule simple), avec un amortissement de 0,9995 par trame. Les collisions sont détectées quand la distance horizontale entre deux billes consécutives est inférieure à la somme de leurs rayons : l'élan est alors échangé et les angles ajustés pour séparer les billes. La mise à l'échelle par dt / 16,67 (borné à 50 ms) garantit une simulation stable après un onglet en arrière-plan.

Un mousedown (ou touchstart) recherche la bille sous le curseur en comparant la distance à son rayon ; mousemove (ou touchmove) met à jour l'angle de la bille tenue en fonction de la position horizontale du curseur, bornée à ±0,8 radian. Un IntersectionObserver observe la racine pour suspendre la boucle hors écran.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, la boucle ne démarre pas et les billes s'affichent dans leur position initiale sans oscillation. L'effet est visible et lisible.
  • Clavier : l'interaction nécessite une souris ou un doigt (clic-glisser sur une bille). Il n'existe pas d'équivalent clavier naturel pour un clic-glisser sur un canvas. Les utilisateurs au clavier ne peuvent pas interagir avec l'effet — à dire honnêtement si l'effet est utilisé comme composant fonctionnel.
  • Toucher : touch-action: none sur le canvas empêche le défilement de la page quand le doigt glisse dessus. L'effet répond au toucher sur mobile.
  • Rôle décoratif : le canvas ne porte aucune information textuelle. Si les billes représentent des entités nommées, exposez ces noms en texte à côté du canvas.

Compatibilité navigateur

Canvas 2D (devicePixelRatio, IntersectionObserver, matchMedia), aucune dépendance. IntersectionObserver disponible depuis Chrome 51, Firefox 55 et Safari 12.1. Non mesuré dans Firefox et WebKit.

Chrome 51+✓ Complet (mesuré)
Firefox 55+✓ Complet (non mesuré)
Safari 12.1+✓ Complet (non mesuré)
Edge 79+✓ Complet (moteur Chromium)
Mobile iOS 12.2+✓ Complet (non mesuré)
Android Chrome 51+✓ Complet (mesuré sur Chromium)

Sans JavaScript, le canvas reste vide. Sans IntersectionObserver, la simulation tourne aussi hors écran. Sans matchMedia, les billes s'animent 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-0389-root"><div class="physics-container"><canvas class="fx-0389-canvas"></canvas><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
Longueur des fils (JS — var STR = 120) 120 px 80 px pour un pendule plus rapide et compact, 160 px pour un balancement plus lent et ample.
Angle initial (JS — angle: i === 0 ? -0.5 : 0) −0,5 radian pour la première bille −0,8 pour un départ plus fort (élan maximal : 0,8 radian), 0 pour démarrer en équilibre (attendre un clic).
Amortissement (JS — Math.pow(0.9995, scale)) 0,9995 par trame 0,999 arrête l'oscillation en quelques secondes, 0,9999 la maintient quasi indéfiniment.
Couleurs des billes (JS — dégradé dans createRadialGradient) #8b5cf6, #6366f1, #4338ca Remplacez par la couleur primaire de votre charte. Les trois arrêts du dégradé donnent l'effet 3D.
Nombre de billes (JS — for (var i = 0; i < 5; i++)) 5 billes 3 ou 7 billes fonctionnent ; ajustez l'espacement (40 * i) et l'offset (−80) en conséquence.

FAQ

Non dans cette version : un seul index de bille tenue (dragIdx) est maintenu. Pour tirer deux billes, il faudrait gérer deux touches simultanées (Touch.identifier) et deux index de glisser.
L'algorithme capture le comportement visuel de la conservation de l'élan — une bille projette la suivante — mais simplifie la résolution des contraintes. Pour une simulation physiquement rigoureuse, utilisez une bibliothèque dédiée comme Matter.js.
Changez la constante H = 300 dans le JS et la règle CSS .fx-0389-canvas { height: 300px }. La barre d'accroche se redessine automatiquement à y = 30 ; les fils descendent de STR pixels en dessous.