Hover✨ Premium

Switch with Icons

Interrupteurs à bascule avec icône SVG dans la poignée : l'icône change au toggle (soleil/lune, son/silence, activé/désactivé). La poignée glisse avec un dépassement élastique. Accessible au clavier et aux lecteurs d'écran.

CSSToggleIcons

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

Toggle dark/light mode dans la topbar d'une web app — interrupteur seul dans la barre de navigation principale — Switch with Icons exemple 1

① Toggle dark/light mode dans la topbar d'une web app — interrupteur seul dans la barre de navigation principale

QuandUn seul switch dans le coin droit du header permet de basculer le thème de l'interface. L'icône lune (mode sombre actif) ou soleil (mode clair) identifie l'état sans texte.
PourquoiUn toggle isolé dans la navigation est la forme la plus épurée du commutateur de thème : il s'intègre sans encombrer, l'icône dans la poignée élimine tout label.
RéglagesSwitch réduit à 52×28 px pour s'adapter à la hauteur de la topbar ; icône lune en état ON, label masqué ; fond de la page en mode clair (thème contrasté pour l'exemple).
Activation de règles d'automatisation — colonne 'État' dans un tableau d'un outil no-code — Switch with Icons exemple 2

② Activation de règles d'automatisation — colonne 'État' dans un tableau d'un outil no-code

QuandChaque ligne du tableau représente une règle (nom, description, déclencheur) et se termine par un mini-switch (50×26 px) qui active ou désactive la règle individuellement.
PourquoiDans une liste de règles, un switch discret en fin de ligne permet d'activer/désactiver sans ouvrir un formulaire ; l'icône (coche / cloche) donne un contexte visuel supplémentaire.
RéglagesSwitch 50×26 px, label masqué (aria-label construit depuis la colonne Règle) ; états initiaux variés (actif/inactif) pour montrer les deux états dans la même vue.
Configuration des permissions à l'onboarding — étape 2 d'un wizard de démarrage — Switch with Icons exemple 3

③ Configuration des permissions à l'onboarding — étape 2 d'un wizard de démarrage

QuandDans un wizard en 3 étapes, l'étape 2 propose 3 interrupteurs : alertes email, profil public, suggestions IA. L'utilisateur active ou désactive chaque option avant de continuer.
PourquoiLe switch avec icône dans le knob rend la configuration initiale intuitive : chaque option est compréhensible d'un coup d'œil (enveloppe, silhouette, soleil), sans lire le libellé.
RéglagesSwitches à taille standard (72×36 px) dans des cartes de permissions ; icônes enveloppe, silhouette, soleil/étoile ; fond de wizard centré sur la scène.

Comment ça marche

La racine .fx-0368-root (250 px de haut, fond rgb(26, 26, 36)) centre trois rangées de réglages dans .mi-switch-scene. Chaque rangée est formée d'un label span.mi-switch-label et d'un interrupteur div.mi-switch. L'interrupteur (80×40 px, coins arrondis) contient une poignée div.mi-switch-knob (32×32 px) qui contient un SVG d'icône. La poignée se déplace de 4 px (état off) à 44 px (état on) via la propriété CSS left. La transition (cubic-bezier(0.34, 1.56, 0.64, 1), 0,3 s) donne un léger dépassement vers la droite avant de s'ancrer, donnant l'impression d'un élastique.

Chaque interrupteur a role="switch", aria-checked (true ou false) et tabindex="0". Le script lit le texte du label voisin pour construire dynamiquement l'aria-label de l'interrupteur : un interrupteur précédé du label Notifications reçoit aria-label="Notifications". Cela évite d'avoir des ID statiques qui doubleraient en présence de deux copies du composant. Au clic ou à l'appui de la touche Espace/Entrée, le script bascule la classe .on et met à jour aria-checked.

Chaque icône SVG a deux états CSS : l'icône d'état off est visible quand la classe .on est absente, et vice-versa. Le changement d'icône se fait par transition d'opacité de 0,2 s. Les deux icônes sont présentes dans le DOM en même temps ; leur changement est géré entièrement en CSS via les sélecteurs .mi-switch:not(.on) et .mi-switch.on. Aucune manipulation du DOM n'est nécessaire pour le changement d'icône.

Accessibilité

  • Rôle switch : chaque interrupteur a role="switch" et aria-checked. Les lecteurs d'écran l'annoncent comme un commutateur et indiquent son état (actif / inactif).
  • Clavier : Tab atteint chaque interrupteur (roving tabindex entre les rangées), Espace ou Entrée le bascule. Le contour de focus (:focus-visible) est visible à la navigation au clavier.
  • Label dynamique : l'aria-label est construit depuis le texte du span.mi-switch-label voisin par le JavaScript. Cette approche fonctionne avec deux copies du composant sur la même page sans ID dupliqués.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, le déplacement de la poignée est instantané (transition left supprimée) ; les transitions de couleur de fond et d'icône restent actives sur 0,15 s.

Compatibilité navigateur

CSS (transitions left, background-color, opacity) + 0,4 Ko de JavaScript (classList, setAttribute, keydown), aucune dépendance. Vérifié dans Chromium 151 : trois interrupteurs indépendants, aria-checked mis à jour, aria-label construit depuis le label voisin, deux copies de la racine indépendantes, mouvement réduit sans glissement, 0 erreur.

Chrome 49+✓ Complet (mesuré)
Firefox 55+✓ Complet
Safari 9+✓ Complet
Edge 79+✓ Complet (moteur Chromium)
Mobile iOS 9+✓ Complet
Android Chrome 49+✓ Complet (moteur Chromium)

Sans JavaScript, les interrupteurs sont visuellement corrects mais ne basculent pas au clic. Sans transitions CSS, la poignée se déplace et l'icône change instantanément.

Le code

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

index.html — structure
<div class="fx-0368-root">
  <div class="mi-switch-scene">
    <div class="mi-switch-row">
      <span class="mi-switch-label">Notifications</span>
      <div class="mi-switch on" role="switch" aria-checked="true" tabindex="0">
        <div class="mi-switch-knob">
          <!-- icône SVG état on -->
        </div>
      </div>
    </div>
  </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
Icônes dans les poignées (HTML — SVG dans .mi-switch-knob) Soleil/lune, son/silence, check/croix Remplacez les SVG par n'importe quelle paire d'icônes de 16 px. Gardez les deux SVG dans la poignée (un pour chaque état) ; le CSS gère leur affichage via .mi-switch:not(.on) et .mi-switch.on.
Couleur de fond actif (CSS — background de .mi-switch.on) Violet #6366f1 Passez à vert (#10b981) pour un switch d'activation, ou rouge (#ef4444) pour une fonction critique désactivable. La couleur de la poignée au repos (.mi-switch-knob) peut rester blanche quelle que soit la couleur du fond.
Rebond de la poignée (CSS — cubic-bezier de la transition left) cubic-bezier(0.34, 1.56, 0.64, 1) ease-out donne un glissement sans rebond. Augmentez le deuxième paramètre au-delà de 1,5 pour un rebond plus prononcé.
État initial (HTML — classe .on sur .mi-switch) Notifications ON, Mode sombre OFF, Son ON Ajoutez ou retirez la classe .on dans le HTML pour changer l'état initial de chaque interrupteur. Le JS lit l'état initial et fixe aria-checked en conséquence.

FAQ

Dans le gestionnaire de clic/keydown, après le toggle de classe, récupérez l'état via sw.classList.contains('on') et appelez votre logique (ex. : document.body.classList.toggle('dark-theme')). Le script actuel ne fait que basculer l'état visuel et ARIA.
Oui. Ajoutez la classe .disabled au div .mi-switch et vérifiez sa présence en début de gestionnaire pour ignorer le clic. Ajoutez aussi aria-disabled="true" et retirez tabindex pour que les lecteurs d'écran l'annoncent comme indisponible.
Oui. Supprimez les SVG du .mi-switch-knob. Les transitions de fond et de poignée fonctionnent de façon identique. Sans icône, le label textuel adjacent (span.mi-switch-label) est d'autant plus important pour indiquer ce que l'interrupteur contrôle.