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:
<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="...">:
<input>), el software lee en voz alta el texto de la etiqueta asociada, informando al usuario qué dato debe introducir.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.
<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>.
required de HTML5 en el control: <input type="text" id="nombre" required>.aria-required="true": <input type="text" id="nombre" aria-required="true">. (El atributo required de HTML5 ya implica esto para AT).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>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>.required, type="email", type="url", pattern, min, max, minlength, maxlength). Estos proporcionan una validación básica en el lado del cliente.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>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.
Si bien la base es un HTML semántico y nativo, WAI-ARIA puede ser necesario para:
aria-label o aria-labelledby si una <label> visible no es suficiente o posible, y aria-describedby para descripciones más largas.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.