Ir al contenido

Checkbox, radio y switch

.form-check agrupa el control (form-check__input) y su texto (form-check__label). Se dibujan con CSS sobre el input nativo, así que funcionan con teclado, en formularios y con lectores de pantalla.

Agrupa las opciones relacionadas en un <fieldset class="form-field"> con un <legend class="form-label">.

<fieldset class="form-field">
<legend class="form-label">Quiero recibir</legend>
<div class="form-check">
<input class="form-check__input" type="checkbox" id="novedades" name="avisos" value="novedades" checked>
<label class="form-check__label" for="novedades">Novedades del blog</label>
</div>
<div class="form-check">
<input class="form-check__input" type="checkbox" id="ofertas" name="avisos" value="ofertas">
<label class="form-check__label" for="ofertas">Ofertas y promociones</label>
</div>
</fieldset>

Los radios de un grupo comparten el mismo name: solo se puede elegir uno.

<fieldset class="form-field">
<legend class="form-label">Forma de pago</legend>
<div class="form-check">
<input class="form-check__input" type="radio" id="pago-mensual" name="pago" value="mensual" checked>
<label class="form-check__label" for="pago-mensual">Mensual</label>
</div>
<div class="form-check">
<input class="form-check__input" type="radio" id="pago-anual" name="pago" value="anual">
<label class="form-check__label" for="pago-anual">Anual (2 meses gratis)</label>
</div>
</fieldset>

form-field--inline muestra las opciones en una fila, que pasa a la siguiente línea si no caben.

<fieldset class="form-field form-field--inline">
<legend class="form-label">¿Cómo prefieres que te contactemos?</legend>
<div class="form-check">
<input class="form-check__input" type="radio" id="contacto-email" name="contacto" value="email" checked>
<label class="form-check__label" for="contacto-email">Email</label>
</div>
<div class="form-check">
<input class="form-check__input" type="radio" id="contacto-telefono" name="contacto" value="telefono">
<label class="form-check__label" for="contacto-telefono">Teléfono</label>
</div>
<div class="form-check">
<input class="form-check__input" type="radio" id="contacto-whatsapp" name="contacto" value="whatsapp">
<label class="form-check__label" for="contacto-whatsapp">WhatsApp</label>
</div>
</fieldset>

form-check--switch convierte un checkbox en interruptor. Agrega role="switch" para que se anuncie como encendido o apagado. Úsalo para ajustes que se aplican de inmediato; para opciones que se envían con un formulario, usa un checkbox.

<div class="form-field">
<div class="form-check form-check--switch">
<input class="form-check__input" type="checkbox" role="switch" id="notificaciones" name="notificaciones" checked>
<label class="form-check__label" for="notificaciones">Notificaciones</label>
</div>
<div class="form-check form-check--switch">
<input class="form-check__input" type="checkbox" role="switch" id="modo-oscuro" name="modo-oscuro">
<label class="form-check__label" for="modo-oscuro">Modo oscuro</label>
</div>
</div>

El atributo disabled atenúa el control y su texto.

<div class="form-field">
<div class="form-check">
<input class="form-check__input" type="checkbox" id="check-off" checked disabled>
<label class="form-check__label" for="check-off">Checkbox deshabilitado</label>
</div>
<div class="form-check">
<input class="form-check__input" type="radio" id="radio-off" disabled>
<label class="form-check__label" for="radio-off">Radio deshabilitado</label>
</div>
<div class="form-check form-check--switch">
<input class="form-check__input" type="checkbox" role="switch" id="switch-off" disabled>
<label class="form-check__label" for="switch-off">Switch deshabilitado</label>
</div>
</div>

Un checkbox que controla un grupo (por ejemplo, «Seleccionar todo» con algunos marcados) muestra una raya. Este estado solo se activa con JS: input.indeterminate = true.

Para el estado de error, revisa Validación.

  • Conecta cada form-check__label con su input (for e id): así, el clic en el texto también marca la opción.
  • Un grupo de opciones va en <fieldset> con <legend>: el lector anuncia la pregunta junto a cada opción.
  • El foco con teclado muestra el contorno de 2 px en primary. Las flechas mueven la selección entre radios de un grupo.
  • En el modo de alto contraste de Windows, la marca usa los colores del sistema.
  • El borde sin marcar tiene un contraste de 3,3:1 con los colores por defecto.
Clase Uso
form-check Contenedor del control y su texto.
form-check__input <input type="checkbox"> o <input type="radio">.
form-check__label Texto del control.
form-check--switch Interruptor (con role="switch").
form-field--inline Opciones en fila, en el form-field que las agrupa.
VariableValor por defectoUso
--ds-form-check-size1.25emTamaño de la casilla y del radio.
--ds-form-check-gapvar(--ds-space-2)Separación entre el control y el texto.
--ds-form-check-bgvar(--ds-color-surface)Fondo sin marcar.
--ds-form-check-border-colorcolor-mix(in srgb, var(--ds-color-text) 50%, var(--ds-color-surface))Borde sin marcar (y perilla del switch apagado).
--ds-form-check-border-width1pxGrosor del borde.
--ds-form-check-radiusvar(--ds-radius-sm)Radio de la casilla del checkbox.
--ds-form-check-hover-border-colorvar(--ds-color-primary)Borde en hover.
--ds-form-check-checked-bgvar(--ds-color-primary)Fondo y borde cuando está marcado.
--ds-form-check-checked-colorvar(--ds-color-primary-contrast)Marca, punto del radio y perilla del switch encendido.
--ds-form-check-invalid-colorvar(--ds-color-danger)Borde con error (is-invalid o aria-invalid).
--ds-form-check-switch-width2.25emAncho del switch.
--ds-form-check-disabled-opacity0.5Opacidad cuando está deshabilitado.