Saltar al contenido
Curso de HTML
Todos los cursos Ir al ejercicio →

Formularios

  • ⏱ 40 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Construir un formulario con form, label, input, textarea y select.
  • Elegir el type de input adecuado para cada dato.
  • Validar con atributos como required y pattern.
  • Agrupar opciones con radio, checkbox, fieldset y legend.

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:

  1. El contenedor <form>, que agrupa todos los campos.
  2. Los campos (<input>, <textarea>, <select>…), donde la persona escribe o elige.
  3. 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

Estructura mínima
<form action="/enviar" method="post">
  <!-- aquí van los campos -->
  <button type="submit">Enviar</button>
</form>
AtributoFunciónValores comunes
actionDirección a la que se envían los datosUna URL, por ejemplo /enviar
methodCómo se envíanget (visible en la URL) o post (en el cuerpo de la petición)
targetDónde se muestra la respuesta_self (misma pestaña) o _blank

GET o POST

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.

Un campo con su etiqueta
<label for="nombre">Nombre completo</label>
<input type="text" id="nombre" name="nombre">

⚠️ 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.

Al hacer clic en la etiqueta, el cursor salta a su campo: eso es lo que consigue for + id.
✏️ Haz clic en la etiqueta

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.

typePara qué sirveQué obtienes
textTexto cortoCampo de una línea
emailCorreosValida que tenga @; teclado con @ en el móvil
passwordContraseñasOculta los caracteres con puntos
numberNúmerosSolo números; flechas para subir y bajar
telTeléfonosTeclado numérico en el móvil
urlDirecciones webValida que parezca una URL
dateFechasSelector de calendario
timeHorasSelector de hora
colorColoresPaleta de color
rangeValores en una escalaDeslizador
searchBúsquedasCampo con botón para borrar
fileArchivosBotón para elegir un archivo
✏️ Prueba los tipos

💡 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

AtributoQué haceEjemplo
requiredEl campo es obligatorio<input required>
placeholderTexto de ayudaplaceholder="Ej. Ana"
valueValor inicialvalue="México"
minlength / maxlengthMínimo y máximo de caracteresminlength="8"
min / maxRango permitido en números y fechasmin="18" max="99"
patternFormato exigido con una expresión regularpattern="[0-9]{5}"
autocompleteAyuda al navegador a autocompletarautocomplete="email"
disabledDesactiva el campo (no se envía)<input disabled>
readonlySolo lectura (sí se envía)<input readonly>
autofocusEl 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í:

Con validación
<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

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

select, option y optgroup
<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>
✏️ Texto largo y desplegable

7.Casillas y botones de opción

Cuando la persona debe elegir entre opciones visibles, usa dos tipos de <input>:

TipoPermiteEjemplo
radioElegir una sola opción de un grupoTalla: S, M o L
checkboxMarcar cero, una o varias opcionesIntereses: 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.

radio y checkbox con fieldset
<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.

✏️ Elige tus opciones

8.Botones

CódigoQué 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:

✏️ Formulario de contacto completo

10.Errores frecuentes

📒 Apuntes para llevar

  • <form> agrupa los campos; action y method indican dónde y cómo se envían los datos.
  • Cada campo lleva un <label for="…"> enlazado a su id, y un name para viajar con el dato.
  • type adapta el campo: email, password, number, date, color, range, file…
  • required, min, max, minlength, maxlength y pattern validan en el navegador.
  • <textarea> para texto largo y <select> con <option> para listas desplegables.
  • radio (una opción, mismo name) y checkbox (varias); agrúpalos con <fieldset> y <legend>.
  • <button type="submit"> envía; reset limpia; button no hace nada por sí solo.
  • GET para búsquedas, POST para datos sensibles; el servidor siempre debe volver a validar.

11.Glosario

TérminoSignificado
FormularioConjunto de campos con el que la persona envía información.
labelEtiqueta de texto asociada a un campo mediante for e id.
nameNombre con el que viaja el valor del campo al enviarse.
ValidaciónComprobación de que los datos tienen el formato esperado.
fieldset / legendAgrupación de campos y su título.
PlaceholderTexto de ayuda que desaparece al escribir.
GET / POSTLos 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?

Un campo se ve en la página pero no se envía al servidor. ¿Qué falta casi seguro?

Quieres que la persona elija solo una talla. ¿Qué usas?

¿Qué método es mejor para un formulario de inicio de sesión?

¿Qué hace required?

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.

Ir al ejercicio