Utilizar la validación de formularios en Bootstrap 5
1. Validación básica con HTML5
Bootstrap no implementa un sistema de validación propio desde cero. En realidad se apoya en las validaciones nativas de HTML5 y simplemente aplica estilos visuales para indicar si un campo es válido o inválido.
Un ejemplo simple sería:
1
2
3
4
5
6
7
8
9
<form>
<div class="mb-3">
<label for="nombre" class="form-label">Nombre</label>
<input type="text" class="form-control" id="nombre" required>
</div>
<button class="btn btn-primary">Enviar</button>
</form>
required: indica que el campo es obligatorio.
Sin embargo, para que Bootstrap muestre correctamente los estilos de validación necesitamos usar una pequeña configuración adicional.
2. Activar validación en Bootstrap
Bootstrap recomienda añadir la clase needs-validation y desactivar la validación automática del navegador con novalidate.
Ejemplo completo:
1
2
3
4
5
6
7
8
9
10
11
12
<form class="needs-validation" novalidate>
<div class="mb-3">
<label for="email" class="form-label">Correo electrónico</label>
<input type="email" class="form-control" id="email" required>
<div class="invalid-feedback">Introduce un correo válido</div>
</div>
<button class="btn btn-primary" type="submit">Enviar</button>
</form>
Esto desactiva la validación nativa de HTML5 del navegador, que normalmente mostraría sus propios mensajes de error.
Sin embargo, esto no significa que ya tengamos un sistema de validación funcionando. Lo único que hemos hecho hasta ahora es preparar el formulario para usar la validación personalizada de Bootstrap.
3. Mensajes de error con invalid-feedback
Bootstrap permite mostrar mensajes de error utilizando la clase invalid-feedback.
Ejemplo:
1
2
3
<div class="invalid-feedback">
Este campo es obligatorio
</div>
Este mensaje se mostrará automáticamente cuando el campo tenga el estado inválido con la clase is-invalid o cuando el formulario detecte que el campo no cumple las reglas definidas.
4. Mensajes de éxito con valid-feedback
También podemos mostrar mensajes positivos cuando los datos son correctos.
1
2
3
<div class="valid-feedback">
Todo correcto
</div>
Ejemplo completo:
1
2
3
4
5
6
7
8
9
10
<div class="mb-3">
<label for="usuario" class="form-label">Usuario</label>
<input type="text" class="form-control" id="usuario" required>
<div class="valid-feedback">Nombre válido</div>
<div class="invalid-feedback">Este campo es obligatorio</div>
</div>
5. Validación con JavaScript
Para activar el sistema de validación de Bootstrap debemos usar un pequeño script.
Este código es el que recomienda la documentación oficial de Bootstrap:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(() => {
'use strict'
const forms = document.querySelectorAll('.needs-validation')
Array.from(forms).forEach(form => {
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
})();
Este script hace tres cosas:
- Detecta todos los formularios con la clase
needs-validation - Comprueba si los campos son válidos
- Añade la clase
was-validatedpara mostrar los estilos visuales
6. Ejemplo completo
A continuación tienes un ejemplo funcional de validación con varios campos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<form class="needs-validation" novalidate>
<div class="mb-3">
<label class="form-label">Nombre</label>
<input type="text" class="form-control" required>
<div class="invalid-feedback">El nombre es obligatorio</div>
</div>
<div class="mb-3">
<label class="form-label">Correo</label>
<input type="email" class="form-control" required>
<div class="invalid-feedback">Introduce un correo válido</div>
</div>
<div class="mb-3">
<label class="form-label">Contraseña</label>
<input type="password" class="form-control" minlength="6" required>
<div class="invalid-feedback">La contraseña debe tener al menos 6 caracteres</div>
</div>
<button class="btn btn-primary" type="submit">Crear cuenta</button>
</form>
<script>
(() => {
'use strict'
const forms = document.querySelectorAll('.needs-validation')
Array.from(forms).forEach(form => {
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
})();
</script>
7. Buenas prácticas
Para crear formularios de forma profesional es recomendable seguir algunas prácticas:
Usar validación del lado del servidor
La validación en el navegador mejora la experiencia del usuario, pero nunca debe reemplazar la validación en el servidor.
Mensajes claros
Los mensajes deben explicar exactamente qué ocurre:
1
La contraseña debe tener al menos 8 caracteres
Evita mensajes como:
1
Error en el campo
Validar mientras el usuario escribe
Una buena práctica moderna es validar los campos mientras el usuario escribe, en lugar de esperar al envío del formulario.
Esto mejora mucho la experiencia de uso.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<form class="needs-validation" novalidate>
<div class="mb-3">
<label for="email" class="form-label">Correo electrónico</label>
<input type="email" class="form-control" id="email" required>
<div class="invalid-feedback">Introduce un correo válido</div>
</div>
<button type="submit" class="btn btn-primary">Enviar</button>
</form>
<script>
(() => {
const form = document.querySelector('.needs-validation');
const email = form.querySelector('#email');
// Validación al escribir
email.addEventListener('input', () => {
if (email.checkValidity()) {
email.classList.remove('is-invalid');
email.classList.add('is-valid');
} else {
email.classList.remove('is-valid');
email.classList.add('is-invalid');
}
});
// Validación al enviar
form.addEventListener('submit', e => {
if (!form.checkValidity()) e.preventDefault();
form.classList.add('was-validated');
});
})();
</script>