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 |