Ejercicio práctico 7: Formulario básico en HTML
Aprende a crear un formulario básico en HTML paso a paso. Descubre cómo usar etiquetas como <form>, <input>, <label>, y más, para capturar información del usuario de forma clara y estructurada.
Actividad
Crea un formulario con campos de texto, correo electrónico y un botón de envío.
Solución interactiva
Solución con el código HTML completo
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Formulario Básico</title>
</head>
<body>
<h1>Formulario</h1>
<form>
<label for="nombre">Nombre:</label>
<input type="text" id="nombre" name="nombre" />
<!-- <br />: Este es un salto de línea -->
<br />
<label for="email">Correo Electrónico:</label>
<input type="email" id="email" name="email" />
<br />
<button type="submit">Enviar</button>
</form>
</body>
</html>
Variantes del mismo ejercicio
Variante 1: Formulario con method y action
Los atributos method y action definen cómo y a dónde se envían los datos del formulario.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Formulario con Método POST</title>
</head>
<body>
<h1>Registro de Usuario</h1>
<form action="/procesar-registro" method="POST">
<label for="nombre">Nombre:</label>
<input type="text" id="nombre" name="nombre" />
<br />
<label for="email">Correo Electrónico:</label>
<input type="email" id="email" name="email" />
<br />
<button type="submit">Registrarse</button>
</form>
</body>
</html>
method="POST": envía los datos en el cuerpo de la petición (más seguro para información sensible).method="GET": envía los datos en la URL como parámetros visibles (útil para búsquedas y filtros).action: URL del servidor que procesará el formulario. Si se omite, se envía a la misma página.
Variante 2: Validación HTML5 con atributos nativos
HTML5 permite validar campos sin escribir JavaScript usando atributos como required, placeholder, minlength, maxlength y pattern.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Formulario con Validación</title>
</head>
<body>
<h1>Formulario Validado</h1>
<form>
<label for="nombre">Nombre (obligatorio):</label>
<input
type="text"
id="nombre"
name="nombre"
placeholder="Ingresá tu nombre completo"
required
minlength="3"
maxlength="50"
/>
<br />
<label for="email">Correo Electrónico:</label>
<input
type="email"
id="email"
name="email"
placeholder="ejemplo@correo.com"
required
/>
<br />
<label for="telefono">Teléfono:</label>
<input
type="tel"
id="telefono"
name="telefono"
placeholder="+54 11 1234-5678"
pattern="[+]{0,1}[0-9]{1,3}[0-9]{6,14}"
/>
<br />
<button type="submit">Enviar</button>
</form>
</body>
</html>
required: el campo no puede estar vacío.placeholder: texto de ejemplo que desaparece al escribir.minlength/maxlength: largo mínimo y máximo de caracteres.pattern: expresión regular que el valor debe cumplir.
Variante 3: Tipos de input y sus diferencias
Cada type de input activa un teclado diferente en móviles y tiene validación automática.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Tipos de Input</title>
</head>
<body>
<h1>Distintos Tipos de Campos</h1>
<form>
<label for="texto">Texto (type="text"):</label>
<input type="text" id="texto" name="texto" />
<br /><br />
<label for="email2">Email (type="email"):</label>
<input type="email" id="email2" name="email2" />
<!-- Valida formato de correo automáticamente -->
<br /><br />
<label for="password">Contraseña (type="password"):</label>
<input type="password" id="password" name="password" />
<!-- Oculta los caracteres al escribir -->
<br /><br />
<label for="edad">Edad (type="number"):</label>
<input type="number" id="edad" name="edad" min="1" max="120" />
<!-- Solo acepta números, con flechas incrementales -->
<br /><br />
<label for="telefono2">Teléfono (type="tel"):</label>
<input type="tel" id="telefono2" name="telefono2" />
<!-- Activa teclado numérico en móviles -->
<br /><br />
<button type="submit">Enviar</button>
</form>
</body>
</html>
Variante 4: Agrupando campos con fieldset y legend
Para formularios largos, <fieldset> y <legend> agrupan campos relacionados visual y semánticamente.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Formulario Agrupado</title>
</head>
<body>
<h1>Perfil de Usuario</h1>
<form>
<fieldset>
<legend>Datos Personales</legend>
<label for="nombre2">Nombre:</label>
<input type="text" id="nombre2" name="nombre" required />
<br />
<label for="email3">Email:</label>
<input type="email" id="email3" name="email" required />
</fieldset>
<fieldset>
<legend>Preferencias</legend>
<label for="idioma">Idioma preferido:</label>
<select id="idioma" name="idioma">
<option value="es">Español</option>
<option value="en">English</option>
<option value="pt">Português</option>
</select>
</fieldset>
<br />
<button type="submit">Guardar Perfil</button>
</form>
</body>
</html>
fieldset crea un recuadro visual alrededor de los campos agrupados y legend le da un título accesible.
Mini-desafío: Ponelo a prueba
Creá un formulario de registro que contenga:
- Campo de nombre con
requiredyplaceholder - Campo de email con
type="email"y validación automática - Campo de contraseña con
type="password"yminlength="8" - Campo de teléfono con
type="tel"ypattern - Un
<button type="submit">para enviar - Todos los campos deben tener su
<label>asociado confor
Intentá armarlo sin mirar los ejemplos. Si te trabás, volvé a la variante que necesites.
Errores comunes con formularios HTML
| Error | Por qué es un problema |
|---|---|
Olvidar el atributo name en los inputs | Sin name, el dato no se envía al servidor. Es el identificador del campo |
No asociar label con for/id | Los lectores de pantalla no saben qué etiqueta corresponde a qué campo. Además, al hacer clic en el label no se enfoca el input |
Botón sin type="submit" | Si está dentro de un <form>, un <button> sin type funciona como submit, pero es mejor ser explícito para evitar comportamientos inesperados |
Usar solo required sin validación server-side | La validación del navegador se puede saltar. Siempre validá también en el backend |
No poner placeholder como ayuda visual | Aunque no reemplaza al <label>, el placeholder guía al usuario sobre el formato esperado |
Preguntas frecuentes
¿Qué pasa si no pongo name en un input?
El campo no se envía al servidor. El atributo name es la clave con la que el backend recibe el valor. Si tenés <input type="text" id="nombre"> sin name, el usuario puede escribir en el campo pero al enviar el formulario ese dato no llega a destino.
¿GET vs POST: cuál uso?
Usá GET para búsquedas y filtros (los parámetros quedan en la URL, se puede compartir el link). Usá POST para registro, login o cualquier formulario que modifique datos o contenga información sensible (contraseñas, datos personales). POST envía los datos en el cuerpo de la petición, no en la URL.
¿Ya armaste tu primer formulario? Generá una página de contacto con DivZone AI y fijate cómo cada input queda asociado a su label con for e id.
No te pierdas la explicación completa acá 👉 Creación de formularios con HTML