Formularios
💡 🎯 Al terminar esta lección podrás…
- Construir un formulario con
form,label,input,textareayselect. - Elegir el
typede input adecuado para cada dato. - Validar con atributos como
requiredypattern. - Agrupar opciones con
radio,checkbox,fieldsetylegend.
1.Qué es un formulario
Un formulario permite que el visitante escriba o elija información: iniciar sesión, buscar, registrarse, contactar, hacer un pedido. Es la forma principal de interacción entre una persona y un sitio.
En HTML, un formulario se compone de tres ideas:
- El contenedor
<form>, que agrupa todos los campos. - Los campos (
<input>,<textarea>,<select>…), donde la persona escribe o elige. - El botón de envío, que manda los datos a quien los procesa.
📌 Nota · HTML recoge los datos, no los guarda
HTML solo describe el formulario. Para que los datos se guarden o se envíen por correo se necesita un servidor (o un servicio externo). En este curso nos concentramos en construir formularios correctos y accesibles; no necesitas un servidor para aprender eso.
⚠️ Importante · Pruebas en el editor de práctica
En los editores de práctica de esta lección el envío está desactivado por seguridad. Para probar el comportamiento completo, guarda el código en tu propio archivo .html y ábrelo en el navegador.
2.La etiqueta form
<form action="/enviar" method="post">
<!-- aquí van los campos -->
<button type="submit">Enviar</button>
</form>
| Atributo | Función | Valores comunes |
|---|---|---|
action | Dirección a la que se envían los datos | Una URL, por ejemplo /enviar |
method | Cómo se envían | get (visible en la URL) o post (en el cuerpo de la petición) |
target | Dónde se muestra la respuesta | _self (misma pestaña) o _blank |
GET o POST
- GET agrega los datos a la dirección (
?buscar=perros). Úsalo para búsquedas y filtros, donde la URL se puede guardar y compartir. - POST envía los datos de forma interna. Úsalo para registros, contraseñas y pedidos; nunca para algo que quieras que quede en la URL.
3.Campos de texto y etiquetas
El campo más común es <input>. Cambia su aspecto y comportamiento con el atributo type. Pero cada campo necesita una etiqueta <label> que diga qué se espera.
<label for="nombre">Nombre completo</label>
<input type="text" id="nombre" name="nombre">
foren el<label>debe coincidir exactamente con eliddel campo. Esa unión permite hacer clic en el texto para escribir en el campo y hace que el lector de pantalla anuncie qué se pide.ididentifica al campo dentro de la página y debe ser único.namees el nombre con el que viajará el dato al servidor (por ejemplo,nombre=Ana). Sinname, el campo no se envía.
⚠️ Importante · No uses solo placeholder
El atributo placeholder muestra un texto de ejemplo que desaparece al escribir. No sustituye a la etiqueta: se pierde, suele tener poco contraste y los lectores de pantalla pueden ignorarlo. Úsalo solo como ayuda complementaria.
for + id.Prueba: haz clic sobre las palabras «Nombre completo». El cursor salta al campo. Ahora cambia el for por otro valor y vuelve a intentarlo: la conexión se rompe.
4.Tipos de input
El atributo type hace que el navegador adapte el campo: en el celular muestra el teclado adecuado, valida el formato y ofrece herramientas como calendarios o selectores de color.
type | Para qué sirve | Qué obtienes |
|---|---|---|
text | Texto corto | Campo de una línea |
email | Correos | Valida que tenga @; teclado con @ en el móvil |
password | Contraseñas | Oculta los caracteres con puntos |
number | Números | Solo números; flechas para subir y bajar |
tel | Teléfonos | Teclado numérico en el móvil |
url | Direcciones web | Valida que parezca una URL |
date | Fechas | Selector de calendario |
time | Horas | Selector de hora |
color | Colores | Paleta de color |
range | Valores en una escala | Deslizador |
search | Búsquedas | Campo con botón para borrar |
file | Archivos | Botón para elegir un archivo |
💡 Consejo · Elige el tipo más específico
Usar type="email" en vez de text es gratis y mejora la experiencia: validación automática, mejor teclado en el celular y menos errores.
5.Atributos útiles de los campos
| Atributo | Qué hace | Ejemplo |
|---|---|---|
required | El campo es obligatorio | <input required> |
placeholder | Texto de ayuda | placeholder="Ej. Ana" |
value | Valor inicial | value="México" |
minlength / maxlength | Mínimo y máximo de caracteres | minlength="8" |
min / max | Rango permitido en números y fechas | min="18" max="99" |
pattern | Formato exigido con una expresión regular | pattern="[0-9]{5}" |
autocomplete | Ayuda al navegador a autocompletar | autocomplete="email" |
disabled | Desactiva el campo (no se envía) | <input disabled> |
readonly | Solo lectura (sí se envía) | <input readonly> |
autofocus | El cursor empieza aquí | <input autofocus> |
⚠️ Importante · La validación del navegador no basta
Atributos como required y pattern mejoran la experiencia, pero cualquier persona puede saltárselos. Quien procesa los datos en el servidor siempre debe validarlos de nuevo.
🔍 Ejemplo · Un código postal
Un campo que exige exactamente cinco dígitos se escribe así:
<label for="cp">Código postal</label>
<input type="text" id="cp" name="cp" required
pattern="[0-9]{5}" maxlength="5"
inputmode="numeric" autocomplete="postal-code">
En tu propio navegador, intenta enviar el formulario con el campo vacío o con letras: verás un aviso automático, sin escribir una sola línea de JavaScript.
6.Texto largo y listas desplegables
Texto largo: textarea
<label for="mensaje">Mensaje</label>
<textarea id="mensaje" name="mensaje" rows="5" cols="40"></textarea>
A diferencia de <input>, <textarea> sí tiene etiqueta de cierre y su contenido inicial va entre las etiquetas. rows y cols fijan su tamaño aproximado.
Lista desplegable: select
<label for="pais">País</label>
<select id="pais" name="pais">
<option value="">Elige una opción</option>
<optgroup label="América">
<option value="mx">México</option>
<option value="co">Colombia</option>
</optgroup>
<optgroup label="Europa">
<option value="es">España</option>
</optgroup>
</select>
<option value="…">: elvaluees lo que se envía; el texto es lo que ve la persona.<optgroup>agrupa opciones con un título.selectedmarca la opción inicial ymultiplepermite elegir varias.
7.Casillas y botones de opción
Cuando la persona debe elegir entre opciones visibles, usa dos tipos de <input>:
| Tipo | Permite | Ejemplo |
|---|---|---|
radio | Elegir una sola opción de un grupo | Talla: S, M o L |
checkbox | Marcar cero, una o varias opciones | Intereses: música, cine, deporte |
⚠️ Importante · El grupo se forma con name
Los botones radio que comparten el mismo name funcionan como un grupo: al elegir uno se desmarca el otro. Cada uno lleva su propio value.
<fieldset>
<legend>Talla de la camiseta</legend>
<input type="radio" id="s" name="talla" value="s">
<label for="s">Chica</label>
<input type="radio" id="m" name="talla" value="m" checked>
<label for="m">Mediana</label>
</fieldset>
<fieldset>
<legend>Intereses</legend>
<input type="checkbox" id="mus" name="interes" value="musica">
<label for="mus">Música</label>
<input type="checkbox" id="cin" name="interes" value="cine">
<label for="cin">Cine</label>
</fieldset>
<fieldset> agrupa campos relacionados y <legend> es el título del grupo. Los lectores de pantalla anuncian la leyenda antes de cada opción, lo que da contexto a quien no ve la pantalla.
8.Botones
| Código | Qué hace |
|---|---|
<button type="submit"> | Envía el formulario (es el valor por defecto) |
<button type="reset"> | Devuelve todos los campos a su valor inicial |
<button type="button"> | No hace nada por sí solo; se usa con JavaScript |
💡 Consejo · Usa <button> en lugar de <input type="submit">
Ambos funcionan, pero <button> admite contenido (texto con formato, íconos) y es más flexible. Indica siempre su type para evitar sorpresas: un botón dentro de un formulario envía el formulario si no declaras otro tipo.
📌 Nota · Botón con texto claro
Escribe el verbo de lo que ocurrirá: «Crear cuenta», «Enviar mensaje», «Comprar». Evita «Aceptar» o «OK», que no explican nada.
9.Un formulario completo
Juntemos todo en un formulario de contacto. Léelo de arriba abajo e identifica cada pieza que viste en la lección:
10.Errores frecuentes
- Campos sin
<label>o conforque no coincide con elid. - Olvidar
name: el campo se ve, pero no se envía. - Dos campos con el mismo
id: losiddeben ser únicos. (Losradiosí compartenname, pero noid). - Usar
placeholdercomo única etiqueta. - Botones
radiocon distintoname: dejan de comportarse como grupo. - Pedir más datos de los necesarios. Cada campo extra baja la tasa de personas que terminan el formulario y aumenta lo que debes proteger.
- Confiar solo en la validación del navegador.
📒 Apuntes para llevar
<form>agrupa los campos;actionymethodindican dónde y cómo se envían los datos.- Cada campo lleva un
<label for="…">enlazado a suid, y unnamepara viajar con el dato. typeadapta el campo:email,password,number,date,color,range,file…required,min,max,minlength,maxlengthypatternvalidan en el navegador.<textarea>para texto largo y<select>con<option>para listas desplegables.radio(una opción, mismoname) ycheckbox(varias); agrúpalos con<fieldset>y<legend>.<button type="submit">envía;resetlimpia;buttonno hace nada por sí solo.- GET para búsquedas, POST para datos sensibles; el servidor siempre debe volver a validar.
11.Glosario
| Término | Significado |
|---|---|
| Formulario | Conjunto de campos con el que la persona envía información. |
label | Etiqueta de texto asociada a un campo mediante for e id. |
name | Nombre con el que viaja el valor del campo al enviarse. |
| Validación | Comprobación de que los datos tienen el formato esperado. |
fieldset / legend | Agrupación de campos y su título. |
| Placeholder | Texto de ayuda que desaparece al escribir. |
| GET / POST | Los dos métodos principales para enviar datos de un formulario. |
🧠 Comprueba lo aprendido
Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.
¿Cómo se enlaza un <label> con su campo?
El for del <label> debe tener el mismo valor que el id del campo. Así se puede hacer clic en el texto y los lectores de pantalla lo asocian.
Un campo se ve en la página pero no se envía al servidor. ¿Qué falta casi seguro?
Los datos viajan con el name del campo. Sin él, el campo no se incluye en el envío.
Quieres que la persona elija solo una talla. ¿Qué usas?
Los radio que comparten name forman un grupo en el que solo se puede elegir una opción.
¿Qué método es mejor para un formulario de inicio de sesión?
POST no pone los datos en la URL. Con GET, la contraseña quedaría visible en la dirección y en el historial.
¿Qué hace required?
required impide el envío mientras el campo esté vacío. Recuerda que el servidor debe validar también.
Tu progreso se guarda en este navegador y se refleja en el índice del curso.
💡 🚀 ¡Ahora te toca!
La práctica fija lo aprendido. Pasa al ejercicio de esta lección.