← Todos los artículos
HTMLValidaciónFormularios

Validación de formularios HTML: una guía completa

Equipo de FormsFort ·

La validación del formulario garantiza que los usuarios proporcionen datos correctos y completos antes del envío. HTML5 proporciona un conjunto completo de atributos de validación que funcionan de forma nativa en todos los navegadores modernos, sin ningún JavaScript.

Esta guía cubre cada atributo de validación, cómo combinarlos y cuándo agregar una validación personalizada encima.

Atributos de validación HTML5

requerido

The required attribute prevents form submission when the field is empty:

<input type="text" name="name" required />

El navegador muestra una información sobre herramientas como "Complete este campo" cuando el usuario intenta enviar.

tipo

The input type attribute provides built-in format validation:

TipoValida
emailFormato de correo electrónico válido (contiene @ y dominio)
urlFormato de URL válido
numberSolo valor numérico
telNúmero de teléfono (optimiza el teclado móvil, sin formato estricto)
dateFormato de fecha válido
timeFormato de hora válido
<input type="email" name="email" required />
<input type="url" name="website" />
<input type="number" name="quantity" min="1" max="100" />

longitud mínima y longitud máxima

Restringir el recuento de caracteres de las entradas de texto:

<input type="text" name="username" minlength="3" maxlength="30" required />
<textarea name="bio" minlength="10" maxlength="500"></textarea>

mín y máx

Restringir rangos numéricos:

<input type="number" name="age" min="18" max="120" />
<input type="date" name="appointment" min="2026-01-01" />
<input type="range" name="rating" min="1" max="5" />

paso

Controlar el incremento numérico entradas:

<input type="number" name="price" min="0" step="0.01" />
<input type="time" name="meeting" step="900" />

patrón

The pattern attribute accepts a JavaScript regular expression:

<input type="text" name="zip" pattern="[0-9]{5}" title="Enter a 5-digit ZIP code" required />

Always include a title attribute with pattern so the browser can show a helpful error message.

Patrones de validación comunes

Correo electrónico con restricción de dominio

<input
type="email"
name="email"
pattern="^[^@\s]+@company\.com$"
title="Use your @company.com email address"
required
/>

Número de teléfono (internacional)

<input
type="tel"
name="phone"
pattern="\+?[0-9\s\-\(\)]{7,20}"
title="Enter a valid phone number"
/>

URL con protocolo

<input
type="url"
name="website"
pattern="https?://.+"
title="Enter a URL starting with http:// or https://"
/>

Seguridad de la contraseña

<input
type="password"
name="password"
minlength="8"
pattern="(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{8,}"
title="At least 8 characters with uppercase, lowercase, and a number"
required
/>

Código postal de EE. UU.

<input
type="text"
name="zip"
pattern="[0-9]{5}(-[0-9]{4})?"
title="Enter a 5-digit or 9-digit ZIP code"
/>

Aplicar estilo a los estados de validación con CSS

Los navegadores aplican pseudoclases a las entradas según su estado de validación:

input:valid {
border-color: #22c55e;
}
input:invalid {
border-color: #ef4444;
}
input:required {
border-left: 3px solid #059669;
}
input:user-invalid {
border-color: #ef4444;
background: #fef2f2;
}

The :user-invalid pseudo-class (supported in modern browsers) only applies after the user has interacted with the field, avoiding red borders on page load.

Validación personalizada con JavaScript

Para una lógica de validación que vaya más allá de lo que los atributos HTML pueden expresar, utilice la API de validación de restricciones:

const email = document.getElementById("email");
email.addEventListener("input", () => {
if (email.validity.typeMismatch) {
email.setCustomValidity("Please enter a valid email address.");
} else if (email.value && !email.value.endsWith("@company.com")) {
email.setCustomValidity("Only @company.com addresses are allowed.");
} else {
email.setCustomValidity("");
}
});

Call setCustomValidity("") with an empty string to clear the error and mark the field as valid.

Comprobar la validez antes del envío

document.querySelector("form").addEventListener("submit", (e) => {
const form = e.target;
if (!form.checkValidity()) {
e.preventDefault();
form.reportValidity();
}
});

Deshabilitar la validación nativa

Para deshabilitar la validación HTML5 por completo (útil al implementar una interfaz de usuario de validación personalizada):

<form novalidate>
<!-- fields -->
</form>

With novalidate, the form submits regardless of validation state. You handle all validation in JavaScript.

Validación del lado del servidor

La validación del lado del cliente mejora la experiencia del usuario, pero se puede omitir. Valide siempre también en el servidor o en el backend de formularios:

  • Verificación de tipo: Asegúrese de que los campos de correo electrónico contengan correos electrónicos válidos
  • Límites de longitud: Aplique longitud máxima en el lado del servidor
  • Validación de archivos: Verifique los tipos MIME, tamaños de archivos y escaneo en busca de malware
  • Restricciones de dominio: Solo se aceptan envíos de orígenes permitidos
  • Limitación de velocidad: evite el abuso desde una sola IP

Un servicio de backend de formularios como FormsFort maneja la validación del lado del servidor automáticamente, incluida la verificación de tipos MIME, el escaneo de archivos y la aplicación de restricciones de dominio.

Consideraciones de accesibilidad

  • Always associate <label> elements with inputs using the for attribute
  • Use aria-describedby to link error messages to their fields
  • Use aria-invalid="true" on fields that fail validation
  • Use aria-live="polite" on error message containers so screen readers announce changes
<label for="email">Email</label>
<input type="email" id="email" name="email" required aria-describedby="email-error" />
<span id="email-error" role="alert" aria-live="polite"></span>

Resumen

HTML5 provides a complete validation system that works without JavaScript. Use required, type, pattern, minlength, maxlength, min, max, and step to validate most form inputs. Style validation states with CSS pseudo-classes. Add custom JavaScript validation with the Constraint Validation API when HTML attributes are not sufficient. Always enforce validation on the server side or through your form backend service.

Preguntas frecuentes

¿Qué es la validación de formularios HTML?

La validación de formularios HTML utiliza atributos integrados del navegador como requerido, tipo, patrón, longitud mínima y longitud máxima para verificar la entrada del usuario antes del envío. El navegador impide el envío de formularios y muestra mensajes de error cuando falla la validación.

¿Puedo validar formularios sin JavaScript?

Sí. Los atributos de validación HTML5 funcionan de forma nativa en todos los navegadores modernos sin JavaScript. El navegador maneja comprobaciones de validación y muestra mensajes de error automáticamente.

¿Qué es el atributo de patrón en formularios HTML?

El atributo de patrón acepta una expresión regular que el valor de entrada debe coincidir. Por ejemplo, patrón='[A-Z]{3}' requiere exactamente tres letras mayúsculas.

¿Cómo muestro mensajes de validación personalizados en HTML?

Utilice el atributo de título junto con el patrón para proporcionar un mensaje personalizado. Para obtener más control, utilice JavaScript con la API de validación de restricciones y setCustomValidity().

¿Debo validar en el cliente y en el servidor?

Sí. La validación del lado del cliente mejora la experiencia del usuario al detectar errores de inmediato. La validación del lado del servidor (o validación del backend de formularios) es esencial para la seguridad porque se pueden omitir las comprobaciones del lado del cliente.

Comience gratis

¿Listo para agregar formularios a su sitio estático?

No se requiere backend. Apunte su formulario HTML a FormsFort y comience a recibir envíos en minutos.