Para qué sirven los formularios
Cada vez que inicias sesión, buscas en Google, compras algo o te apuntas a un boletín, estás usando un formulario. Es la forma en que una web te pide datos.
Con HTML construyes el formulario: los campos, las etiquetas y el botón. Lo que pasa con los datos al enviarlos (guardarlos, mandar un correo…) lo hace un programa en el servidor, que no es parte de este curso. Aun así, verás que HTML ya hace mucho trabajo por su cuenta.
Las piezas básicas
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
<form>envuelve todo el formulario.<label>es la etiqueta del campo: el texto que dice qué hay que escribir.<input>es el campo donde se escribe. Es un elemento vacío.<button type="submit">es el botón que envía el formulario.
for e id: etiqueta y campo, conectados
El for del <label> debe coincidir con el id del <input>. Así quedan conectados:
- Al hacer clic en la etiqueta, el cursor salta al campo (pruébalo en el ejemplo: es muy útil en el móvil, donde los campos son pequeños).
- Los lectores de pantalla leen «Tu nombre, campo de texto» al llegar al campo.
name: el nombre del dato
El atributo name es el nombre con el que se envía el dato. Si un campo no tiene name, su valor no se envía. Suele coincidir con el id, pero cada uno tiene su función: id conecta con la etiqueta y name identifica el dato al enviarlo.
Tipos de campo
El atributo type de <input> cambia por completo el campo. Elegir bien el tipo ayuda muchísimo: el móvil muestra el teclado adecuado y el navegador comprueba que el dato tenga sentido.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
type | Para pedir | Ventaja |
|---|---|---|
text | Texto corto: nombre, ciudad… | El tipo por defecto |
email | Un correo | Comprueba que tenga @ y muestra el teclado con @ |
password | Una contraseña | Oculta lo que escribes |
number | Un número | Flechas para subir y bajar; admite min y max |
tel | Un teléfono | Teclado numérico en el móvil |
date | Una fecha | Muestra un calendario |
checkbox | Sí o no, o varias opciones | Se pueden marcar varias |
radio | Una opción entre varias | Solo se puede marcar una del grupo |
Elegir opciones
Casillas: checkbox
Para marcar varias opciones (o ninguna). Aquí el <input> va dentro del <label>, otra forma válida de conectarlos sin for ni id:
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
valuees lo que se envía si la casilla está marcada.checkedla deja marcada desde el principio.
Botones de opción: radio
Para elegir solo una. Todos los radio de un grupo deben tener el mismo name: así el navegador sabe que van juntos y, al marcar uno, desmarca el resto. Se agrupan con <fieldset> y el título del grupo va en <legend>:
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Listas desplegables: <select>
Para elegir una opción de una lista larga, sin ocupar mucho sitio:
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Texto largo: <textarea>
Para mensajes de varias líneas. A diferencia de <input>, sí lleva etiqueta de cierre:
<label for="mensaje">Mensaje</label>
<textarea id="mensaje" name="mensaje" rows="5"></textarea>
Validación sin programar
HTML puede comprobar los datos antes de enviarlos, sin una sola línea de programación:
| Atributo | Qué comprueba |
|---|---|
required | Que el campo no esté vacío |
minlength="3" / maxlength="20" | Longitud mínima / máxima del texto |
min="18" / max="99" | Valor mínimo / máximo de un número o una fecha |
type="email" | Que tenga forma de correo |
Prueba a pulsar «Crear cuenta» con los campos vacíos o mal rellenados:
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
A dónde van los datos
<form> tiene dos atributos para decir qué hacer al enviar:
<form action="https://ejemplo.com/contacto" method="post">
action: la dirección del programa que recibirá los datos.method: cómo se envían.getlos pone en la dirección (lo que hace un buscador);postlos envía «por dentro» (lo normal para datos personales).
Mientras aprendes, puedes dejarlos sin poner. Cuando hagas webs reales, hay servicios como Formspree o Netlify Forms que te dan una dirección de action y te reenvían los mensajes por correo, sin necesidad de programar el servidor.
Errores típicos
- Campos sin
<label>, o con la etiqueta sin conectar (foreiddistintos). - Usar
placeholdercomo única etiqueta. - Olvidar
name: el dato no se envía. - Botones de opción con
namedistintos: dejan marcar varios. - Escribir
<textarea/>o<textarea>sin cierre: el resto de la página acaba dentro del campo. - Usar
type="text"para todo, perdiendo la ayuda del teclado móvil y la validación.
Ejercicios
Ejercicio 1: etiqueta cada campo (fácil)
Este formulario no tiene etiquetas. Añade un <label> conectado a cada campo y pon el tipo correcto en el del correo.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Pista
Cada <label> necesita un for igual al id de su campo. El correo debería ser type="email".
Solución
<form>
<label for="nombre">Nombre</label>
<input type="text" id="nombre" name="nombre">
<label for="correo">Correo</label>
<input type="email" id="correo" name="correo">
<button type="submit">Suscribirme</button>
</form>
Ejercicio 2: formulario de contacto (medio)
Crea un formulario de contacto con: nombre (obligatorio), correo (obligatorio y con el tipo adecuado), un desplegable «Motivo» con tres opciones, un mensaje de varias líneas (obligatorio, mínimo 10 caracteres) y un botón «Enviar».
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Pista 1
Necesitas dos <input>, un <select> con <option>, un <textarea> y un <button>. Cada campo, con su <label>.
Pista 2
minlength también funciona en <textarea>.
Solución
<form>
<p>
<label for="nombre">Nombre</label><br>
<input type="text" id="nombre" name="nombre" required>
</p>
<p>
<label for="correo">Correo</label><br>
<input type="email" id="correo" name="correo" required>
</p>
<p>
<label for="motivo">Motivo</label><br>
<select id="motivo" name="motivo">
<option value="duda">Tengo una duda</option>
<option value="presupuesto">Quiero un presupuesto</option>
<option value="otro">Otro</option>
</select>
</p>
<p>
<label for="mensaje">Mensaje</label><br>
<textarea id="mensaje" name="mensaje" rows="5" required minlength="10"></textarea>
</p>
<button type="submit">Enviar</button>
</form>
Ejercicio 3: la encuesta (reto)
Haz una encuesta de una pizzería: tamaño (pequeña, mediana o familiar, solo una), ingredientes extra (queso, champiñones, aceitunas; se pueden elegir varios), fecha de entrega y un botón «Pedir». Agrupa cada pregunta con <fieldset> y <legend>.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Pista
El tamaño son tres radio con el mismo name; los ingredientes, tres checkbox.
Solución
<form>
<fieldset>
<legend>Tamaño</legend>
<label><input type="radio" name="tamano" value="pequena" required> Pequeña</label>
<label><input type="radio" name="tamano" value="mediana"> Mediana</label>
<label><input type="radio" name="tamano" value="familiar"> Familiar</label>
</fieldset>
<fieldset>
<legend>Ingredientes extra</legend>
<label><input type="checkbox" name="extra" value="queso"> Queso</label>
<label><input type="checkbox" name="extra" value="champinones"> Champiñones</label>
<label><input type="checkbox" name="extra" value="aceitunas"> Aceitunas</label>
</fieldset>
<p>
<label for="entrega">Fecha de entrega</label>
<input type="date" id="entrega" name="entrega" required>
</p>
<button type="submit">Pedir</button>
</form>
Ficha resumen
<form>envuelve el formulario;<button type="submit">lo envía.- Cada campo lleva su
<label>, conectado confor=id(o con el campo dentro de la etiqueta). namees el nombre con el que se envía el dato.- Elige el
typeadecuado:email,password,number,tel,date,checkbox,radio… checkbox= varias opciones;radiocon el mismoname= una sola.<select>= desplegable.<textarea>= texto largo.- Validación:
required,minlength,maxlength,min,max. Es una ayuda, no seguridad.
Glosario
| Término | Definición |
|---|---|
| Formulario | Conjunto de campos con los que una web pide datos. Se escribe con <form>. |
<label> | Etiqueta visible y accesible que dice qué dato pide un campo. |
<input> | Campo de formulario. Su atributo type decide qué tipo de dato recoge. |
name | Atributo con el nombre con el que se envía el dato de un campo. |
placeholder | Texto de ejemplo que se muestra dentro de un campo vacío. |
checkbox | Casilla de verificación: se pueden marcar varias. |
radio | Botón de opción: solo se puede marcar uno de los que comparten name. |
<select> | Lista desplegable de opciones, cada una en un <option>. |
<textarea> | Campo de texto de varias líneas. |
| Validación | Comprobación de que los datos de un formulario son correctos antes de enviarlos. |