Tema 20 · Validación de Formularios

Validación Visual de Formularios

Aprende a validar formularios en el cliente con Bootstrap 5: clases de estado .is-valid y .is-invalid, mensajes claros con .valid-feedback y .invalid-feedback, y la técnica needs-validation.

Validación en el Navegador con Bootstrap 5

Para proveer una experiencia de usuario impecable, Bootstrap 5 intercepta la validación HTML5 nativa y dibuja iconos de comprobación (palomilla verde) o advertencia (signo de exclamación rojo), acompañados de mensajes de retroalimentación claros.

Clases de Retroalimentación de Error y Éxito

Clase en el Input Mensaje Asociado Efecto Visual
.is-valid <div class="valid-feedback">¡Correcto!</div> Borde verde, icono de verificación y texto verde informativo.
.is-invalid <div class="invalid-feedback">Campo requerido.</div> Borde rojo, icono de peligro y mensaje de corrección en rojo.

El Script Oficial: .needs-validation y was-validated

Agrega la clase .needs-validation y el atributo novalidate al formulario <form>. Luego, con un pequeño script, agregas la clase .was-validated al enviar para que Bootstrap pinte los estados automáticamente:

const form = document.querySelector('.needs-validation');
form.addEventListener('submit', event => {
  if (!form.checkValidity()) {
    event.preventDefault();
    event.stopPropagation();
  }
  form.classList.add('was-validated');
}, false);

⚡ Formulario con Validación Visual Interactiva en Vivo

Presiona el botón "Enviar Formulario" con campos vacíos para ver los estados de error is-invalid y las correcciones automáticas:

index.html
Solo lectura
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Validación de Formularios Bootstrap 5</title>
  <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light p-4">

  <div class="container" style="max-width: 620px;">
    <div class="card shadow-sm border-0 rounded-4 p-4 bg-white">
      <h4 class="fw-bold text-dark mb-3">Validación de Datos en Kilopolis</h4>

      <form id="formValidacion" class="needs-validation" novalidate>
        <!-- Nombre de Usuario -->
        <div class="mb-3">
          <label for="campoUsuario" class="form-label fw-semibold">Nombre de Usuario</label>
          <div class="input-group has-validation">
            <span class="input-group-text">@</span>
            <input type="text" class="form-control" id="campoUsuario" name="campoUsuario" placeholder="usuario_kilopolis" required>
            <div class="invalid-feedback">
              Por favor ingresa un nombre de usuario válido.
            </div>
            <div class="valid-feedback">
              ¡Excelente nombre de usuario!
            </div>
          </div>
        </div>

        <!-- Ciudad / País -->
        <div class="mb-3">
          <label for="campoCiudad" class="form-label fw-semibold">Ciudad de Residencia</label>
          <input type="text" class="form-control" id="campoCiudad" name="campoCiudad" placeholder="Ej. Bogotá, Madrid, Ciudad de México" required>
          <div class="invalid-feedback">
            Debes proporcionar tu ciudad para asignar la zona horaria.
          </div>
        </div>

        <!-- Casilla de Aceptación -->
        <div class="mb-4">
          <div class="form-check">
            <input class="form-check-input" type="checkbox" value="" id="checkAcepto" name="checkAcepto" required>
            <label class="form-check-label small" for="checkAcepto">
              Acepto los términos de certificación de Kilopolis Academia
            </label>
            <div class="invalid-feedback">
              Debes aceptar los términos antes de continuar.
            </div>
          </div>
        </div>

        <button class="btn btn-primary w-100 py-2 rounded-pill fw-semibold shadow-sm" type="submit">
          Validar y Enviar Formulario &raquo;
        </button>
      </form>
    </div>
  </div>

  <script>
    const form = document.getElementById('formValidacion');
    form.addEventListener('submit', function (event) {
      if (!form.checkValidity()) {
        event.preventDefault();
        event.stopPropagation();
      } else {
        event.preventDefault();
        alert('🎉 ¡Formulario 100% válido y listo para enviar!');
      }
      form.classList.add('was-validated');
    }, false);
  </script>

</body>
</html>
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Manual Completo de Bootstrap 5.3 y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.