Atmosphère✨ Premium

Liquid Button

Remplissage liquide en CSS pur : un pseudo-élément circulaire s'étend depuis le centre au survol, transformant la teinte du bouton en une vague fluide — zéro JavaScript.

CSSHover

Vous aurez accès à la démo interactive avec un compte gratuit.

Cet effet fait partie d'Effect.Labs — 811 effets vanilla, une partie gratuite, une partie premium. Atmosphère comprend 57 effets, dont 10 gratuits. Découvrir la catégorie →

3 exemples d'usage

Hero / Landing — CTA principal d'une landing page SaaS — Liquid Button exemple 1

① Hero / Landing — CTA principal d'une landing page SaaS

QuandLe bouton d'appel à l'action principal occupe la zone hero — « Essayer gratuitement », « Commencer », « Réserver une démo ».
PourquoiL'animation de remplissage attire le regard vers le CTA sans distraction supplémentaire. Elle signale l'interactivité dès le survol et renforce la confiance avant le clic.
RéglagesCouleur de fond #6366f1 (indigo brand), remplissage #8b5cf6 (violet complémentaire), padding --space-4:1.1rem; --space-8:2.4rem, rayon --radius-lg:0.75rem, font-size 1rem bold.
Composant produit — Bouton « Choisir ce plan » sur une carte pricing — Liquid Button exemple 2

② Composant produit — Bouton « Choisir ce plan » sur une carte pricing

QuandLes cartes tarifaires affichent plusieurs plans côte à côte — l'utilisateur compare et survole chaque bouton avant de choisir.
PourquoiL'effet liquide différencie visuellement le plan survolé et maintient l'attention sur le bouton actif dans une interface dense.
RéglagesCouleur de fond #0f172a (slate foncé), remplissage #6366f1 (indigo) pour le plan standard ; remplissage #d946ef (fuchsia) pour le plan Pro ; transition .5s ease, taille cercle 200×200px (bouton compact).
Micro-interaction de conversion — Bouton de validation de commande — Liquid Button exemple 3

③ Micro-interaction de conversion — Bouton de validation de commande

QuandL'utilisateur est en fin de tunnel d'achat ou de formulaire — le bouton « Confirmer », « Payer » ou « S'inscrire » doit exprimer la finalité de l'action.
PourquoiUn remplissage vert émeraude renforce le code couleur « Go » et donne un retour visuel immédiat avant la redirection, réduisant la latence perçue.
RéglagesCouleur de fond #10b981 (emerald), remplissage #34d399 (emerald clair), transition .4s ease, cercle 300×300px, font-weight 700.

Comment ça marche

L'effet repose entièrement sur un pseudo-élément ::before positionné en absolu au centre du bouton (top:50%; left:50%; transform:translate(-50%,-50%)). Au repos, il mesure 0×0 px et est donc invisible. Au :hover, il passe à 300×300 px avec border-radius:50% : le cercle grossit depuis le centre et son débordement est clippé par overflow:hidden sur le bouton parent, créant l'illusion d'un remplissage qui monte comme un liquide.

Deux transitions CSS indépendantes se superposent : transition:.3s sur .liquid-btn pilote d'éventuels changements de propriétés du bouton lui-même, et transition:.5s sur le ::before contrôle l'expansion du cercle. Le texte est placé dans un <span> avec position:relative; z-index:1 pour rester au-dessus du remplissage en cours d'animation.

L'effet ne touche pas au DOM, ne lance aucun requestAnimationFrame et n'expose aucune API JavaScript — c'est du CSS déclaratif pur. Les navigateurs modernes GPU-accélèrent la propriété width/height via le compositing, ce qui rend la transition fluide sans coût CPU notable. Aucune variable CSS n'est lue dynamiquement : les tailles de padding et de rayon utilisent des custom properties --space-4, --space-8 et --radius-lg définies sur :root.

Accessibilité

  • prefers-reduced-motion absent dans le code : l'animation de remplissage se déclenche systématiquement au survol, quel que soit le réglage du système. Pour les utilisateurs sensibles, ajoutez @media (prefers-reduced-motion:reduce) { .liquid-btn::before { transition:none } }.
  • Le <button> natif est focusable au clavier (Tab) et activable avec Entrée ou Espace — aucune configuration supplémentaire requise.
  • Aucun style :focus-visible n'est défini dans le code ; le navigateur applique son contour par défaut (peut être peu visible sur certains OS/thèmes). Recommandé : ajouter .liquid-btn:focus-visible { outline:2px solid #818cf8; outline-offset:2px }.
  • Contraste texte blanc sur fond #6366f1 (indigo) : ratio ≈ 3,9:1 — passe WCAG AA pour les grandes interfaces (≥ 18 pt), mais échoue pour le texte courant (< 18 pt). Adapter la couleur de fond ou alourdir la police si nécessaire.
  • overflow:hidden sur le bouton empêche le pseudo-élément de déborder en dehors du rayon de bordure — aucune fuite visuelle quelle que soit la taille du bouton.

Compatibilité navigateur

Nécessite uniquement ::before, transition, border-radius et overflow:hidden — disponibles depuis CSS2/3 dans tous les navigateurs modernes.

Chrome 88+✓ Complet
Firefox 87+✓ Complet
Safari 14+✓ Complet
Edge 88+✓ Complet
Mobile iOS✓ Touch — hover sur tap+hold
Android Chrome✓ Touch — hover sur tap+hold

Sans support des pseudo-éléments CSS (navigateurs très anciens), le bouton s'affiche normalement avec sa couleur de fond indigo — aucune erreur, aucun JS impliqué.

Le code

Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :

index.html — structure
<button class="liquid-btn">
  <span>Libellé du bouton</span>
</button>
🔒 Débloquer le code complet — à partir de 2,99 € le 1er mois

HTML + CSS + JS complet, prêt à coller — avec des centaines d'effets premium.

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
background sur .liquid-btn #6366f1 Couleur initiale du bouton. Remplacez par la couleur brand — la couleur de remplissage devra contraster avec celle-ci.
background sur .liquid-btn::before #d946ef Couleur du cercle liquide au survol. Choisissez une couleur complémentaire ou analogue pour un effet harmonieux.
--radius-lg (var CSS :root) 0.75rem Border-radius du bouton. Passez à 100px pour une pilule, à 0 pour un rectangle franc.
--space-4 / --space-8 (var CSS :root) 1rem / 2rem Padding vertical / horizontal du bouton. Augmentez pour un bouton CTA hero, réduisez pour un contexte compact.
transition sur .liquid-btn::before .5s Durée d'expansion du remplissage. .3s = réaction vive, .8s = déploiement lent et dramatique.
width / height sur .liquid-btn:hover::before 300px Diamètre max du cercle liquide. Augmentez à 400px ou plus si votre bouton dépasse 250 px de largeur — sinon les coins restent visibles.
z-index sur .liquid-btn span 1 Maintient le texte au-dessus du remplissage. Ne pas descendre en dessous de 1 pour éviter que le texte disparaisse lors de l'animation.

FAQ

Non. L'effet est entièrement en CSS : un pseudo-élément ::before, une transition sur width et height, et overflow:hidden pour le clipping. Aucun script n'est chargé, aucune dépendance npm. Intégrable dans n'importe quel framework (React, Vue, Svelte) en copiant uniquement le CSS.
Le code ne contient pas de clause prefers-reduced-motion nativement. Ajoutez ce bloc CSS après l'inclusion de l'effet : @media (prefers-reduced-motion:reduce) { .liquid-btn::before { transition:none; width:100%; height:100%; border-radius:0; opacity:.15; } }. Cela désactive l'animation et affiche un léger tint statique à la place.
La valeur de width et height sur .liquid-btn:hover::before est fixée à 300 px. Si votre bouton est plus large (ex. bouton pleine largeur), le cercle ne remplira pas les coins. Calculez la diagonale du bouton avec Math.sqrt(w²+h²) et utilisez cette valeur (arrondie au supérieur) comme diamètre. Alternativement, remplacez width/height par une transformation : transform:translate(-50%,-50%) scale(4) sur le hover est plus robuste pour les boutons de taille variable.