Diseño web con HTML y CSS

Formularios

  

Hasta ahora, la única forma que hemos visto de interactuar con una web son los enlaces, haciendo clic en ellos. Pero existe otra opción más potente para que el usuario interactúe con una web: los formularios. Son una herramienta muy útil para enviar información a un servidor. Cuando nos registramos en una web, rellenamos una serie de datos (e-mail, contraseña, etc.) mediante un formulario. Así pues, un formulario contiene una serie de elementos (llamados normalmente “controles” o “campos”) que colocamos en una página web para que el usuario pueda introducir información. Veremos a continuación qué tipos de elementos puede tener un formulario y cómo se colocan en la página.

1. Estructura básica de un formulario

Todo el contenido de un formulario va encerrado entre una pareja de etiquetas form. Esta etiqueta tiene, entre otros, los siguientes atributos:

<form action="mipagina.php" method="post">
   ... Contenido del formulario
</form>

2. Elementos básicos de un formulario

Dentro de las etiquetas form que engloban al formulario, podemos poner diferentes tipos de controles. Los más habituales son:

La mayor parte de estos controles (cuadros de texto, checkboxes, botones de radio, botones normales…) se añaden con la etiqueta input. Otros controles necesitan de otras etiquetas. Veremos todas ellas a continuación.

2.1. La etiqueta input

La etiqueta input se utiliza para definir distintos tipos de controles, dependiendo de lo que valga su atributo type. Este atributo puede valer:

A partir de HTML 5 se añadieron otros tipos (types) válidos que permitían definir controles específicos. Podemos destacar los siguientes:

Una vez elegido el tipo de control, la etiqueta input tiene otra serie de atributos que debemos tener en cuenta (muchos de estos atributos también están presentes en otros tipos de controles):

Veamos un ejemplo: el siguiente formulario muestra un cuadro de texto para poner nuestro nombre, otro que admite hasta 50 caracteres para un e-mail, una casilla de verificación para ver si el usuario está casado, dos botones de radio para elegir su idioma preferido, y un botón para enviar el formulario.

<form action="mipagina.php" method="post">
    <p>Introduce tu nombre:</p>
    <input type="text" name="nombre" size="20" placeholder="Nombre completo">
    <br>

    <p>Introduce tu e-mail:</p>
    <input type="email" name="email" size="20" maxlength="50">
    <br>

    <input type="checkbox" name="casado"> Casado
    <p>Elige tu idioma preferido:</p>
    <input type="radio" name="idioma" value="ingles" checked>Inglés
    <br>
    <input type="radio" name="idioma" value="frances">Francés
    <br>

    <input type="submit" value="Enviar datos">
</form>

Esto se vería más o menos así en la página:

Observa algunas cosas interesantes, como que los controles de tipo radio comparten el mismo name (para que al pulsar uno se suelten los demás), y que tienen un value que no se muestra en el formulario realmente, y cuya utilidad escapa al alcance de este tema.

2.1.1. Más sobre los botones

Además de poder definir botones con la etiqueta input, también podemos emplear la etiqueta button como alternativa. Tiene, igualmente, un atributo type que indica el tipo de botón que queremos crear (submit, reset o button normal). Así, estas dos opciones son equivalentes (aunque, si observamos, la etiqueta button no es una etiqueta vacía, y el texto del botón se especifica en su contenido):

<input type="submit" value="Enviar datos">
<button type="submit">Enviar datos</button>

2.2. Las etiquetas de formularios: label

Con la etiqueta label podemos definir controles de tipo etiqueta, es decir, controles que sirven para dar información sobre otros controles. En realidad, en el ejemplo anterior, no deberíamos haber usado párrafos para indicar que el primer cuadro de texto es para escribir el e-mail, o que los botones de radio son para elegir el idioma preferido. Para eso están las etiquetas. La etiqueta label tiene un atributo for, que sirve para indicar el control al que está asociado (a través del atributo id de dicho control) para que, al hacer clic en la etiqueta, se acceda directamente al control. Además, el uso de etiquetas facilita la lectura de formularios por parte de lectores de pantalla, por lo que su uso es todavía más recomendable en términos de accesibilidad.

Así, el formulario anterior se podría haber definido así:

<form action="mipagina.php" method="post">
    <label for="nombre">Introduce tu nombre:</label>
    <br>
    <input type="text" name="nombre" id="nombre" size="20">
    <br>

    <label for="email">Introduce tu e-mail:</label>
    <br>
    <input type="email" name="email" id="email" size="20" maxlength="50">
    <br>

    <input type="checkbox" name="casado" id="casado">
    <label for="casado">Casado</label>
    <br>

    <label>Elige tu idioma preferido:</label>
    <br>
    <input type="radio" name="idioma" id="ingles" value="ingles" checked>
    <label for="ingles">Inglés</label>
    <br>
    <input type="radio" name="idioma" id="frances" value="frances">
    <label for="frances">Francés</label>
    <br>

    <input type="submit" value="Enviar datos">
</form>

Alternativamente, podemos hacer que la etiqueta englobe el control al que va a asociada. De este modo podemos omitir el atributo for, porque ya se sabe a qué control va asociada:

<label>
    Introduce tu nombre:
    <input type="text" name="nombre" id="nombre" size="20">
</label>

Otra de las ventajas que tiene usar etiquetas es que, en controles como los checkboxes o los botones de radio, ampliamos el área en que podemos hacer clic para seleccionarlos, ya que también podemos hacer clic en la etiqueta asociada al control (cosa que no se podría hacer si usáramos simples párrafos).

2.3. Áreas de texto

Para introducir texto que ocupe más de una línea, no nos sirve la etiqueta input con su atributo type=”text”. En su lugar, debemos usar la pareja de etiquetas textarea. Esta etiqueta tiene tres atributos:

Si luego se ocuparan más filas o columnas que las que indiquemos, aparecerá una barra de desplazamiento para poder ver el resto del texto escrito en el área de texto.

Aquí tenemos un ejemplo de uso:

<textarea name="noticia" rows="5" cols="20">
Texto de la noticia
</textarea>

2.4. Listas

Podemos definir dos tipos de listas para elegir opciones en un formulario: listas fijas (ocupan una altura determinada y dejan visibles X elementos, aunque pueden tener más y verlos mediante barras de desplazamiento) y listas desplegables (sólo es visible un elemento, y los demás se muestran desplegando la lista). Ambas se crean con la etiqueta select, que admite los siguientes atributos:

Internamente, la etiqueta select tiene una serie de etiquetas option, una para cada elemento que queramos añadir a la lista. Estos elementos tienen un atributo value para indicar su valor (que puede ser diferente del que luego se mostrará). Además, para indicar si hay algún elemento preseleccionado de antemano, marcaremos ese elemento con el atributo selected.

Veamos aquí un ejemplo y cómo se vería:

<select name="navegador" size="5">
    <option value="ie">Internet Explorer</option>
    <option value="firefox" selected>Firefox</option>
    <option value="chrome">Chrome</option>
    <option value="opera">Opera</option>
    <option value="safari">Safari</option>
</select>

Ejercicio 1:

Crea una página llamada formDatos.html para rellenar tus datos personales. Añade un encabezado 1 (h1) que diga “Rellena tus datos”, y debajo un formulario como el que tienes a continuación:

Ejercicio 2:

Crea una página llamada formMatricula.html para simular un proceso de matrícula en ciclos formativos:

Deberás tener en cuenta que:

3. Algunas opciones avanzadas

3.1. Validación de formularios en cliente

Desde HTML5, podemos incorporar una serie de atributos en los controles de los formularios para establecer una validación básica. De este modo, podemos obligar a que algunos campos se rellenen, incluso que tengan un patrón o valor determinado. Para ello, podemos hacer uso de estos atributos:

required

Este atributo se puede aplicar desde HTML 5 en los campos de un formulario que sea obligatorio cumplimentar, de forma que el formulario directamente no se envía si están vacíos. Por ejemplo, en el siguiente formulario es obligatorio rellenar el campo login:

<form action="login.php" method="post">
    <label for="login">Login:</label>
    <input type="text" name="login" required>
    <br>
    <label for="login">Password:</label>
    <input type="text" name="password">
    <br>
    <input type="submit" value="Enviar">
</form>

Si no lo rellenamos, el navegador nos posicionará sobre ese cuadro de texto con algún tipo de mensaje (dependiendo del navegador) indicando que debemos rellenarlo.

pattern

Este atributo permite especificar un patrón de entrada, de forma que para que el dato que introduce el usuario se considere válido, debe ajustarse a ese patrón. Por ejemplo, para un campo que pida un número de teléfono podemos esperar que el usuario escriba entre 9 y 11 dígitos:

<input type="text" name="telefono" pattern="[0-9]{9,11}" 
 placeholder="Entre 9 y 11 dígitos">

Es habitual también indicar en ese campo del formulario qué tipo de información se espera a través de un placeholder. La sintaxis que se utiliza para definir diferentes tipos de patrones es la misma que se usa en JavaScript para expresiones regulares, por ejemplo, pero no la veremos con detalle en este tema. Simplemente veremos algunos casos útiles:

min, max y otras validaciones numéricas

Para campos numéricos o de tipo rango (range) podemos establecer con estos dos atributos los valores mínimo y/o máximo que se permiten (inclusive).

<input type="number" name="numero" min="1" max="5">

Además, podemos definir un atributo step para indicar el incremento que se admite. Esto permitirá definir si admitimos sólo números enteros, por ejemplo…

<input type="number" name="numero" min="1" max="5" step="1">

… o si también admitimos números reales, hasta las centésimas, por ejemplo:

<input type="number" name="numero" min="1" max="5" step="0.01">

Estos elementos también pueden aplicarse a los campos de tipo range:

<input type="range" name="porcentaje" min="0" max="100" step="5">

Otras validaciones de facto

Algunos controles de formularios incorporados desde HTML5, como el input type="email", input type="url" o input type="number" incorporan una validación de facto en ellos, de forma que si el contenido que escribimos no se asemeja a un e-mail válido o a un dato numérico, respectivamente, también se mostrará un mensaje de error y no se enviará el formulario.

Ejercicio 3:

Vamos a aplicar validación al formulario del Ejercicio 2. En concreto, deberá cumplir lo siguiente:

3.2. Conjuntos de campos o fieldsets

Podemos agrupar conjuntos de controles en una especie de “marcos”, para poder dividir mejor la información del formulario cuando éste muestra demasiados campos. Estos marcos se crean con la pareja de etiquetas fieldset. Esta etiqueta contiene una subetiqueta legend que es el título de ese marco. Un ejemplo:

<fieldset>
    <legend>Datos personales</legend>
    <label for="nombre">Nombre</label>
    <br>
    <input type="text" name="nombre">
    <br>
    <label for="apellidos">Apellidos</label>
    <br>
    <input type="text" name="apellidos">
    <br>
    <label for="dni">DNI</label>
    <br>
    <input type="text" name="dni" size="10" maxlength="9">
    <br>
</fieldset>

que se vería así en el navegador:

3.3. Agrupar opciones en listas

La etiqueta select admite algunas opciones más para agrupar los elementos que contiene en categorías, cuando hay muchos elementos que mostrar. Para ello se utiliza la etiqueta optgroup, con un atributo label que da nombre a cada categoría. Veamos un ejemplo y cómo se vería en el navegador:

<label for="programa">Programa seleccionado</label>
<br>
<select name="programa">
    <optgroup label="Sistemas Operativos">
        <option value="Windows">Windows</option>
        <option value="Mac">Mac</option>
        <option value="Linux" selected>Linux</option>
        <option value="Otro">Otro</option>
    </optgroup>
    <optgroup label="Navegadores">
        <option value="IE">Internet Explorer</option>
        <option value="Firefox">Firefox</option>
        ...

Ejercicio 4:

Crea una página llamada formProducto.html con el siguiente formulario (más el encabezado 1 con el texto “Información sobre el producto”, y un botón de “Enviar” en la parte inferior):