El formulario básico: <form>, <input>, <label>, <button>
Los formularios son la forma en que los usuarios envían datos a un sitio web: crear una cuenta, iniciar sesión, buscar algo, dejar un mensaje. Cuatro elementos forman el núcleo de todo formulario HTML.
<form>: el contenedor
<form> agrupa todos los controles del formulario. Sin él, los campos y botones no están coordinados entre sí.
<!-- Formulario de contacto básico -->
<form action="/contacto" method="post">
<!-- los campos van aquí -->
</form>
action indica la URL del servidor que recibirá los datos al enviar el formulario. Si se omite, los datos se envían a la URL actual.
method indica cómo viajarán los datos:
method="get"— los datos van en la URL (/buscar?q=html). Para búsquedas y datos no sensibles. Se puede guardar como bookmark.method="post"— los datos van en el cuerpo de la petición HTTP, no en la URL. Para datos sensibles (contraseñas) o acciones que modifican algo en el servidor (crear cuenta, enviar mensaje).
Lo que hace el servidor con los datos está fuera del scope de este módulo. CAT-09 enseña el marcado HTML del formulario; el backend es una caja negra.
<input>: el control de entrada más versátil
<input> es un void element (como <img> — no tiene etiqueta de cierre). El atributo type cambia completamente su comportamiento y apariencia.
<input type="text" />
<!-- campo de texto libre (default) -->
<input type="email" />
<!-- valida formato de email; móvil muestra teclado con @ -->
<input type="password" />
<!-- oculta los caracteres escritos -->
<input type="number" />
<!-- solo acepta números; muestra flechas de incremento -->
<input type="checkbox" />
<!-- casilla de verificación independiente -->
<input type="radio" />
<!-- botón de opción (uno del grupo) -->
<input type="file" />
<!-- selector de archivo del sistema -->
<input type="hidden" />
<!-- campo invisible al usuario; valor fijo enviado con el form -->
El atributo name es imprescindible. El name es la clave del par clave-valor en la petición HTTP. Dicho con otras palabras, name es el nombre asignado a este input y es el que reconocera el servidor para buscar su valor. Sin name, el dato del campo no se incluye en los datos enviados al servidor.
<!-- ❌ MAL: sin name, este campo no se enviará -->
<input type="email" id="correo" />
<!-- ✅ BIEN: con name, el dato se envía como correo=usuario@ejemplo.com -->
<input type="email" id="correo" name="correo" />
Checkbox e independencia: los <input type="checkbox"> representan una opcion que el usuario puede marcar o desmarcar. Cada checkbox es independiente de los demás — no forman un grupo. Si querés que el usuario elija solo una opción de varias, usá <input type="radio"> con el mismo name (ver más abajo).
<!-- Checkbox independientes: el usuario puede marcar ambos -->
<input type="checkbox" id="opcion1" name="opcion1" />
<input type="checkbox" id="opcion2" name="opcion2" />
Radio y exclusividad mutua: los <input type="radio"> que comparten el mismo name forman un grupo — solo uno puede estar seleccionado a la vez. Si tienen name distintos, son independientes y el efecto de exclusividad mutua no ocurre — error frecuente.
<!-- Radio con name compartido: son mutuamente excluyentes -->
<input type="radio" name="color" value="rojo" id="rojo" />
<input type="radio" name="color" value="azul" id="azul" />
<label>: la pieza de accesibilidad central
<label> etiqueta un control de formulario con texto visible y lo vincula semánticamente. Todo input visible necesita su label.
Por qué importa — dos efectos concretos:
- Usabilidad: clicar el texto del
<label>activa el control asociado (enfoca el input o marca el checkbox). En un teléfono, esto amplía el área táctil. - Accesibilidad: los lectores de pantalla anuncian el texto del label cuando el foco llega al control. Sin label, anuncian “campo de texto — sin nombre”.
Forma con for/id (recomendada):
<!-- for en el label apunta al id del input (no al name) -->
<input type="radio" name="pais" value="argentina" id="argentina" />
<label for="argentina">Argentina</label>
<input type="radio" name="pais" value="uruguay" id="uruguay" />
<label for="uruguay">Uruguay</label>
El atributo for del <label> debe coincidir exactamente con el id del control. for apunta al id, NO al name — error frecuentísimo. El id identifica el elemento en el DOM; el name es la clave de envío al servidor — son dos atributos distintos con propósitos distintos.
Forma envolvente:
<!-- El input dentro del label crea la vinculación implícita -->
<label>
Correo electrónico
<input type="email" name="correo" />
</label>
En la forma envolvente no se necesita for ni id — la vinculación es por anidado. La forma con for/id es la recomendada cuando label e input no son adyacentes.
<!-- ❌ MAL: placeholder no reemplaza al label -->
<input type="text" placeholder="Tu nombre" name="nombre" />
<!-- ✅ BIEN: label visible + input con id vinculado -->
<label for="nombre">Nombre</label>
<input type="text" id="nombre" name="nombre" />
<button>: el botón de acción
<button> crea un botón interactivo. A diferencia de <input type="submit">, puede contener HTML dentro (texto formateado, íconos).
<button type="submit">Enviar formulario</button>
<!-- envía el form -->
<button type="reset">Limpiar campos</button>
<!-- borra todos los valores -->
<button type="button">Acción propia</button>
<!-- no hace nada por defecto -->
El tipo por defecto es submit. Si un <button> está dentro de un <form> y no tiene type, se comporta como type="submit" y envía el formulario al clicarlo. Este es uno de los bugs más difíciles de diagnosticar para un principiante: “mi botón hace submit sin que yo quiera” — ocurre porque olvidó poner type="button".
El texto del <button> va entre las etiquetas, no en un atributo value.
En el sandbox el formulario no se envía y la validación no se dispara, pero el check confirma que tu marcado es correcto; en un navegador real con servidor funcionaría.
Tu turno: armá un formulario de registro con method="post", 3 campos (nombre, correo, contraseña) cada uno con su <label for> vinculado al id, y un <button type="submit">Registrarse</button>. Luego hacé clic en “Comprobar”.
Tu primer formulario
Armá un formulario de registro para un blog ficticio. El sandbox pone el `<body>` — tu código va adentro. El formulario debe: 1. Ser un `<form>` con `method="post"`. 2. Tener exactamente 3 campos, cada uno con su `<label>` vinculado por `for`/`id`: - Campo de nombre: `<label for="nombre">Nombre</label>` + `<input type="text" id="nombre" name="nombre">` - Campo de email: `<label for="correo">Correo electrónico</label>` + `<input type="email" id="correo" name="correo">` - Campo de contraseña: `<label for="clave">Contraseña</label>` + `<input type="password" id="clave" name="clave">` 3. Tener un `<button type="submit">` con el texto `Registrarse`. > En el sandbox el formulario no se envía y la validación no se dispara, pero el check confirma que tu marcado es correcto; en un navegador real con servidor funcionaría.
Preview
En la referencia
En esta página