Interrupteur
L’interrupteur est un élément d’interaction avec l’interface qui permet à l’usager de faire un choix entre deux états opposés (activé / désactivé).
HTML
Structure du composant
Le composant Interrupteur, est un élément interactif permettant de basculer entre deux états.
Sa structure est la suivante :
-
L'Interrupteur doit être contenu dans un élément HTML
<div>
défini par la classefr-toggle
. -
L'interrupteur est un élément HTML
<input>
de typecheckbox
défini par la classefr-toggle__input
. -
L'interrupteur doit être associé à un libellé
<label>
avec la classefr-toggle__label
.-
L'interrupteur peut afficher de manière optionnelle un état
par l'utilisation des attributs
data-fr-checked-label
etdata-fr-unchecked-label
dont les valeurs seront affichées si l'interrupteur est coché ou non.
-
L'interrupteur peut afficher de manière optionnelle un état
par l'utilisation des attributs
-
Une description additionnelle de l'option - optionnelle - peut
être ajoutée après le libellé, elle est définie par un élément
<p>
et la classe utilitairefr-hint-text
. -
Un message d'erreur ou de succès peut être associé à
l'interrupteur en utilisant un élément
<div>
avec la classefr-messages-group
dans lequel on peut ajouter un messagefr-message
. Son attributid
doit être associé à l'attributaria-describedby
de l'interrupteur. Ce bloc peut être placé vide et être rempli dynamiquement, auquel cas il doit être annoncé à l'utilisateur en utilisant l'attributaria-live="polite"
.
Exemple de structure HTML simple
<div class="fr-toggle">
<input type="checkbox" class="fr-toggle__input" id="toggle" aria-describedby="toggle-messages toggle-hint">
<label class="fr-toggle__label" for="toggle" data-fr-checked-label="Activé" data-fr-unchecked-label="Désactivé">Libellé de l'interrupteur</label>
<p class="fr-hint-text" id="toggle-hint">Texte de description additionnel</p>
<div class="fr-messages-group" id="toggle-messages" aria-live="polite">
</div>
</div>
Groupe d'interrupteurs
Pour regrouper plusieurs interrupteurs liées, utilisez un
élément
<fieldset>
avec
une légende
<legend>
. Cela
permet de structurer les options de manière accessible.
-
L'élément
<fieldset>
est défini par la classefr-fieldset
. -
La légende
<legend>
est définie par la classefr-fieldset__legend
. Par défaut une légende sera en gras car le fieldset est utilisé pour regroupé plusieurs champs ayant chacun un label. Dans le cas des interrupteurs la légende est visuellement perçue comme le label du groupe d'interrupteurs. On ajoutera donc la classefr-fieldset__legend--regular
pour repasser la légende sur une graisse standard. -
Une description additionnelle pour la légende - optionnelle -
peut être ajoutée dans la légende, elle est définie par un
élément
<span>
et la classe utilitairefr-hint-text
. -
Chaque élément interrupteur est contenu dans un élément
<div>
défini par la classefr-fieldset__element
. Ces éléments peuvent être placés en ligne avec la classefr-fieldset__element--inline
. -
Comme pour chaque interrupteur, le groupe d'interrupteurs,
représenté par un fieldset, peut contenir un message
d'erreur/information/succès via un bloc
fr-messages-group
.
Exemple de groupe d'interrupteurs
<fieldset class="fr-fieldset" aria-labelledby="toggles-legend toggles-messages">
<legend class="fr-fieldset__legend" id="toggles-legend">
Légende pour l’ensemble des éléments
</legend>
<div class="fr-fieldset__element">
<ul class="fr-toggle__list">
<li>
<div class="fr-toggle">
<input type="checkbox" class="fr-toggle__input" id="toggle-01" aria-describedby="toggle-01-messages">
<label class="fr-toggle__label" for="toggle-01">Libellé de l'interrupteur</label>
<div class="fr-messages-group" id="toggle-01-messages" aria-live="polite">
</div>
</div>
</li>
<li>
<div class="fr-toggle">
<input type="checkbox" class="fr-toggle__input" id="toggle-02" aria-describedby="toggle-02-messages">
<label class="fr-toggle__label" for="toggle-02">Libellé de l'interrupteur</label>
<div class="fr-messages-group" id="toggle-02-messages" aria-live="polite">
</div>
</div>
</li>
<li>
<div class="fr-toggle">
<input type="checkbox" class="fr-toggle__input" id="toggle-03" aria-describedby="toggle-03-messages">
<label class="fr-toggle__label" for="toggle-03">Libellé de l'interrupteur</label>
<div class="fr-messages-group" id="toggle-03-messages" aria-live="polite">
</div>
</div>
</li>
</ul>
</div>
<div class="fr-messages-group" id="toggles-messages" aria-live="polite">
</div>
</fieldset>
CSS
Installation du CSS
Pour fonctionner correctement, les styles CSS du core et des
interrupteurs doivent être importés. L'import doit se faire avant
le contenu de la page dans la partie
<head>
, et de
préférence avec le fichier minifié, car plus léger.
<link href="dist/core/core.min.css" rel="stylesheet">
<link href="dist/component/toggle/toggle.min.css" rel="stylesheet">
NB : Il est aussi possible d'importer le CSS global du DSFR
dsfr.min.css
.
Pour fonctionner sur Internet Explorer 11, un fichier legacy peut aussi être importé :
<link href="dist/core/core.legacy.min.css" rel="stylesheet">
<link href="dist/component/toggle/toggle.legacy.min.css" rel="stylesheet">
Variante d’interrupteurs avec libellé à gauche
Il est possible d’afficher le libellé à gauche de l’interrupteur,
avec l'utilisation de la classe
fr-toggle--label-left
.
Exemples de variantes d’interrupteurs avec libellé à gauche
<div class="fr-toggle fr-toggle--label-left">
<input type="checkbox" class="fr-toggle__input" id="toggle-label-left" aria-describedby="toggle-label-left-messages">
<label class="fr-toggle__label" for="toggle-label-left">Libellé de l'interrupteur</label>
<div class="fr-messages-group" id="toggle-label-left-messages" aria-live="polite">
</div>
</div>
Variante d’interrupteurs avec séparateur
Il est possible d’afficher un séparateur horizontal sous
l’interrupteur, avec l'utilisation de la classe
fr-toggle--border-bottom
.
Exemples de variantes d’interrupteurs avec séparateur
<div class="fr-toggle fr-toggle--border-bottom">
<input type="checkbox" class="fr-toggle__input" id="toggle-label-left" aria-describedby="toggle-label-left-messages">
<label class="fr-toggle__label" for="toggle-label-left">Libellé de l'interrupteur</label>
<div class="fr-messages-group" id="toggle-label-left-messages" aria-live="polite">
</div>
</div>
Variantes d'états
L’interrupteur est disponible en plusieurs variantes d'états :
-
L’interrupteur avec erreur : défini par la classe
fr-toggle----error
. -
L’interrupteur avec succès : défini par la classe
fr-toggle----valid
. -
L’interrupteur désactivé : défini par l'attribut
disabled
sur l'élément<input>
.
Dans le cas d'utilisation d'un groupe d’interrupteurs, ces états sont définis sur le groupe (le fieldset), et non sur chaque interrupteur.
-
Groupe en erreur : défini par la classe
fr-fieldset--error
. -
Groupe en succès : défini par la classe
fr-fieldset--valid
. -
Groupe désactivé : défini par l'attribut
disabled
.
Exemples de variantes d'états
Erreur
<div class="fr-toggle fr-toggle--error">
<input type="checkbox" class="fr-toggle__input" id="toggle-error" aria-describedby="toggle-error-messages">
<label class="fr-toggle__label" for="toggle-error">Libellé de l'interrupteur avec erreur</label>
<div class="fr-messages-group" id="toggle-error-messages" aria-live="polite">
<p class="fr-message fr-message--error" id="toggle-error-message-error">Texte d’erreur obligatoire</p>
</div>
</div>
Succès
<div class="fr-toggle fr-toggle--valid">
<input type="checkbox" class="fr-toggle__input" id="toggle-valid" aria-describedby="toggle-valid-messages">
<label class="fr-toggle__label" for="toggle-valid">Libellé de l'interrupteur avec succès</label>
<div class="fr-messages-group" id="toggle-valid-messages" aria-live="polite">
<p class="fr-message fr-message--valid" id="toggle-valid-message-valid">Texte de validation</p>
</div>
</div>
Désactivé
<div class="fr-toggle">
<input type="checkbox" class="fr-toggle__input" id="toggle-disabled" disabled aria-describedby="toggle-disabled-messages">
<label class="fr-toggle__label" for="toggle-disabled">Libellé de l'interrupteur désactivé</label>
<div class="fr-messages-group" id="toggle-disabled-messages" aria-live="polite">
</div>
</div>
Exemple de variante d'état au niveau du groupe
Erreur
<fieldset class="fr-fieldset fr-fieldset--error" aria-labelledby="toggles-error-legend toggles-error-messages">
<legend class="fr-fieldset__legend" id="toggles-error-legend">
Légende pour l’ensemble des éléments en erreur
</legend>
<div class="fr-fieldset__element">
<ul class="fr-toggle__list">
<li>
<div class="fr-toggle fr-toggle--border-bottom">(...)</div>
</li>
<li>
<div class="fr-toggle fr-toggle--border-bottom">(...)</div>
</li>
<li>
<div class="fr-toggle fr-toggle--border-bottom">(...)</div>
</li>
</ul>
</div>
<div class="fr-messages-group" id="toggles-error-messages" aria-live="polite">
<p class="fr-message fr-message--error" id="toggles-error-message-error">Texte d’erreur globale</p>
</div>
</fieldset>
Succès
<fieldset class="fr-fieldset fr-fieldset--valid" aria-labelledby="toggles-valid-legend toggles-valid-messages">
<legend class="fr-fieldset__legend" id="toggles-valid-legend">
Légende pour l’ensemble des éléments en succès
</legend>
<div class="fr-fieldset__element">
<ul class="fr-toggle__list">
<li>
<div class="fr-toggle fr-toggle--border-bottom">(...)</div>
</li>
<li>
<div class="fr-toggle fr-toggle--border-bottom">(...)</div>
</li>
<li>
<div class="fr-toggle fr-toggle--border-bottom">(...)</div>
</li>
</ul>
</div>
<div class="fr-messages-group" id="toggles-valid-messages" aria-live="polite">
<p class="fr-message fr-message--error" id="toggles-valid-message-error">Texte de succès global</p>
</div>
</fieldset>
Désactivé
<fieldset class="fr-fieldset" disabled aria-labelledby="toggles-disabled-legend toggles-disabled-messages">
<legend class="fr-fieldset__legend" id="toggles-disabled-legend">
Légende pour l’ensemble des éléments désactivés
</legend>
<div class="fr-fieldset__element">
<ul class="fr-toggle__list">
<li>
<div class="fr-toggle fr-toggle--border-bottom">(...)</div>
</li>
<li>
<div class="fr-toggle fr-toggle--border-bottom">(...)</div>
</li>
<li>
<div class="fr-toggle fr-toggle--border-bottom">(...)</div>
</li>
</ul>
</div>
<div class="fr-messages-group" id="toggles-disabled-messages" aria-live="polite">
</div>
</fieldset>
JavaScript
Installation du JavaScript
Pour fonctionner le composant interrupteur nécessite l'utilisation de JavaScript uniquement pour la variante avec état affiché. Chaque composant utilisant javascript possède un fichier Js spécifique et requiert le fichier Js du core.
Il est donc nécessaire d'importer ces fichiers à la fin de la page
(avant </body>
) :
<script type="module" src="dist/core/core.module.min.js"></script>
<script type="module" src="dist/component/toggle/toggle.module.min.js"></script>
NB: Il est aussi possible d'importer le Js global du DSFR
dsfr.module.js
Pour fonctionner sur Internet Explorer 11, un fichier legacy, en version nomodule ES5, peut aussi être importé :
<script type="text/javascript" nomodule href="dist/legacy/legacy.nomodule.min.js" ></script>
<script type="text/javascript" nomodule src="dist/core/core.nomodule.min.js"></script>
<script type="text/javascript" nomodule src="dist/component/toggle/toggle.nomodule.min.js"></script>
Une fois le JavaScript chargé, le composant fonctionne automatiquement.
Instances
Sur l'interrupteur, les éléments suivants sont instanciés :
-
L'interrupteur, via la classe :
fr-toggle__input
. -
Le libellé, via la classe
fr-toggle__label
et les attributschecked-label
ouunchecked-label
.
Une fois chargé, le Js ajoute un attribut
data-fr-js-NOM_INSTANCE="true"
sur chacun des éléments instanciés.
API
Il est possible d'interagir avec les instances du composants en JavaScript via une API.
Cette API est disponible depuis la méthode
window.dsfr(instance)
du
core.
Exemple :
const elem = document.getElementById('ID_COLLAPSE');
dsfr(elem).toggleInput.isEnabled;
L'ensemble des propriétés et méthodes disponibles sont définies ci-après :
toggleInput
Description | Défini si le fonctionnement de l'interrupteur est activé ou non |
---|---|
Type | property |
Retour | Boolean |
Exemple |
dsfr(elem).toggleInput.isEnabled = false
|
Description | Renvoie le noeud HTML de l'élément. |
---|---|
Type | property |
Retour | DOMElement |
Exemple |
dsfr(elem).toggleInput.node
|
toggleStatusLabel
Description | Défini si le fonctionnement de l'interrupteur est activé ou non |
---|---|
Type | property |
Retour | Boolean |
Exemple |
dsfr(elem).toggleStatusLabel.isEnabled =
false
|
Description | Renvoie le noeud HTML de l'élément. |
---|---|
Type | property |
Retour | DOMElement |
Exemple |
dsfr(elem).toggleStatusLabel.node
|
Description | Met a jour la taille de l'emplacement de l'état de l'interrupteur |
---|---|
Type | function |
Arguments | none |
Retour | none |
Exemple |
dsfr(elem).toggleStatusLabel.update()
|
Note de version
Voir les évolutions sur github
v1.13.1 - 26 mars 2025
Corrige la taille du focus sur le bouton
- Corrige la taille du focus pour que la hauteur du focus corresponde à la hauteur du bouton.
#1078
v1.13.0 - 4 décembre 2024
correction groupe d'interrupteurs dépréciés
- Correction des espacements des groupes d'interrupteurs dépréciés
#1006
v1.12.0 - 19 juin 2024
ajoute les messages erreur et valide sur interrupteur simple
- retrait des marges avant et après le composant
- ajoute la bordure en état d'erreur/succès
#954
retour à la ligne statut activé/désactivé
- corrige le retour à la ligne sur le label "activé/désactivé"
#928
v1.11.0 - 11 décembre 2023
largeur max du label & libellé
- augmentation de la largeur max du libellé du label, la marge de 10v passe à 8v
- changement du libellé du label et du texte additionnel
#819
couleur label & espacements
- utilisation du token de couleur $text-label-grey sur le label de l'interrupteur
- ajout de 4px de marge entre la coche et le texte activer/desactiver
#771
v1.10.0 - 19 juillet 2023
retrait tap-highlight-color iOS
- Au clic sur le toggle sur iOS, l'effet de highlight est présent
- Retrait de cet effet avec la propriété -webkit-tap-highlight-color
#703
passage input en bleu et refactorisation
Uniformisation des champs à cocher toggle/radio/checkbox
toggle:
- Ajout des variants toggle error/valid
-
Retrait du css sur input
appearance:none
- bordure en background svg
- le toggle est maintenant placé dans un fieldset
radio:
- Le contour devient bleu
- retrait du fond blanc du radio bouton (transparence)
- input déssiné en background image
radio-rich:
- L'outline au focus englobe tout le radio-riche, plus l'input
checkbox:
- Le contour devient bleu
- correction changement d'état au mouse-down (), maintenant au mouse up
Form:
-
les hint-text des champs désactivés passent en
couleur
--text-disabled-grey
#502