Ir directamente al contenido de esta página
Al igual que las tablas, los formularios son un elemento común de las páginas web, y al igual que ellas, por lo general se crean de forma automática sin un marcado semántico.
Para que un formulario sea accesible, al igual que con las tablas se debe asociar las etiquetas de los campos explícitamente a estos mismos por medio de los elementos y atributos específicos.
Supongamos que tenemos el siguiente formulario:
<form action="procesar_datos.php" method="post" name="datos_usuario">
<h2>Datos personales</h2>
<p>Nombre <input name="nombre" type="text" size="40"></p>
<p>Apellidos <input name="apellidos" type="text" size="40"></p>
<p>Dirección <input name="direccion" type="text" size="40"></p>
<p>Teléfono <input name="tlf" type="text" size="40"></p>
<p>Correo electrónico <input name="correo" type="text" size="40"></p>
<h2>Datos de la empresa</h2>
<p>Dirección <input name="empresa" type="text" size="40"></p>
<p>Teléfono <input name="tlf_emp" type="text" size="40"></p>
<p>Fax <input name="fax" type="text" size="40"></p>
<p>Página web <input name="pg_web" type="text" size="40"></p>
<input name="reset" type="reset" value="Limpiar campos">
<input name="enviar" type="submit" value="Enviar formulario">
</form>
Con este código, tenemos un marcado que no es válido, semántico ni accesible. Si lo desea, pruebe validar este ejemplo.
Una vez que comprobamos que en el validador del W3C (inglés) —por ejemplo— obtenemos 37 errores, tenemos dos opciones:
Si ha elegido la segunda opción, vea el siguiente código y siga leyendo.
<form action="procesar_datos.php" method="post" id="formulario_contacto">
<fieldset>
<legend>Datos personales</legend>
<dl>
<dd><label for="nombre">Nombre</label></dd>
<dt><input name="nombre" id="nombre" type="text" size="40" value=" " /></dt>
<dd><label for="apellidos">Apellidos</label></dd>
<dt><input name="apellidos" id="apellidos" type="text" size="40" value=" " /></dt>
<dd><label for="direccion">Dirección</label></dd>
<dt><input name="direccion" id="direccion" type="text" size="40" value=" " /></dt>
<dd><label for="tlf">Teléfono</label></dd>
<dt><input name="tlf" id="tlf" type="text" size="40" value=" " /></dt>
<dd><label for="correo">Correo electrónico</label></dd>
<dt><input name="correo" id="correo" type="text" size="40" value=" " /></dt>
</dl>
</fieldset>
<fieldset>
<legend>Datos de la empresa</legend>
<dl>
<dd><label for="empresa">Nombre de la empresa</label></dd>
<dt><input name="empresa" id="empresa" type="text" size="40" value=" " /></dt>
<dd><label for="tlf_emp">Teléfono</label></dd>
<dt><input name="tlf_emp" id="tlf_emp" type="text" size="40" value=" " /></dt>
<dd><label for="fax">Fax</label></dd>
<dt><input name="fax" id="fax" type="text" size="40" value=" " /></dt>
<dd><label for="pg_web">Página web</label></dd>
<dt><input name="pg_web" id="pg_web" type="text" size="40" value=" " /></dt>
</dl>
</fieldset>
<div><input name="enviar" id="enviar" type="submit" value="Enviar formulario" /></div>
</form>
Como se ve, para hacer accesible el formulario sólo he aplicado una serie de elementos y atributos:
fieldset
: Engloba diversos campos relacionados por su significado. Otros casos pueden ser más ambiguos, pero en éste parece lógico dividir entre los campos que se refieren al individuo y los datos que se refieren a la empresa.legend
: Es un encabezado específico para los elementos agrupados bajo un fieldset
.name
que identificaba el formulario por un id
. Hay que destacar que el atributo name
, que en HTML 4.01 y el XHTML 1.0 Transitional aún se podía aplicar a cualquier elemento, ha sido depreciado en XHTML 1.1 en favor de id
. Sin embargo, como los scripts activos del lado del servidor como PHP, ASP, Perl, etc., reciben los valores enviados por el usuario asociados al name
para identificarlos, se ha mantenido el atributo para los campos de formulario. Por motivos de proactividad, se recomienda incluir en los campos un id
con el mismo valor que name
, para cuando en el lado del servidor se emplee como identificador1.label
: Identifica el texto explicativo que acompaña a cada campo del formulario. Se asigna al input
, select
o textarea
por medio del for
, cuyo valor debe ser el id
del campo correspondiente (no el name
).Bien, con esto, inicialmente nuestro formulario sería válido, semántico y accesible.
Una nota adicional. En el botón, no se debería incluir atributos como onclick
para lanzar el comportamiento del formulario, y así no obstruir su funcionamiento en caso de que el usuario no tenga JavaScript habilitado. Las alternativas se verán más adelante, cuando tratemos la capa de comportamiento.
name
; sin embargo, según la especificación de XHTML, un id
debe ser único en un documento, por lo que no se puede repetir para cada casilla o botón. div
, ul
, dl
, etc. Personalmente me parece que esta es la forma más correcta, puesto que un campo sin su correspondiente label
carece de definición, y porque la estructura de dl
puede definir explícitamente la relación de correspondencia uno a uno de ambos.