¿Cómo se crean formularios accesibles?

Crea formularios HTML accesibles usando «label», «fieldset», «legend», indicaciones claras y validación. Mejora la experiencia para todos y cumple con a11y.

LucusHost, el mejor hosting

20% DESCUENTO ALOJAMIENTO WEB

Crear formularios accesibles en HTML es esencial para asegurar que todas las personas, independientemente de sus capacidades, puedan interactuar con tu sitio web y completar tareas cruciales como registrarse, iniciar sesión, realizar compras o enviar consultas. Un formulario inaccesible puede ser una barrera insuperable para muchos usuarios.

Aquí te explico los aspectos clave, incluyendo el uso de <label>, la agrupación de controles e indicaciones claras:

1. Etiquetas claras y asociadas con <label>

Cada control de formulario (<input>, <textarea>, <select>) necesita una etiqueta descriptiva. El elemento <label> se utiliza para esto, y es fundamental asociarlo correctamente con su respectivo control. La forma más robusta y recomendada es usar el atributo for en el <label>, cuyo valor debe coincidir con el id del control del formulario:

<label for="nombreUsuario">Nombre de usuario:</label>
<input type="text" id="nombreUsuario" name="username">

<label for="aceptoTerminos">Acepto los términos y condiciones</label>
<input type="checkbox" id="aceptoTerminos" name="terminos">
Lenguaje del código: PHP (php)

Beneficios de <label for="...">:

  • Accesibilidad para lectores de pantalla: Cuando un usuario de lector de pantalla enfoca el control (<input>), el software lee en voz alta el texto de la etiqueta asociada, informando al usuario qué dato debe introducir.
  • Mayor área de interacción: Los usuarios pueden hacer clic en el texto de la etiqueta para activar o enfocar el control asociado, lo cual es especialmente útil para controles pequeños como checkboxes o radio buttons.

Aunque también existe la asociación implícita (envolver el <input> dentro del <label>), la asociación explícita con for e id es generalmente más fiable y versátil.

2. Agrupación de controles relacionados con <fieldset> y <legend>

Cuando tienes un grupo de controles de formulario que están lógicamente relacionados (por ejemplo, un conjunto de botones de radio para una única pregunta, o los diferentes campos que componen una dirección postal), debes agruparlos utilizando el elemento <fieldset>. Dentro del <fieldset>, el primer elemento debería ser un <legend>, que actúa como el título o la leyenda para ese grupo de controles.

<fieldset>
  <legend>Elige tu método de contacto preferido:</legend>
  
  <div>
    <input type="radio" id="contactoEmail" name="metodoContacto" value="email">
    <label for="contactoEmail">Correo electrónico</label>
  </div>
  
  <div>
    <input type="radio" id="contactoTelefono" name="metodoContacto" value="telefono">
    <label for="contactoTelefono">Teléfono</label>
  </div>
</fieldset>
Lenguaje del código: PHP (php)

El texto del <legend> es anunciado por los lectores de pantalla cuando el usuario entra en el grupo de controles, proporcionando un contexto esencial para los elementos dentro del <fieldset>.

3. Indicaciones, instrucciones y formatos esperados

  • Campos obligatorios: Indica claramente qué campos son obligatorios. Puedes hacerlo:
    • Añadiendo texto visible junto a la etiqueta (ej. "(obligatorio)" o un asterisco con una nota explicativa).
    • Usando el atributo required de HTML5 en el control: <input type="text" id="nombre" required>.
    • Usando el atributo ARIA aria-required="true": <input type="text" id="nombre" aria-required="true">. (El atributo required de HTML5 ya implica esto para AT).
  • Formatos de datos: Si un campo requiere un formato específico (ej. fecha como DD/MM/AAAA, un número de teléfono, o una contraseña con ciertos requisitos), proporciona estas instrucciones de forma clara y visible, preferiblemente antes del campo. Puedes usar texto descriptivo asociado mediante aria-describedby. HTML<label for="fechaNacimiento">Fecha de nacimiento:</label> <input type="text" id="fechaNacimiento" name="fechaNac" aria-describedby="formatoFecha"> <span id="formatoFecha" class="instruccion">Formato: DD/MM/AAAA</span>
  • Atributo placeholder: Aunque puede usarse para dar una pista breve, no confíes en placeholder para información crítica o etiquetas, ya que desaparece cuando el usuario empieza a escribir y no es un sustituto de <label>.

4. Validación y notificación de errores «accesible»

  • Validación HTML5: Aprovecha los atributos de validación de HTML5 (required, type="email", type="url", pattern, min, max, minlength, maxlength). Estos proporcionan una validación básica en el lado del cliente.
  • Mensajes de Error Claros: Cuando se produce un error:
    • El mensaje debe ser específico y fácil de entender.Debe ser perceptible (no solo indicado por color).Debe estar asociado programáticamente con el control del formulario que contiene el error. Esto se puede lograr con aria-describedby apuntando al id del mensaje de error, y usando aria-invalid="true" en el control.Idealmente, el foco debería moverse al primer campo con error, o se debería proporcionar un resumen de errores al principio del formulario.
    <label for="clave">Contraseña:</label>
    <input type="password" id="clave" name="password" required aria-describedby="errorClave" aria-invalid="true">
    <div id="errorClave" role="alert" class="mensaje-error">La contraseña debe tener al menos 8 caracteres.</div>

5. Navegación por teclado y orden de foco

Asegúrate de que todos los controles del formulario sean completamente operables utilizando solo el teclado y que el orden de tabulación sea lógico y predecible (generalmente siguiendo el orden visual y el orden del código fuente). Los elementos de formulario nativos son operables por teclado por defecto.

6. Uso prudente de ARIA

Si bien la base es un HTML semántico y nativo, WAI-ARIA puede ser necesario para:

  • Controles personalizados: Si creas un widget de formulario que no tiene un equivalente HTML nativo.
  • Etiquetas adicionales o descripciones: Con aria-label o aria-labelledby si una <label> visible no es suficiente o posible, y aria-describedby para descripciones más largas.
  • Regiones vivas (aria-live): Para anunciar errores o mensajes de estado que aparecen dinámicamente.

Crear formularios accesibles requiere atención al detalle, pero resulta en una experiencia mucho mejor para una gama más amplia de usuarios y es una parte esencial del desarrollo web responsable.

¿Tienes alguna duda o pregunta?Envía el formulario y procuraré darle respuesta
Formulario de pregunta
Responsable » Jose Ramón Bernabeu Guillem. Finalidad » Ponernos en contacto. Legitimación » Tu consentimiento al marcar la casilla verificación. Destinatarios » Los datos que proporciones estarán ubicados en los servidores de LucusHost, proveedor de hosting de este sitio. Derechos » por supuesto tendrás derecho, entre otros, a acceder, rectificar, limitar y suprimir tus datos.
Si creees que esto puede ser de utilidad a alguien más, pues... compártelo que es gratis 🙂
Sitio alojado en un servidor verde según The Green Web Foundation

20% DESCUENTO ALOJAMIENTO WEB

LucusHost, el mejor hosting

Aviso legal | Condiciones de contratación | Política de privacidad | Política de cookies
© 2017-2025 · Jose R. Bernabeu ·
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram