Hover✨ Premium

Liquid Simulation

La souris repousse les quinze gouttes DOM : la nappe s'ouvre autour du curseur et se referme doucement au centre quand il quitte la zone (rappel faible). Un filtre SVG goo (flou gaussien + seuil d'alpha) fusionne les gouttes qui se chevauchent en surface homogène. À différencier de la catégorie Liquid (fx-0391–0420) qui utilise canvas ou WebGL.

JSFluidMetaball

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

Page vitrine — nappe décorative plein fond — Liquid Simulation exemple 1

① Page vitrine — nappe décorative plein fond

QuandHero section sombre d'une agence ou d'un studio créatif.
PourquoiLa nappe bleue remplit l'espace sous le texte et s'ouvre autour du curseur quand le visiteur explore la page — mouvement fluide sans clic.
RéglagesDrops bleu cyan (#67e8f9 → #0369a1). Texte en haut avec fond opaque (z-index:10). Nappe plein fond (z-index:1, pointer-events reçus directement par le sim).
Indicateur d'envoi — formulaire de contact d'un site professionnel — Liquid Simulation exemple 2

② Indicateur d'envoi — formulaire de contact d'un site professionnel

QuandAu repos, les gouttes forment une masse au centre de la zone de rétroaction (force centripète faible). Au clic sur « Envoyer », la scène guide le sim par événement synthétique : dispatchEvent(new MouseEvent('mousemove', { clientX: cx, clientY: cy })) centré sur le sim ; les gouttes fuient ce point par répulsion et forment un anneau — signe que le message est en cours de traitement. Après 1,4 s, un mouseleave synthétique laisse les gouttes se rassembler à nouveau.
PourquoiUn spinner générique disparaît en un clin d'œil ; l'anneau qui s'ouvre puis se referme offre un retour d'état visible sans ressource externe ni image.
RéglagesGouttes émeraude (#6ee7b7 → #059669), 15 drops 30–70 px (vrai code). Zone de rétroaction 100 % × 150 px dans la carte (overflow:hidden, border-radius:10px) ; racine position:absolute; inset:0; min-height:0. pointer-events:none sur le sim au clic pour isoler l'animation des événements naturels.
Portail client — Zone de dépôt de fichiers — Liquid Simulation exemple 3

③ Portail client — Zone de dépôt de fichiers

QuandFormulaire d'envoi de pièces jointes (portail client, back-office, outil interne).
PourquoiLa nappe violette s'écarte là où le fichier est tenu au-dessus de la zone, rendant visible l'emplacement de dépôt. En intégration réelle : écouter dragover sur la zone et envoyer un mousemove synthétique au .ls385-sim à la position du fichier (e.clientX/Y), puis mouseleave sur dragleave.
RéglagesDrops violet-foncé (#c4b5fd → #6d28d9). En-tête opaque z-index:10 (titre + bouton Parcourir toujours lisibles). Libellé de la zone avec text-shadow fort (lisible même si les gouttes passent devant). Zone de dépôt : y:76–360 dans la section (284 px de hauteur).

Comment ça marche

La technique « goo » repose sur deux primitives SVG appliquées à un conteneur : feGaussianBlur (flou de 8 px) puis feColorMatrix avec un fort contraste sur le canal alpha (0 0 0 18 −7). Cet effet CSS est appliqué à .ls385-sim via filter: url(#uid). L'id du filtre est unique par instance (généré aléatoirement) pour éviter les conflits quand deux copies coexistent dans la même page : uid = 'ls385-goo-' + Math.random().toString(36).slice(2,7).

Les 15 gouttes (div.ls385-drop) sont créées au chargement avec une taille aléatoire (30–70 px) et des positions initiales aléatoires dans le conteneur. À chaque image, chaque goutte subit : une répulsion du curseur (vx −= dx/dist × fo, fo = (110−dist)/110 × 0,45) quand le curseur est à moins de 110 px ; un rappel faible vers le centre (vx += (cx−x) × 0,0006 × f) toujours actif ; un frémissement aléatoire (vx += (rand−0,5) × 0,12) ; et un amortissement (vx *= 0,96^f). Quand le curseur quitte la zone, seul le rappel vers le centre reste actif : les gouttes se rassemblent lentement en masse au centre. Le step est normalisé à 60 fps : f = dt / 16.67. Un IntersectionObserver met la boucle en pause hors écran.

Accessibilité

  • Toucher : touchmove repousse les gouttes autour du doigt, exactement comme le curseur. touchend déclenche le retour progressif au centre.
  • Clavier : l'effet est purement décoratif et ne réagit pas au clavier.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, la boucle ne démarre pas et les gouttes restent en anneau fixe autour du centre, visibles grâce au filtre goo qui les fond légèrement.
  • Différence avec la catégorie Liquid : les effets Liquid (fx-0391 à fx-0420) utilisent canvas ou WebGL pour des effets de surface, de métaballs ou de réfraction. Cet effet utilise exclusivement des div DOM et un filtre SVG, sans aucun pixel dessiné — c'est une simulation visuelle en CSS/DOM, pas un rendu graphique.

Compatibilité navigateur

DOM, CSS et filtre SVG, aucune dépendance. feGaussianBlur et feColorMatrix disponibles dans tous les navigateurs modernes depuis Chrome 8, Firefox 3, Safari 6. filter: url(#id) sur un élément HTML requiert Chrome 18+, Firefox 35+, Safari 9.1+. IntersectionObserver depuis Chrome 51, Firefox 55, Safari 12.1. 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, les gouttes s'affichent en anneau fixe, avec le filtre goo actif qui les fond légèrement. 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-0385-root">
  <div class="ls385-wrap">
    <div class="ls385-sim"></div>
    <svg class="ls385-svg" width="0" height="0" aria-hidden="true" focusable="false">
      <filter>
        <feGaussianBlur in="SourceGraphic" stdDeviation="8" result="blur"></feGaussianBlur>
        <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 18 -7" result="goo"></feColorMatrix>
        <feComposite in="SourceGraphic" in2="goo" operator="atop"></feComposite>
      </filter>
    </svg>
    <span class="ls385-label" aria-hidden="true">Survolez pour fusionner les gouttes</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 gouttes (JS — boucle for(var i=0;i<15;i++)) 15 8 donne un blob compact peu défini ; 25 une surface plus lisse et plus riche. Au-delà de 30, le filtre goo devient lent sur mobile.
Rayon d'influence du curseur (JS — dist < 110) 110 px 150 px agrandit la zone de répulsion et crée une ouverture plus ample ; 70 px ne répond qu'au contact proche du curseur.
Force de répulsion (JS — facteur 0,45) 0,45 0,7 donne une fuite très vive et des gouttes qui jaillissent ; 0,2 une ouverture progressive et lente.
Rappel vers le centre (JS — (cx−x) × 0,0006) 0,0006 0,002 ramène les gouttes plus vite quand le curseur quitte la zone ; 0,0001 les laisse dériver longtemps avant de se regrouper.
Flou SVG (HTML — stdDeviation="8") 8 12 donne une fusion plus douce et un contour plus flou ; 4 des contours nets mais une fusion visible seulement au contact.

FAQ

Les effets Liquid (fx-0391–0420) utilisent un canvas ou WebGL pour simuler des surfaces, des métaballs ou des réfractions au niveau du pixel. Cet effet utilise exclusivement des div DOM et un filtre SVG : aucun pixel n'est dessiné, tout est CSS et DOM. Il est plus léger mais moins réaliste, et son rendu change si filter: url() sur HTML n'est pas pris en charge (Safari < 9.1).
Deux copies du code dans la même page auraient le même id sur leurs filtres SVG, ce qui est invalide en HTML (les ID doivent être uniques). Le navigateur ne sait plus lequel utiliser et peut appliquer le filtre de la première copie aux deux, ou ne l'appliquer à aucune. L'ID aléatoire résout ce conflit sans avoir à numéroter les instances.
Oui. Le background de chaque div.ls385-drop est une propriété CSS animable. Utilisez une @keyframes sur chaque goutte avec un délai décalé (animation-delay) pour un arc-en-ciel qui tourne ; ou changez la couleur depuis le JS à chaque image pour suivre le déplacement.