Formulaires✨ Premium

Radio Ripple

Boutons radio en CSS seul : le point de l'option choisie surgit avec un rebond et une onde claire s'étend puis s'efface autour du cercle, sur de vrais radios natifs.

CSSAnimationRadio

Mis à jour le

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

3 exemples d'usage

Créneau de retrait en magasin pendant une commande — Radio Ripple exemple 1

① Créneau de retrait en magasin pendant une commande

QuandÀ l'étape « Retrait », le client choisit l'heure à laquelle il passe chercher sa commande : un clic sur « 17 h – 19 h » fait surgir le point vert, l'onde part du cercle et la carte du créneau se teinte.
PourquoiUn créneau, et un seul : c'est le cas d'école du bouton radio. Le rebond confirme le choix sur une étape où le client ne doit pas se tromper d'heure.
RéglagesTrois options en cartes cliquables, couleur verte #1f5f4a pour le bord, le point (::before) et l'onde (::after à 22 %). Le fond de la carte choisie vient du CSS de la scène.
Sondage éclair en bas d'un article de presse locale — Radio Ripple exemple 2

② Sondage éclair en bas d'un article de presse locale

QuandLe lecteur arrive au bout de l'article et répond d'un toucher à « Faut-il rendre la place du marché piétonne le samedi ? » : le point surgit et les résultats s'affichent à côté des trois réponses.
PourquoiTrois réponses courtes, un toucher : l'onde rend la réponse vivante sans ralentir, et le lecteur voit tout de suite qu'elle a été prise en compte.
RéglagesCouleur bordeaux #7f1d1d, options de 14 px. Les barres de résultats et le « Merci » sont affichés par la scène quand un radio change ; les pourcentages sont écrits en dur pour la démo.
Vitesse d'écoute dans le lecteur d'une appli de livres audio — Radio Ripple exemple 3

③ Vitesse d'écoute dans le lecteur d'une appli de livres audio

QuandAvant de reprendre son livre, l'auditeur choisit 1×, 1,25× ou 1,5× ; chaque option indique le temps qu'il reste au chapitre à cette vitesse. Au clavier, les flèches passent d'une vitesse à l'autre en rejouant le rebond et l'onde, puis Entrée sur « Reprendre l'écoute ».
PourquoiTrois vitesses, une seule active : le bouton radio est le bon contrôle, et les grandes cartes laissent lire la durée de chaque choix. Le rebond confirme le changement sans détourner l'attention du livre.
RéglagesOptions en grandes cartes sur fond violet, couleur jaune #fbbf24 pour le cercle, le point et l'onde, légende du fieldset laissée visible (« Vitesse d'écoute »), name="vitesse". La couverture du livre est dessinée en CSS par la scène.

Comment ça marche

Le groupe est un <fieldset class="rrp-group"> dont la <legend> donne le nom de la question (masquée à l'œil, lue par les lecteurs d'écran). Chaque option est un <label class="rrp-option"> qui contient le vrai <input type="radio">, le cercle dessiné .rrp-circle (22 px, bord 2 px #6366f1) et son texte. Le radio est transparent et posé sous le cercle : il garde le clic, le focus, les flèches du clavier et l'envoi du formulaire.

Deux pseudo-éléments font l'animation. ::before est le point central : à scale(0) au repos, il passe à scale(1) quand le radio est coché, en 0,3 s sur une courbe cubic-bezier(.68,-.55,.265,1.55) qui le fait dépasser puis revenir. ::after est un disque indigo à 20 % qui déborde de 8 px autour du cercle ; à la sélection, l'animation rrp-ripple (0,4 s) le fait grandir de 0 à 1,5 fois en s'effaçant : c'est l'onde.

Aucun JavaScript. Les radios d'un même groupe partagent un name (ici option) : c'est lui qui fait qu'un seul choix est possible, et c'est lui que reçoit votre serveur. L'option cochée dans le HTML (checked) joue aussi son onde au chargement.

Accessibilité

  • Vrais radios : Tab entre dans le groupe sur l'option cochée, les flèches haut / bas changent le choix, un lecteur d'écran annonce « Choisissez une option, groupe, Option 1, bouton radio, coché, 1 sur 3 ».
  • Nom du groupe : la légende du fieldset est lue avant la première option ; écrivez-y la vraie question (« Créneau de retrait »).
  • Focus visible : au clavier, un anneau #a5b4fc entoure le cercle de l'option active (input:focus-visible + .rrp-circle).
  • Mouvement réduit : sous prefers-reduced-motion: reduce, le point apparaît sans rebond et l'onde n'est pas jouée.
  • Zone de clic : la ligne entière (cercle et texte) est cliquable.

Compatibilité navigateur

CSS seul : :checked, pseudo-éléments, @keyframes, inset (Chrome 87, Firefox 66, Safari 14.1). Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 (Playwright) : clic, Tab puis flèche bas, toucher à 390 px, mouvement réduit. L'anneau de focus demande :focus-visible (Chrome 86, Firefox 85, Safari 15.4).

Chrome 87+✓ Complet (mesuré)
Firefox 85+✓ Complet (mesuré)
Safari 15.4+✓ Complet (mesuré dans WebKit)
Edge 87+✓ Complet (moteur Chromium)
Mobile iOS 15.4+✓ Moteur WebKit, non vérifié sur appareil
Android Chrome 87+✓ Complet (toucher mesuré à 390 px)

Sans inset (navigateurs de 2020 et avant), le point et l'onde ne se dessinent pas mais les radios restent utilisables. Sans :focus-visible, pas d'anneau au clavier.

Le code

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

index.html — structure
<div class="fx-0296-root">
  <fieldset class="rrp-group">
    <legend class="rrp-legend">Choisissez une option</legend>
    <div class="rrp-list">
      <label class="rrp-option">
        <input type="radio" name="option" value="1" checked>
        <span class="rrp-circle" aria-hidden="true"></span>
        <span>Option 1</span>
      </label>
      <!-- Option 2, Option 3 : même structure -->
    </div>
  </fieldset>
</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
Couleur (CSS — border-color de .rrp-circle, background de ::before et ::after) #6366f1, onde rgba(99,102,241,.2) Changez les trois ensemble ; gardez l'onde très transparente (20 à 25 %).
Rebond du point (CSS — transition de .rrp-circle::before) .3s cubic-bezier(.68,-.55,.265,1.55) ease-out pour un point qui apparaît sans dépasser.
Onde (CSS — @keyframes rrp-ripple et inset de ::after) 0,4 s, de 0 à 1,5 fois, débord de 8 px Passez inset à -14px et la durée à .6s pour une onde plus large et plus lente.
Taille du cercle (CSS — .rrp-circle et l'input) 22px Donnez la même taille à l'input invisible pour garder la zone de clic sous le cercle.
Nom du groupe (HTML — name et <legend>) option · « Choisissez une option » Un name différent par question ; la légende peut rester visible en retirant la classe rrp-legend.
Cadre de démo (CSS — .fx-0296-root) min-height 300px, fond #0a0a0f À retirer dans un formulaire réel : le texte prend alors la couleur de la page.

FAQ

Les deux copies ont le même name, donc le navigateur en fait un seul groupe : un seul radio peut être coché sur toute la page. Donnez un name différent à chaque question (« creneau », « livraison »…), c'est aussi ce qui distingue les réponses côté serveur.
Oui, retirez checked. Pensez alors à required sur un des radios si une réponse est obligatoire : le navigateur bloquera l'envoi.
Oui : passez .rrp-list en flex-direction: row avec un gap ; les flèches gauche / droite du clavier marchent aussi.