Explosion radiale de confettis métallisés en Canvas 2D : 260 pièces en 4 vagues, éclairage par normale 3D et glints, pluie de 2-3 s, physique normalisée Δt et API ConfettiExplosion.burst().
ConfettiCanvas 2DExplosionCélébration
Clic · ou
Survolez ou cliquez la scène pour interagir
Cet effet est gratuit — la catégorie Atmosphère en contient 57 au total, dont 10 gratuits. Effect.Labs regroupe 811 effets vanilla. Découvrir la catégorie →
QuandL'utilisateur termine un parcours (formation, défi, streak) et clique sur « Réclamer mon badge » — l'explosion radiale éclate depuis le bouton et inonde le cadre de confettis dorés.
PourquoiLa grande surface sombre laisse les confettis dorés exploser librement.
RéglagesPalette or (#FFD700, #FFF0A0, #FFA500, #FFFFFF, #FDFFB6), count 260, power 1,0. 4 vagues sur 148 ms depuis le bouton centré-bas. DRAG 0,96, G 0,06.
🏆
Victoire !
Score final : 9 840 pts
② Victoire — Fin de partie
QuandLa partie se termine et l'écran de résultats s'affiche — tournoi, quiz multijoueur, fin de niveau. L'explosion se déclenche automatiquement à l'entrée dans le viewport (180 ms).
PourquoiL'auto-burst au viewport évite d'exiger un clic sur un écran de résultats — les confettis explosent dès l'affichage et remplissent tout l'espace. Cliquer sur la scène relance un second tir de 160 particules.
RéglagesPalette candy par défaut (#FF4D9E, #FFD700, #00E5FF, #8AFF59, #FF8040, #E040FB), count 260, auto-burst activé. Les 2 couches (alpha 0,70 / 1,00) créent la profondeur.
⚡
10/10
Quiz JavaScript
0 faute · 4 min 12 s
③ Quiz terminé — Score parfait
QuandL'utilisateur termine un quiz sans faute. La page de résultats révèle le score et le bouton « Partager » déclenche l'explosion depuis le bas de la scène.
PourquoiLe contraste fond sombre + confettis arc-en-ciel rend l'explosion radiale maximalement lisible. Les rubans courbés et les étoiles ajoutent une variété de formes que les interfaces de quiz apprécient.
L'IIFE instancie une instance par .cxp-scene trouvée dans la page. Chaque instance maintient un pool local ≤ 550 particules, 12 confettis flotteurs permanents qui dérivent lentement vers le bas en boucle, et 14 sparkles qui scintillent entre les explosions. Un seul requestAnimationFrame par instance pilote le rendu ; un IntersectionObserver (seuil 0,15) démarre et arrête la boucle selon la visibilité ; un ResizeObserver recalibre le canvas au redimensionnement en tenant compte du devicePixelRatio.
À chaque tir, les particules partent en 4 vagues étalées sur 148 ms — 30 % à 0 ms, 28 % à 42 ms, 25 % à 90 ms, 17 % à 148 ms — pour éviter un pic de spawn visible. Ensuite la physique prend le relais : traînée d'air 0,96 par frame, gravité 0,06, flottement latéral 0,32 et rotation qui ralentit — les pièces retombent en 2 à 3 s.
Quatre formes se mélangent au hasard : rectangles, ronds, rubans courbés (9 segments en courbe de Bézier quadratique) et étoiles 5 branches. Chaque particule simule une normale 3D via rotX × rotY : face vers l'observateur → couleur principale ; face opposée → teinte assombrie à 30 % (darken(hex, 0.30)). Un glint spéculaire (~92 % d'intensité) décale brièvement la couleur vers le blanc. La physique est Δt-normalisée : traînée DRAG = 0,96 par frame @ 60fps (compensée en DRAG^dt), gravité G = 0,06 px/frame², flottement latéral WOB = 0,32. Les particules vivent 144–204 frames et s'effacent dans le dernier 25 % de leur vie.
En mode repos, les flotteurs dérivent et les sparkles clignotent. Une explosion automatique se déclenche à l'entrée dans le viewport (délai 180 ms) et se répète toutes les 7 s si aucun clic n'a eu lieu. En prefers-reduced-motion, une unique explosion douce (20 particules, power = 0,50) se déclenche à l'entrée puis toute boucle s'arrête — floaters et auto-répétition compris.
Accessibilité
prefers-reduced-motion : si réduit, un unique tir doux (20 particules, power = 0,50) se déclenche à l'entrée dans le viewport puis toute animation s'arrête. Les 12 flotteurs permanents et l'auto-répétition toutes les 7 s sont également désactivés.
La scène porte role="img" et un aria-label descriptif ; le canvas est marqué aria-hidden="true" — les éléments graphiques n'alimentent pas l'arbre d'accessibilité.
Le déclencheur est un <button class="cxp-btn"> HTML natif, focusable au clavier (Tab / Entrée / Espace), avec anneau :focus-visible doré (#fbbf24).
Les clics en dehors du bouton déclenchent un tir au point exact du clic (160 particules) — le clavier n'est jamais requis pour accéder à la fonctionnalité principale.
Compatibilité navigateur
Nécessite Canvas 2D, requestAnimationFrame, IntersectionObserver et ResizeObserver — disponibles dans tous les navigateurs modernes. Zéro dépendance externe.
Chrome 88+✓ Complet
Firefox 78+✓ Complet
Safari 15+✓ Complet
Edge 88+✓ Complet
Mobile iOS 15+✓ Touch OK
Android Chrome✓ Complet
Sans support Canvas 2D, la scène reste vide (aucune erreur JS fatale) ; le bouton et tout texte superposé restent lisibles. Sans IntersectionObserver (IE 11), l'effet démarre immédiatement à l'initialisation.
Le code
Copiez les trois blocs dans votre page. Aucune dépendance.
HTML
<div class="cxp-scene" id="cxpScene"
role="img"
aria-label="Confetti Explosion — explosion radiale de confettis métallisés depuis le bouton"
data-colors="#FF4D9E,#FFD700,#00E5FF,#8AFF59,#F0F4F8,#FF8040,#E040FB,#FDFFB6">
<canvas class="cxp-canvas" aria-hidden="true"></canvas>
<div class="cxp-label" aria-hidden="true">Clic · ou</div>
<button class="cxp-btn" aria-label="Lancer une explosion de confettis">🎉 Celebrate!</button>
</div>
Palette des confettis — liste de hex séparés par des virgules sur l'élément HTML. Surchargeable par tir avec window.ConfettiExplosion.burst({colors:['#f00','#fff']}).
burst({count})
260 (20 en reduced-motion)
Nombre de particules par tir via l'API. Entre 60 et 350 pour des performances fluides sur mobile. Le clic en dehors du bouton génère toujours 160 particules (fixe dans le code).
burst({power})
1,0 (0,50 en reduced-motion)
Multiplicateur de vitesse initiale. 1,0 = normal (couche proche : spMin 4–8 px/frame @ 60fps), 0,5 = doux, 1,5 = énergique. Modifie les deux couches proportionnellement.
burst({x, y})
centre du bouton ou centre scène
Origine du tir en pixels CSS dans le référentiel de la scène. Ex. : burst({x: 0, y: sceneH}) pour tirer depuis le bas-gauche.
DRAG = 0,96
0,96 par frame @ 60fps
Traînée d'air par frame (compensée en Δt). Augmenter vers 0,99 pour des confettis qui planent plus longtemps ; diminuer vers 0,92 pour un freinage plus rapide.
G = 0,06
0,06 px/frame² @ 60fps
Gravité par frame (compensée en Δt). Augmenter à 0,12 pour une retombée rapide type pluie ; diminuer à 0,02 pour un effet flottant microgravité.
AUTO_INTERVAL = 7000
7000 ms
Délai en ms entre deux explosions auto-lancées si aucun clic n'a eu lieu. Mettre Infinity pour désactiver la répétition et ne conserver que le burst à l'entrée viewport.
Quatre palettes prédéfinies dans l'IIFE. Remplacer COLORS_DEFAULT = PALETTES.gold en tête du script pour changer la palette de toutes les scènes sans data-colors.
FAQ
Comment déclencher l'explosion depuis un bouton externe à la scène ?
Appelez window.ConfettiExplosion.burst({x, y, count, colors, power}) depuis n'importe quel événement. x et y sont en pixels CSS dans le référentiel de la scène ; sans ces valeurs, l'explosion part du centre. L'API déclenche toutes les instances .cxp-scene de la page simultanément.
L'effet fonctionne-t-il sans JavaScript framework ?
Oui — le code est une IIFE vanilla, zéro dépendance. Copiez le bloc CSS et le bloc JS dans n'importe quelle page HTML, ajoutez un <div class="cxp-scene"><canvas class="cxp-canvas"></canvas></div> et l'effet s'initialise automatiquement au chargement.
L'effet respecte-t-il prefers-reduced-motion ?
Oui. Quand prefers-reduced-motion est activé dans l'OS, une seule explosion courte et douce (20 particules, power = 0,50) se déclenche à l'entrée dans le viewport, puis toute animation s'arrête. Les flotteurs permanents et l'auto-répétition toutes les 7 secondes sont également désactivés.