Liquid✨ Premium

Liquid Morph

Trois gouttes violette, rose et cyan (80, 70 et 50 px) tournent au centre d'une scène de 280 × 160 px, se collent puis se détachent toutes les 4 s : un filtre SVG « goo » écrit dans le HTML floute la scène puis durcit les bords, et deux gouttes proches se soudent par un pont de matière avant de se toucher — CSS, zéro JavaScript, figées en pleine fusion si l'utilisateur réduit les animations.

CSSSVG FilterOrganique

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. Liquid comprend 31 effets, dont 6 gratuits. Découvrir la catégorie →

3 exemples d'usage

Recharge de savon liquide 1 L — fiche produit d'une savonnerie artisanale — Liquid Morph exemple 1

① Recharge de savon liquide 1 L — fiche produit d'une savonnerie artisanale

QuandLe client regarde la recharge d'un litre : le bidon à gauche, à droite les trois parfums de la gamme en trois gouttes qui se collent et se détachent, le prix et le bouton d'ajout au panier en dessous.
PourquoiTrois gouttes regroupées au centre, qui fusionnent puis se séparent, font une matière visqueuse à petite échelle : on lit « savon à mélanger » sans photo. Metaballs remplit tout le cadre, trop grand et trop agité pour une fiche produit.
RéglagesRacine sans fond posée sur le décor crème, scène de 280 × 160 px gardée ; gouttes recolorées lavande #9b7fd4, verveine #bfcf4a et menthe #3fbf9b ; filtre recopié avec l'id k408-goo-1 ; boucle décalée (animation-delay: -2.4s) pour ouvrir sur la séparation ; légende des parfums sous la scène.
Synergie d'huiles essentielles — fiche d'une herboristerie — Liquid Morph exemple 2

② Synergie d'huiles essentielles — fiche d'une herboristerie

QuandFiche de la « Synergie Respiration » : eucalyptus, ravintsara et menthe poivrée, avec leurs proportions et leur origine à gauche, les trois gouttes qui se rejoignent au centre à droite.
PourquoiUne couleur par huile, et la fusion montre trois huiles qui deviennent une seule préparation : c'est exactement ce que vend la fiche. La légende à gauche porte les noms, la scène reste muette comme le veut le filtre.
RéglagesEucalyptus #3fb4c8, ravintsara #7cbf4a, menthe poivrée #e3ec7a sur fond vert sombre ; filtre recopié avec l'id k408-goo-2 ; animation-delay: -3.2s ; liste des trois huiles avec pastilles de même couleur.
Jus en trois sirops — carte d'un bar à jus — Liquid Morph exemple 3

③ Jus en trois sirops — carte d'un bar à jus

QuandCarte du « Tropique » (mangue, passion, citron vert) : trois gouttes colorées s'agglutinent dans la carte, au-dessus du prix et du format du verre.
PourquoiL'effet tient dans un petit encart, à côté du nom de la boisson ; le mouvement en orbite évoque le mélange sans remplir l'écran, et la scène de 280 × 160 px coûte peu même sur un téléphone.
RéglagesCarte blanche de 300 px de large sur un dégradé orange ; gouttes mangue #ffb21a, passion #7b3fa0, citron vert #86cc32 ; filtre recopié avec l'id k408-goo-3 ; animation-delay: -3.2s.

Comment ça marche

La racine .fx-0408-root (fond #0a0a0f, 300 px de haut au minimum) contient deux choses. D'abord un <svg class="fx-0408-defs"> de 0 × 0 px, retiré du flux, qui ne sert qu'à porter le filtre <filter id="fx-0408-goo">. Ensuite la scène .liquid-morph-stage, 280 × 160 px, sans fond, qui reçoit filter: url(#fx-0408-goo) et centre trois .liquid-drop rondes : violette #a855f7 de 80 px, rose #ec4899 de 70 px, cyan #06b6d4 de 50 px. Chacune a sa boucle de 4 s (ease-in-out) : la violette va de −60 px à +20 px en largeur, la rose de +60 px à −20 px, la cyan de 40 px sous le centre à 20 px au-dessus, avec un léger gonflement entre ×0,95 et ×1,1. Au début de la boucle, 45 px séparent la violette de la rose ; vers 400 ms elles se rejoignent ; de 1 à 3 s les trois se chevauchent au centre, puis elles repartent chacune de leur côté.

Le filtre tient en trois lignes. feGaussianBlur stdDeviation="10" floute toute la scène : le bord de chaque goutte devient un dégradé d'opacité, et entre deux gouttes proches, les deux halos s'additionnent. feColorMatrix garde les couleurs et réécrit l'opacité (dernière ligne 0 0 0 20 -9 : opacité × 20 − 9) : ce qui est sous 45 % devient transparent, ce qui dépasse 50 % devient plein. Le bord redevient net, et la zone entre deux gouttes où les halos cumulés passent le seuil devient un pont plein. feComposite operator="atop" redessine enfin les gouttes d'origine par-dessus cette silhouette : les couleurs restent franches, seul le pont prend la teinte mêlée du flou. Mesuré sur l'axe horizontal à 400 ms de la boucle : 12 à 13 px de vide entre la violette et la rose sans le filtre, 0 px avec, à l'identique dans Chromium 151, Firefox 153 et WebKit 26. color-interpolation-filters="sRGB" évite que le flou, calculé sinon en lumière linéaire, assombrisse les ponts.

Trois choix tiennent l'effet debout. La scène n'a pas de fond : le seuil s'appliquerait au fond, qui deviendrait un rectangle plein, et les gouttes n'auraient plus de bord à souder. Le filtre est écrit dans le HTML, avec un id préfixé : url(#…) ne cherche que dans le document, et Firefox n'affiche plus du tout la scène quand l'id est introuvable ou que le <svg> est en display: none (mesuré : scène vide), là où Chrome et Safari ignorent le filtre et montrent trois disques plats. Enfin, le filtre a un coût : mesuré dans Chromium en rendu logiciel (sans carte graphique, le cas le plus lent), il prend 0,87 ms par image à la taille vendue contre 0,10 ms sans lui ; la même scène agrandie quatre fois (1 120 × 640 px, flou de 40) monte à 15,7 ms par image et divise la cadence par deux. Le filtre est fait pour une petite scène, pas pour un fond plein écran.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, un bloc limité à .fx-0408-root arrête les trois boucles et pose les gouttes à −38 px, +38 px et 34 px sous le centre : une image fixe où les trois gouttes sont soudées, la fusion se lit sans mouvement. Mesuré : 0 % des pixels changent en 500 ms dans Chromium, Firefox et WebKit (3,6 % sans la préférence).
  • Contenu décoratif : la scène ne porte aucun texte et aucune information. Le <svg> du filtre est marqué aria-hidden="true" et focusable="false", les gouttes sont des div vides que les lecteurs d'écran ignorent. Si les couleurs ont un sens (trois parfums, trois ingrédients), écrivez-le à côté, comme la légende des scènes ci-dessus : ne mettez pas de texte dans la scène, le flou et le seuil le rendraient illisible.
  • Contraste : sur le fond #0a0a0f, la goutte violette mesure 5,0:1, la rose 5,6:1 et la cyan 8,1:1, au-dessus du seuil de 3:1 des éléments graphiques. Sur un fond clair, foncez les gouttes : le filtre ne change pas les couleurs.
  • Rythme : une boucle de 4 s, sans clignotement ni changement brusque de luminosité ; le mouvement reste dans un cadre de 280 × 160 px.

Compatibilité navigateur

CSS (filter: url() sur un élément HTML, animations de transform) + un filtre SVG de trois primitives écrit dans le HTML, zéro JavaScript, aucune dépendance. Mesuré dans Chromium 151, Firefox 153 et WebKit 26 : même fusion (pont plein à 400 ms de la boucle), même arrêt sous mouvement réduit. Deux copies de l'effet sur une page, avec le même id, fonctionnent dans les trois (filtres identiques) ; changez l'id si vous réglez une copie autrement. Coût mesuré dans Chromium en rendu logiciel : 0,87 ms par image à 280 × 160 px, 15,7 ms agrandi ×4.

Chrome 53+✓ Complet
Firefox 35+✓ Complet (le svg du filtre doit rester affiché)
Safari 9.1+✓ Complet
Edge 79+✓ Complet
Mobile iOS✓ Complet
Android Chrome✓ Complet, à garder petit sur les téléphones modestes

Sans filtre SVG appliqué à du HTML (navigateur très ancien), la scène montre trois disques nets qui se croisent, sans pont de matière : le mouvement reste. Si vous déplacez le bloc <svg> dans une autre page ou le masquez en display: none, Firefox n'affiche plus la scène du tout : gardez le svg de 0 × 0 px dans la même page que la scène.

Le code

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

index.html — structure
<div class="fx-0408-root">
  <svg class="fx-0408-defs" width="0" height="0" aria-hidden="true" focusable="false">
    <filter id="fx-0408-goo" color-interpolation-filters="sRGB">
      <feGaussianBlur … stdDeviation="10" />
      <feColorMatrix … values="… 0 0 0 20 -9" />
      <feComposite in="SourceGraphic" in2="goo" operator="atop" />
    </filter>
  </svg>
  <div class="liquid-morph-stage">
    <div class="liquid-drop liquid-drop-1"></div> … (3 gouttes)
  </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
Force de la fusion (HTML — stdDeviation="10" du feGaussianBlur) 10 Plus le flou est large, plus le pont se forme tôt. Mesuré : à 300 ms de la boucle (26 px de vide sans filtre), il reste 27 px de vide à 6, 22 px à 10, 0 px à 16 ; mais à 16 les gouttes s'arrondissent en masse molle et la petite cyan rétrécit. Restez entre 8 et 14 pour des gouttes de cette taille.
Seuil (HTML — dernière ligne du feColorMatrix, 0 0 0 20 -9) 20 −9 (seuil autour de 45 à 50 % d'opacité) 18 -7 abaisse le seuil : gouttes et ponts plus gras (+10 % de surface mesurée), fusion plus précoce. 30 -14 donne des bords plus secs et des ponts plus fins. Gardez le second nombre autour de la moitié du premier.
Couleurs (CSS — background de .liquid-drop, -2, -3) #a855f7, #ec4899, #06b6d4 Le filtre garde les couleurs telles quelles ; seul le pont prend la teinte mêlée du flou. Des couleurs voisines donnent une seule matière, des couleurs opposées montrent mieux le mélange.
Vitesse (CSS — 4s dans les trois animation) 4 s Changez les trois durées ensemble pour garder les gouttes en phase. 6 s donne une matière plus épaisse, 2,5 s un bouillonnement. Un animation-delay négatif identique sur les trois décale le point de départ de la boucle.
Taille de la scène et des gouttes (CSS — .liquid-morph-stage, .liquid-drop-1/2/3, keyframes) 280 × 160 px ; gouttes de 80, 70 et 50 px ; trajets de 60 et 40 px Pour agrandir, multipliez ensemble la scène, les gouttes, les distances des keyframes et le stdDeviation. Le coût du filtre suit la surface : ×4 en largeur et en hauteur, la cadence chute de moitié en rendu logiciel.
Fond (CSS — .fx-0408-root) #0a0a0f Changez le fond de la racine ou retirez-le pour poser les gouttes sur votre page. Ne donnez jamais de fond à .liquid-morph-stage : le seuil le transformerait en rectangle plein.

FAQ

filter: url(#fx-0408-goo) désigne un élément du document lui-même : le filtre doit être dans la page où se trouve la scène. Gardez le bloc <svg class="fx-0408-defs"> tel quel, à 0 × 0 px. Mesuré : si l'id est introuvable ou si le svg passe en display: none, Firefox n'affiche plus du tout la scène, Chrome et Safari montrent trois disques plats sans pont. Deux copies de l'effet sur la même page peuvent partager l'id (filtres identiques) ; si vous réglez l'une autrement, donnez-lui son propre id et son propre filter: url().
Metaballs calcule la matière pixel par pixel sur un canvas : six boules rebondissent sur tout le cadre, et les ponts naissent d'un vrai champ de distance. Liquid Morph fait l'inverse : trois gouttes en HTML et CSS, regroupées au centre d'une scène de 280 × 160 px, soudées par un filtre SVG de flou et de seuil, sans aucun JavaScript. Choisissez Liquid Morph pour un petit encart à côté d'un texte ou d'un prix ; Metaballs pour un fond animé qui occupe tout le cadre.
Ce n'est pas son usage. Le flou se recalcule à chaque image sur toute la scène : mesuré dans Chromium en rendu logiciel, 0,87 ms par image à la taille vendue, 15,7 ms pour une scène quatre fois plus large et plus haute, et la cadence tombe de moitié. Sur une carte graphique le coût baisse, mais il suit toujours la surface. Pour un grand fond, préférez une animation sur canvas comme Metaballs ; pour Liquid Morph, gardez une scène de quelques centaines de pixels.