Formularios

Los formularios son herramientas web en las que los usuarios pueden ingresar datos, los cuales pueden ser enviados a una base de datos o aplicados en el lado del usuario (por ejemplo configuraciones de la página); básicamente son elementos HTML en los que el usuario puede ingresar datos los cuales pueden ser empleados o almacenados por la página. En los formularios, los datos ingresados con frecuencia son validados para corroborar que cumplen con los requerimientos o características del caso de uso; no hay que olvidar que los elementos HTML únicamente aportan la estructura a la página, por ello es que todo lo relacionado con funcionalidad (envío de datos, validaciones etc.) son realizados empleando JavaScript, a su vez al igual que el resto de la página suelen ser decorados con estilos CSS, por lo tanto en estos elementos es muy común que las tres tecnologías sean incorporadas.

Contenedores de un formulario

Label

Este elemento define los encabezados de los elementos del formulario; la función de este es plenamente de accesibilidad, tanto para usuarios comunes como para los motores de lectura. Un elemento "label" se debe vincular con el elemento al que este hace referencia; al vincularlo correctamente, los motores de lectura pueden funcionar de una forma más entendible para sus usuarios.

Para vincularlo con el elemento controlador se utiliza el atributo "for" con un valor igual al atributo "id" del controlador al que este hace referencia; por lo tanto, el valor de "for" en el label y del "id" del controlador deben ser el mismo. Como tal, a la hora de expresarlo en código existen dos formas de estructurarlo:

  1. La primera se trata de estructurar el "label" e "input" como dos elementos separados.

  2. La segunda forma consta de anidar el "input" dentro del elemento "label".

Nota: sea cual sea la forma en la que se estructure en código, siempre es recomendable que se vinculen los elementos mediante el "for" y el "id", para asegurar que todos los motores de lectura lo interpreten adecuadamente.

Una ventaja de vincular correctamente los label con su respectivo widget es que al hacerse un clic sobre este automáticamente se activa el widget; esto es muy útil para el diseño y accesibilidad del formulario. El siguiente es tanto un ejemplo de uso así como del código en cuestión:

Incluir varios label

En la mayoría de los casos, pese a que se puede hacer, esto no es muy recomendable ya que los motores de lectura no interpretan bien esto; sin embargo, existe una forma de ejecutar esto de forma adecuada: consiste en anidar una etiqueta "span" dentro de "label" como se puede ver a continuación:

Pudiesen darse casos como este en el que sea necesario o conveniente el incorporar más de un "label" para ayudar a los motores de lectura a interpretar adecuadamente el "label"; por ejemplo, este es un código estructurado correctamente ya que se usa el atributo "aria-label" en el cual su valor siempre es leído por estos (importante recordar que el * representa que el campo es obligatorio).

Nota: Este tipo de prácticas son necesarias ya que los motores de lectura tienen formas definidas de describir los símbolos; por ejemplo, al * lo describen como estrella, por lo tanto en este caso estructuramos el valor contextual del símbolo para su adecuada interpretación.

Nota: El resultado de la interpretación de un motor de lectura puede variar dependiendo de cuál se utilice, sin embargo esta es la forma más clara de estructurar el código.

Estructura de un formulario

Como ya se ha visto en ejemplos anteriores, es muy común e incluso recomendable el no utilizar únicamente elementos especializados para estructurarlos; por ejemplo, es muy común el uso de listas ("ul", "ol", "li") para estructurarlos, así como elementos "p", títulos y subtítulos (h1, h2, h3...) e incluso se recomienda el utilizar contenedores como "div" o "section" para estructurar el formulario en secciones.

Básicamente, estructurar un formulario consiste en hallar una estructura que le permite al desarrollador crear formularios accesibles y utilizables por todo tipo de usuarios. Una de las únicas recomendaciones es estructurarlo de forma que cada sección separada en funcionalidad debe estar contenida en un contenedor propio con elementos de conjunto de campo para incluir los botones de opción.



Atributos básicos

Los elementos de entrada de texto son los widgets más básicos de un formulario; permiten que el usuario ingrese texto en ellos. Por defecto, estos elementos únicamente soportan texto sin formato (negrita, cursiva, etc.), por lo que todos los elementos que soporten texto enriquecido son personalizados con la implementación de CSS y de JavaScript.

Algunos atributos comunes en los elementos de entrada de texto son:

Algunos atributos comunes en los elementos de un formulario son:

Input

La etiqueta "input" se trata del elemento de entrada de datos; en este elemento el atributo más importante con diferencia es "type". Este elemento cuenta con multitud de valores; la característica más resaltante del elemento "input" es que puede cambiar su forma según el valor del atributo "type". Este elemento se utiliza para crear la mayoría de los widgets de un formulario.

Formas del elemento "Input"

Textarea

El elemento "textarea" se caracteriza por ser un cuadro de texto de múltiples líneas con una extensión virtualmente infinita (sus dimensiones nunca cambian pero se puede navegar por el texto). Es importante resaltar que, pese a que su función es similar a un elemento "input", posee dos diferencias bastante significativas con este último: la primera consiste en que este elemento conserva cualquier salto de línea que se ingrese en el texto; la segunda diferencia radica en la estructura del código de la etiqueta "textarea" en sí, ya que no se trata de un elemento cerrado como "input", sino que requiere de una etiqueta de cierre adecuada. Esta diferencia entre ambas etiquetas cambia la forma en que se incorpora un texto predeterminado en cada una; la forma en que esto se define en estas etiquetas es la siguiente:

Nota: Por las características del elemento "textarea", pese a que se puede anidar contenido HTML, CSS y JS en su interior, todo se representa como si fuese contenido de texto sin formato.

Atributos

Textarea cuenta con tres atributos exclusivos para poder definir su representación del texto:

Modificar su tamaño utilizando CSS

Para cambiar las dimensiones del elemento "textarea" se utiliza la propiedad "resize", la cual puede adoptar cualquiera de los siguientes valores:

Button

Por último, pero no menos importante, se encuentra el elemento "button"; se trata de un botón el cual puede ser configurado para realizar varias acciones. Un ejemplo de su estructura es el siguiente:

Al igual que el elemento "input", "button" acepta el atributo "type", el cual puede tomar cualquiera de tres valores:

Nota: También se puede crear un botón usando el elemento "input" con el atributo "type", el cual posee ciertos valores que mostrarán al "input" como un botón; sin embargo, la diferencia radica en que la etiqueta "button" permite contenido HTML completo, lo que significa un contenido de botón más completo y creativo.

Select

Este elemento consiste en un cuadro de selección con uno o más elementos de opción como elementos secundarios, de los cuales cada uno especifica una de las opciones del "select". Este elemento secundario se trata de un elemento "option"; en otras palabras, el "select" es un cuadro de selección donde cada una de las opciones es definida por una etiqueta "option", las cuales se encuentran albergadas en el interior de la etiqueta select.

Si es necesario mostrar alguna de las opciones como dato seleccionado por defecto, se puede definir utilizando el atributo "selected" en el "option" que lo contenga.

También es posible anidar los elementos "option" dentro de una etiqueta "optgroup" con el fin de agrupar las opciones que posean algún tipo de relación entre sí. Por lo tanto, si se incorpora un elemento "optgroup" dentro del "select", este mostrará a aquellos elementos "option" que se encuentren en su interior como un grupo de opciones, como se puede apreciar a continuación:

Nota: Para mostrar un encabezado en los grupos de opciones se utiliza el atributo "label" en el elemento "optgroup".

Nota: Los encabezados de los grupos de opciones únicamente son eso y no son seleccionables como opción.

Los elementos "select" cuentan con otros atributos particulares los cuales son:

Datalist

El elemento "datalist" o lista de datos se trata de un elemento el cual brinda al usuario diversas opciones que pueden ser ingresadas en un cuadro de texto. No se trata de un controlador en sí, sino de un elemento complementario para cuadros de texto. A diferencia del elemento "select", el "datalist" tiene la función de autocompletar el texto del usuario. Para albergar las opciones se utiliza el elemento "option" al igual que en los "select"; su estructura es la siguiente:

Como se puede ver en el ejemplo, el controlador utilizado es un "input" de tipo text, el cual se vincula con el elemento "datalist" para que este realice su función de autocompletado en el cuadro de texto. La forma de vincular ambos elementos es a través del uso del "id" del "datalist" y del atributo "list" del elemento "input"; para que ambos estén correctamente vinculados, ambos valores deben coincidir.

A continuación se muestra un ejemplo de implementación de este elemento:

Nota: Este elemento está soportado por la gran mayoría de los navegadores. Sin embargo, en versiones antiguas puede que este no sea el caso; para estos casos existe un truco para asegurar la implementación de la lista, que consiste en anidar un "select" dentro del "datalist". En los navegadores compatibles, todo elemento dentro de un "datalist" que no sea un "option" es ignorado; sin embargo, cuando el navegador no soporta la etiqueta, se visualizará el "select" anidado.

Nota: El elemento "datalist" puede ser utilizado en conjunto con otros elementos siempre y cuando requieran una entrada de datos, sin embargo, el efecto de la etiqueta en otros elementos no está estandarizado, por lo tanto se podría comportar diferente según el navegador.

Progress

Se trata de una barra de progreso la cual representa un valor numérico que cambia con el tiempo hasta alcanzar un valor máximo, el cual se define con el uso del atributo "max". Este elemento se utiliza en todas aquellas situaciones en las que se requiera representar el progreso de una tarea, por ejemplo, el porcentaje de descarga de un archivo.

Nota: el contenido dentro de este elemento realmente solo es una alternativa para aquellos navegadores que no sean compatibles con esta etiqueta, así como para que los motores de lectura puedan interpretarlo.

Meter

Se trata de una barra medidora que representa un valor fijo delimitado entre valores mínimos y máximos. Este valor se representa visualmente como una barra; para entender su estado, comparamos el valor con otros rangos establecidos:

Según el área en la que se encuentre el valor actual respecto al óptimo, el color de la barra cambiará:

Nota: un ejemplo de uso sería la representación del espacio de memoria de un disco: al tener poco espacio ocupado se visualiza verde, a la mitad amarillo y casi lleno rojo.

Nota: el soporte para esta etiqueta es bueno; entre los navegadores grandes, el único que no lo soporta es Internet Explorer.

Envío de datos del formulario

Como ya se ha dicho anteriormente, el envío de los datos se realiza según el valor de los atributos "action" y "method". Sin embargo, el primer paso es proveer a todos los elementos (controladores) nombres propios a través del atributo "name"; estos son muy importantes tanto en el lado del cliente como en el servidor, ya que le indican al navegador qué nombre darle a cada dato. Por parte del servidor, los datos se manejan en relaciones de nombre-valor.

A continuación se muestra un ejemplo de código: