En esta lección y en la lección Formularios (2) se comentan las etiquetas relacionadas con los formularios
En esta lección se comentan las etiquetas y atributos más básicos.
Un formulario es un conjunto de controles (botones, cajas de texto, casillas de verificación, botones radio, etc) que permiten al usuario introducir datos y enviarlos al servidor web para su procesamiento.
<form action="ejemplo.php" method="get">
<p>Nombre: <input type="text" name="nombre" size="40"></p>
<p>Año de nacimiento: <input type="number" name="nacido" min="1900"></p>
<p>Sexo:
<input type="radio" name="hm" value="h"> Hombre
<input type="radio" name="hm" value="m"> Mujer
</p>
<p>
<input type="submit" value="Enviar">
<input type="reset">
</p>
</form>
La etiqueta que delimita un formulario es la etiqueta <form> ...</form>. Los atributos más importantes de la etiqueta <form> son:
Si el atributo method no está establecido, el formulario se comporta como si el valor fuera get.
La etiqueta <form> es un elemento de bloque. En su interior puede haber cualquier elemento típico de una página web (párrafos, imágenes, divisiones, listas, tablas, etc.), además de las etiquetas que crean los controles.
Los etiquetas que crean los controles en los formularios son <input>, <button>, <select>, <optgroup>, <option> y <textarea>. Además, se pueden estructurar los controles con las etiquetas <fieldset> y <legend>. Por último, la etiqueta <label> permite mejorar la accesibilidad de los controles.
El navegador envía únicamente los datos de los controles contenidos en el formulario. En una misma página puede haber varios formularios que envíen datos al mismo o a diferentes agentes.
Algunos atributos se pueden utilizar en varios tipos de controles.
El atributo type de la etiqueta <input> indica el tipo de control de que se trata.
En HTML 2 (publicado en noviembre de 1995) se crearon los tipos básicos de <input>: botón para enviar submit, botón para reiniciar reset, texto text, contraseña password, casilla de verificación checkbox, botón radio radio, imagen image y oculto hidden.
En HTML 3.2 (publicado en enero de 1997) se añadió el tipo fichero file
En HTML 4.0 (publicado en diciembre de 1997) se añadió el tipo botón button
En HTML 5 (publicado en octubre de 2014, aunque el WHATWG los había introducido años antes) se añadieron los tipos de <input>: número number, búsqueda search, teléfono tel, dirección web url, dirección de correo email, fecha date, hora time, color color y rango range.
En HTML 5.1 (publicado en octubre de 2016, aunque el WHATWG los había introducido años antes) se añadieron los tipos de <input>: mes month, semana week y fecha y hora local datetime-local.
El atributo name identifica al control.
Todos los controles de un formulario deben tener el atributo name porque, en general, sólo se envían los controles que lo tienen (aunque hay excepciones, como los controles de tipo imagen o los botones, que no los necesitan).
En general, los atributos name no se deben repetir, porque no se recibiría toda la información al enviarla. La única excepción es el botón radio, como se explica en el apartado correspondiente.
El atributo value permite establecer el valor inicial de un control, aunque cada control lo utiliza de una forma ligeramente distinta y algunos controles no lo admiten (área de texto, archivo o imagen).
En algunos casos (botones) el valor se muestra al usuario y el usuario no puede modificarlo. En otros casos (cajas de texto, contraseña) el valor se muestra en la página y el usuario puede modificarlo. En otros casos (casillas de verificación, botones radio, opciones de menú, oculto) el valor no se muestra en la página y el usuario no puede modificarlo.
En algunos casos (botones, oculto, botones radio) el atributo value es necesario. En otros casos (casilla de verificación, opciones de menú) es conveniente. En otros casos (cajas de texto, contraseña, imagen) puede omitirse. En el caso del selector de archivo, los navegadores no lo admiten por motivos de seguridad.
El atributo required permite indicar qué controles es obligatorio rellenar para enviar el formulario.
<p>Nombre: <input type="text" name="nombre" required></p>
<p>Sexo:
<input type="radio" name="hm" value="h" required> Hombre
<input type="radio" name="hm" value="m" required> Mujer
</p>
Si alguna de las opciones de un botón radio tiene establecido el atributo required, el control es obligatorio.
El atributo placeholder permite mostrar en los controles de texto un texto que desaparece al escribir en el control.
El atributo size permite establecer la longitud de los controles de texto (text, password, search, etc.). Por omisión, las cajas suelen tener 20 caracteres de longitud.
Los atributos maxlength y minlength permiten establecer la longitud máxima y mínima, respectivamente, que puede escribir el usuario en un control de texto (text, password, search, etc.).
El atributo autofocus permite indicar el control que debe tener el foco al cargarse el formulario.
Este atributo facilita la accesibilidad del formulario pues permite que el usuario pueda empezar a rellenar el formulario sin necesidad de hacer clic en el elemento. Como el navegador desplaza automáticamente la página hasta la posición del elemento, se recomienda que el elemento con atributo autofocus se encuentren al principio de la página, para que el desplazamiento no confunda al usuario.
Nota: En estos apuntes (lecciones y ejercicios) no se utiliza este atributo porque como en las páginas se incluyen varios formularios en distintas posiciones de la página, el desplazamiento automático a un elemento con atributo autofocus puede confundir al lector.
Los controles son los elementos que permiten al usuario introducir información.
La mayoría de controles se obtienen mediante mediante la etiqueta vacía <input>.
En HTML 2 (publicado en noviembre de 1995) se introdujeron los formularios y sus primeros controles:
En HTML 3.2 (publicado en enero de 1997) se añadió el control:
En HTML 4.0 (publicado en diciembre de 1997) se añadió los controles:
y se añadió la agrupación de opciones de menús mediante:
En HTML 5 (publicado en octubre de 2014, aunque el WHATWG los había introducido años antes) se añadieron los controles:
En HTML 5.1 (publicado en octubre de 2016, aunque el WHATWG los había introducido años antes) se añadieron los controles:
Los botones se crean mediante la etiqueta <input> o mediante la etiqueta <button>. La diferencia entre ellos es que <input> sólo puede contener texto, mientras que <button> permite incluir elementos html como imágenes. El contenido del botón <input> se define mediante el atributo value, por lo que sólo puede contener texto. El contenido del botón <button> se escribe dentro del elemento, por lo que puede incluir texto e imágenes.
Normalmente los botones no suelen llevar atributo name, pero se puede poner si se quiere (tendría sentido si un formulario contuviera dos botones de envío y quisiéramos saber en cuál de ellos ha hecho clic el usuario, pero esto no es muy habitual).
Las cajas de texto de una sola línea se crean mediante una etiqueta <input> cuyo atributo type tiene el valor text.
El atributo value (optativo) permite incluir un texto en la caja de texto para que el usuario lo modifique. HTML 5 introdujo el atributo placeholder, mucho más cómodo para el usuario, ya que no tiene que borrar el texto de ayuda.
Las cajas de texto de una sola línea específicas para contraseñas se crean mediante una etiqueta <input> cuyo atributo type tiene el valor password.
Al escribir en una caja de contraseña, en vez de letras aparecen puntos gruesos. Es importante señalar que estas cajas no proporcionan ninguna seguridad en la transmisión, simplemente ocultan al usuario lo que este escribe.
Las cajas de texto de una sola línea específicas para números se crean mediante una etiqueta <input> cuyo atributo type tiene el valor number.
En principio, los valores admitidos por el control son números enteros.
Los navegadores alertan al usuario cuando no ha escrito un valor correcto, como mínimo al enviar el formulario.
El atributo min establece un valor mínimo en la respuesta:
El atributo max establece un valor máximo en la respuesta:
El atributo step establece la cantidad, entera o decimal, en la que aumenta o disminuye el valor:
Para poder escribir cualquier número, el atributo step debe tener el valor any:
Las cajas de texto de una sola línea específicas para fechas (días, meses, años) se crean mediante una etiqueta <input> cuyo atributo type tiene el valor date. El dato se envía con el formato AAAA-MM-DD donde AAAA es el número de año, MM el número de mes y DD el número de día.
Las cajas de texto de una sola línea específicas para tiempos (horas, minutos) se crean mediante una etiqueta <input> cuyo atributo type tiene el valor time. El dato se envía con el formato HH-MM donde HH son las horas y MM los minutos.
Las casillas de verificación se crean mediante una etiqueta <input> cuyo atributo type tiene el valor checkbox.
Si el atributo checked tiene el valor checked, la casilla aparece marcada.
Las casillas de verificación sólo se envían si se han marcado. El atributo value contiene el valor que envía el formulario si la casilla de verificación está marcada. Si el atributo value no está establecido, el formulario envía el valor on.
Los botones radio se crean mediante una etiqueta <input> cuyo atributo type tiene el valor radio.
Lo botones radio que tienen el mismo atributo name forman un grupo, es decir, que si se marca uno de ellos se desmarca automáticamente el resto.
<input type="radio" name="boton" value="1">Opción 1<br>
<input type="radio" name="boton" value="2">Opción 2<br>
<input type="radio" name="boton" value="3">Opción 3
Si los atributos name no tienen el mismo valor, los botones radio son independientes (al marcar uno no se desmarca el otro):
<input type="radio" name="boton1" value="1">Opción 1<br>
<input type="radio" name="boton2" value="2">Opción 2
Los botones radio sólo se envían si se han marcado. El atributo value contiene el valor que envía el formulario si el botón radio está marcado.Si el atributo value no está establecido, el formulario envía el valor on, así que para poder saber cuál ha sido la opción elegida por el usuario es necesario establecer con valores distintos los atributos value de todos los elementos de un botón radio.
<input type="radio" name="boton" value="hombre"> Hombre<br>
<input type="radio" name="boton" value="mujer"> Mujer
Si uno de los botones tiene el atributo checked con el valor checked, el botón aparece marcado de forma predeterminada.
<input type="radio" name="boton" value="1">Opción 1<br>
<input type="radio" name="boton" value="2" checked>Opción 2
Una vez se ha hecho clic en uno de los botones radio, siempre habrá una opción seleccionada. Para desactivar un botón radio, se necesita un botón Reset.
<input type="radio" name="boton" value="1">Opción 1<br>
<input type="radio" name="boton" value="2">Opción 2<br>
<input type="reset">
El inconveniente del botón Reset es que reinicia todos los controles del formulario. Este problema no tiene una solución sencilla. Algunos recomiendan incluir en los botones radio una opción neutra, de manera que el usuario pueda cambiar su respuesta sin tener que reiniciar todo el formulario. El problema es que el usuario puede malinterpretar esa opción como una opción más y elegirla a propósito, por lo que se recomienda valorar en cada caso la mejor solución. Quizás en formularios con pocos controles no merezca la pena incluir esa opción neutra, y hacerlo sólo en formularios con muchos controles en los que el usuario tendría que volver a completar todo el formulario si utiliza el botón Reset
El control de selector de color se crea mediante una etiqueta <input> cuyo atributo type tiene el valor color. Permite elegir un color mediante el selector de color proporcionado por el sistema operativo.
El atributo value permite especificar un color inicial. El color se debe indicar en formato hexadecimal (#RRGGBB).
El control de rango se crea mediante una etiqueta <input> cuyo atributo type tiene el valor range. El rango de valores predeterminado es de 0 a 100 (valores enteros).
Los atributos min, max y step permiten elegir respectivamente el valor mínimo, el máximo y el incremento.
Indique su nivel (de 1 a 10, de 3 en 3):
<input type="range" name="rango"
min="1" max="10" step="3">
Indique su nivel (de 0 a 1, de 0,1 en 0,1):
<input type="range" name="rango"
min="0" max="1" step="0.1">
El atributo list debería permitir añadir etiquetas al control, pero actualmente (diciembre de 2024) los navegadores admiten el atributo parcialmente
Las cajas de texto de varias líneas se crean mediante la etiqueta <textarea>. Los atributos obligatorios rows y cols establecen el número de filas y columnas iniciales de la caja, aunque los navegadores permiten modificarlo arrastrando la esquina inferior derecha.
Si se escribe texto en el interior de la etiqueta, este se muestra en la caja de texto. HTML 5 introdujo el atributo placeholder que puede ser más cómodo para el usuario si tiene que borrar todo el texto incluido.
Los menús se crean mediante la etiqueta <select>. Cada opción del menú se define mediante la etiqueta <option>.
El valor que se envía es el texto que aparece en el menú, salvo si el elemento <option> contiene el atributo value.
<select name="menu">
<option>Uno</option>
<option value="2">Dos</option>
<option value="three">Tres</option>
</select>
El atributo selected indica la opción por omisión.
<select name="menu">
<option value="1">Uno</option>
<option value="2">Dos</option>
<option value="3" selected>Tres</option>
</select>
Si ningún elemento posee el atributo selected, los navegadores muestran la primera opción del menú.
<select name="menu">
<option value="1">Uno</option>
<option value="2">Dos</option>
<option value="3">Tres</option>
</select>
El problema de mostrar una de las opciones de forma predeterminada es que al recibir el formulario no se puede saber si el usuario ha elegido realmente esa opción o simplemente no ha modificado el control. Por ello, se aconseja incluir una opción en blanco al principio de los menús
<select name="menu">
<option value="0">...</option>
<option value="1">Uno</option>
<option value="2">Dos</option>
<option value="3">Tres</option>
</select>
El atributo size permite definir la altura del control.
<select name="menu" size="3">
<option value="1">Uno</option>
<option value="2">Dos</option>
<option value="3">Tres</option>
<option value="4">Cuatro</option>
<option value="5">Cinco</option>
</select>
El atributo multiple permite elegir varias opciones simultáneamente (con ayuda de la tecla Control o Mayúsculas). En este caso el atributo name debe incluir corchetes ([]) para que se puedan enviar en su caso varios valores en forma de matriz.
<select name="menu[]" size="5" multiple>
<option value="1">Uno</option>
<option value="2">Dos</option>
<option value="3">Tres</option>
<option value="4">Cuatro</option>
<option value="5">Cinco</option>
</select>
Se pueden agrupar opciones utilizando la etiqueta <optgroup>.
<select name="menu">
<option selected>...</option>
<optgroup label="Grupo1">
<option value="1">Opción uno</option>
<option value="2">Opción dos</option>
<option value="3">Opción tres</option>
</optgroup>
<optgroup label="Grupo2">
<option value="4">Opción cuatro</option>
<option value="5">Opción cinco</option>
<option value="6">Opción seis</option>
</optgroup>
</select>