Glassmorphism✨ Premium

Liquid Glass Toggle

Un interrupteur de verre de 72 × 36 px dont la bille de 30 px glisse avec un léger dépassement et s'écrase pendant la course — aplatie à 125 × 75 %, puis étirée, puis ronde en 0,5 s — au clic comme au clavier (Espace, Entrée), avec son état annoncé aux lecteurs d'écran.

JSAnimationToggle

Mis à jour le

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

3 exemples d'usage

Activer le chauffage du bassin — appli d'une piscine connectée — Liquid Glass Toggle exemple 1

① Activer le chauffage du bassin — appli d'une piscine connectée

QuandLe propriétaire ouvre l'appli : l'eau est à 24,5 °C, il allume le chauffage depuis l'écran posé sur la photo de sa piscine.
PourquoiLa bulle qui s'écrase évoque l'eau et rend l'action tangible : on sent que quelque chose s'est mis en route. L'état reste clair — bille à droite, piste teintée, et le mot « En marche » à côté. Posée sur la photo, la bille de verre floute les reflets de l'eau qui passent dessous : l'interrupteur fait partie de la piscine.
RéglagesTrois interrupteurs agrandis à 88 × 44 px (bille de 36 px, course de 44 px : .active .lg-toggle-knob { left: 47px }) dans un panneau sombre translucide ; celui du chauffage pilote le libellé « Arrêté / En marche » et la cible « Chauffe en cours → 28 °C » en écoutant aria-checked.
Activer les sous-titres sur un film — plateforme de courts-métrages — Liquid Glass Toggle exemple 2

② Activer les sous-titres sur un film — plateforme de courts-métrages

QuandLe film est en pause sur une rue de nuit ; le spectateur ouvre les réglages et active les sous-titres.
PourquoiLe toggle de verre ne masque pas l'image : les lumières de la rue passent floues à travers la piste et la bille. Le rebond confirme le changement sans fenêtre de confirmation, et la réplique sous-titrée apparaît aussitôt en bas de l'image.
RéglagesMême interrupteur de 88 × 44 px dans un menu « Réglages » translucide posé sur l'image ; l'état aria-checked fait apparaître la ligne de sous-titres.
Passer en vue satellite — appli de carte de pêche en eau douce — Liquid Glass Toggle exemple 3

③ Passer en vue satellite — appli de carte de pêche en eau douce

QuandAu bord de la Sarthe, le pêcheur bascule la carte de la rivière en vue satellite pour repérer les fosses et les berges.
PourquoiLe petit écrasement de la bille confirme le geste même en plein soleil, quand on lit mal l'écran : on voit la goutte bouger et changer de forme, pas seulement changer de couleur. La carte passe en satellite au même moment.
RéglagesDeux interrupteurs de 88 × 44 px dans une carte « Couches » ; « Coins de pêche » allumé, « Vue satellite » éteint au départ ; l'état du second change le fond de la carte.

Comment ça marche

La piste .lg-toggle est une vitre de 72 × 36 px aux bouts ronds : fond blanc à 8 %, backdrop-filter: blur(8px) (avec -webkit-), bordure blanche à 15 %. Allumée (.active), elle se teinte d'indigo à 20 % avec une bordure indigo à 40 %, en 0,4 s. La bille .lg-toggle-knob (30 px, à 3 px du bord) est une goutte de verre : dégradé radial blanc décentré en haut à gauche, son propre flou de 8 px avec saturation ×1,5, bordure blanche à 30 %, ombre portée et reflet intérieur. Sa position left passe de 3 à 39 px avec une courbe cubic-bezier(.34, 1.56, .64, 1) : elle dépasse un peu sa place avant de s'y poser.

Le script, à chaque bascule, inverse .active, met à jour aria-checked et relance l'animation lgKnobSquish (0,5 s) : il retire la classe .squishing, force un recalcul (offsetWidth) et la remet, pour que l'écrasement rejoue à chaque clic. À 30 % de l'animation la bille est à scale(1.25, .75) avec un arrondi plus plat en haut, à 60 % à scale(.85, 1.15), à 80 % à scale(1.05, .95), puis ronde. Mesuré 150 ms après un clic : matrix(1.23, 0, 0, 0.77, 0, 0) dans Chromium 151, matrix(1.25, 0, 0, 0.75, 0, 0) dans Firefox 153 ; 600 ms plus tard, la bille est à 40 px du bord gauche de la piste (4 px au départ, bordure comprise).

L'interrupteur est construit pour cohabiter avec votre page. Le script n'expose rien en global — aucune fonction toggle() qui pourrait remplacer celle d'un menu ou d'un thème — et s'applique à chaque élément [data-lg-toggle] (mesuré : typeof window.toggle vaut undefined). L'élément porte role="switch", tabindex="0" et aria-checked, Espace et Entrée le basculent, et un contour :focus-visible de 2 px le signale — mesuré dans Chromium, Firefox et WebKit : Tab donne le focus, Espace allume (aria-checked="true", page sans défilement), Entrée éteint. Enfin .lg-toggle-wrap porte un décor (deux disques nets, hachures) sous la piste : sur un fond uni, le flou de la bille ne se verrait pas.

Accessibilité

  • Nom accessible : l'interrupteur annonce son rôle et son état, mais pas ce qu'il commande — le texte « Click to toggle » à côté n'y est pas relié. Donnez-lui un nom : aria-label="Chauffage du bassin", ou un id sur le libellé visible et aria-labelledby sur l'interrupteur. Sans cela, un lecteur d'écran dit seulement « interrupteur, désactivé ».
  • Clavier : Tab, puis Espace ou Entrée (mesuré dans les trois moteurs). Espace est intercepté (preventDefault) pour ne pas faire défiler la page. Le contour de focus #a5b4fc mesure 8,0:1 sur le décor #1e1b4b et 9,9:1 sur #0a0a0f ; il n'apparaît qu'au clavier, pas au clic.
  • État lisible sans la couleur : c'est la position de la bille qui dit allumé ou éteint ; la teinte indigo à 20 % de la piste allumée est faible (la bordure au repos mesure 1,6:1 sur le décor). Si l'état compte (chauffage, alarme), doublez-le d'un mot à côté — « En marche » / « Arrêté » — comme dans les scènes de cette page.
  • Mouvement : glissement et écrasement durent 0,5 s et ne se produisent qu'à l'action de l'utilisateur. Pour prefers-reduced-motion, rien n'est prévu : ajoutez @media (prefers-reduced-motion: reduce) { .lg-toggle-knob { transition: left .15s; } .lg-toggle-knob.squishing { animation: none } } — la bille glisse vite et sans rebond.

Compatibilité navigateur

CSS : backdrop-filter (et -webkit-), transitions avec courbe à dépassement, @keyframes sur transform et border-radius elliptique, :focus-visible. JS : classList, setAttribute, keydown. HTML : role="switch" et aria-checked. Zéro dépendance. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : bascule au clic, à Espace et à Entrée, écrasement rejoué à chaque bascule, aucune erreur console.

Chrome 86+✓ Complet
Firefox 103+✓ Complet
Safari 15.4+✓ Complet
Edge 86+✓ Complet
Mobile iOS 15.4+✓ Complet (au doigt ; VoiceOver annonce un interrupteur)
Android Chrome 86+✓ Complet

Les versions minimales sont celles de :focus-visible. Avant, la règle de contour est ignorée : l'interrupteur marche, au clavier aussi, mais le focus ne se voit plus. Sans backdrop-filter (Firefox avant 103), piste et bille restent translucides sans flou ; l'écrasement et le glissement sont inchangés.

Le code

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

index.html — structure
<div class="demo-preview">
  <div class="lg-toggle-wrap">
    <div class="lg-toggle" data-lg-toggle="" role="switch" tabindex="0" aria-checked="false">
      <div class="lg-toggle-knob"></div>
    </div>
    <span class="lg-toggle-label">…</span>
  </div>
</div>
Débloquer le code complet — 9,90 € TTC/mois

Le code complet HTML + CSS + JS de Liquid Glass Toggle, prêt à coller — et les 840 effets. Ou 299 € TTC une fois, accès à vie.

Personnaliser

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

Option / propriétéDéfautEffet
Taille (CSS — .lg-toggle { width: 72px; height: 36px }, .lg-toggle-knob { width: 30px; height: 30px }, .active .lg-toggle-knob { left: 39px }) piste 72 × 36 px, bille 30 px, course de 36 px Le code vendu pose left: 39px en position allumée (la bille touche presque le bout). Pour une marge symétrique, calculez : largeur − bordures (2 px) − marge (3 px) − bille, soit 37 px ici. Pour 88 × 44 et une bille de 36 px : left: 47px. Gardez une hauteur de 44 px sur mobile pour une cible tactile confortable.
Écrasement (CSS — @keyframes lgKnobSquish) 0,5 s : 1,25 × 0,75 → 0,85 × 1,15 → 1,05 × 0,95 → 1 1,15 × 0,85 pour une bille plus ferme, 1,35 × 0,65 pour une goutte très molle. Gardez la même durée que la transition de left (0,5 s) pour que l'écrasement accompagne le trajet.
Rebond du glissement (CSS — cubic-bezier(.34, 1.56, .64, 1)) dépassement d'environ 10 % de la course Le 1,56 règle le dépassement : 1,2 pour un rebond discret, 1,8 pour une bille qui « tape » le bout de la piste. ease supprime le rebond.
Couleur allumée (CSS — .lg-toggle.active) indigo à 20 %, bordure indigo à 40 % Pour un état qu'on doit lire d'un coup d'œil : background: rgba(34,197,94,.55) (vert) ou votre couleur de marque à 50-60 %. La bille de verre reste lisible dessus.
Décor derrière le verre (CSS — .lg-toggle-wrap, padding et background) deux disques nets (rose, indigo), hachures, fond nuit Il rend le flou visible dans la démo. Sur votre page, retirez le padding et le background de la règle : l'interrupteur floutera votre image ou votre interface.

FAQ

Par l'attribut aria-checked ("true" ou "false") ou la classe .active, mis à jour à chaque bascule, au clic comme au clavier. Pour réagir : new MutationObserver(function () { var on = sw.getAttribute('aria-checked') === 'true'; /* … */ }).observe(sw, { attributes: true, attributeFilter: ['aria-checked'] }); — c'est ce que font les scènes de cette page pour allumer le chauffage, les sous-titres ou la vue satellite. Pour un état de départ allumé, écrivez class="lg-toggle active" et aria-checked="true" dans le HTML.
Pour ne rien écraser chez vous. Une fonction déclarée au niveau global, par exemple toggle(), remplacerait toute fonction du même nom dans votre page — un menu, un thème — dès que le script de l'interrupteur serait chargé, ou serait remplacée par elle. Tout le script tient dans une boucle sur les éléments [data-lg-toggle], sans aucune déclaration au niveau global : rien n'est ajouté à window (mesuré : typeof window.toggle vaut undefined). Pour réagir à une bascule, observez aria-checked (voir la première question).
Une <input type="checkbox" role="switch"> stylée donne gratuitement le clavier, le formulaire et l'étiquette par <label> : c'est le bon choix dans un formulaire envoyé au serveur. Cet interrupteur, lui, est un div rendu accessible (rôle, état, clavier) : il convient aux réglages appliqués tout de suite dans une interface, comme dans les trois scènes. Dans un formulaire, recopiez son état dans un champ caché, ou reprenez le CSS sur une vraie case à cocher.