Bootstrap Form Validation — Native HTML + Bootstrap 5
Bootstrap 5 ships form validation as a thin layer on top of native HTML — no jQuery, no plugin, no JavaScript validation library. Just `required` attributes, `.was-validated` class, and `.invalid-feedback` divs.
Bootstrap 5 dropped jQuery validation in favor of native HTML validation styled with Bootstrap classes. The pattern: add `novalidate` to the form (disables the default browser UI), add `required`/`pattern`/`type=email` to each input, add `.invalid-feedback` divs for error messages, and toggle `.was-validated` on submit attempts.
The native browser validation runs whenever the user submits. If validation fails, the browser blocks the submit; you add the `.was-validated` class which triggers Bootstrap's styled error UI (red borders on invalid inputs, `.invalid-feedback` divs become visible). Tab through the form and the error states cascade naturally.
For custom validation rules beyond what HTML offers (cross-field, async, complex patterns), use `setCustomValidity` on the input. The error message is whatever string you pass; Bootstrap displays it the same way as built-in errors. ~5 lines for password confirmation, no jQuery needed.
Bootstrap 5's approach is cleaner than the jQuery-validate era because it leans on the platform: native HTML attributes for the rules, native validation for the logic, CSS for the visual feedback. The JavaScript glue (~10 lines) just controls when to add the `.was-validated` class. Most forms need no custom JS at all.
How to set this up
Add novalidate to the form
Disables the default browser validation UI; Bootstrap takes over the styling.
Use native validation attributes
required, minlength, pattern, type=email — these are the rules. No library code.
Add .invalid-feedback divs
One per field, containing the error message. Hidden until .was-validated triggers them.
Toggle .was-validated on submit
10 lines of JS: on submit, check validity; if invalid, prevent submission and add .was-validated class to trigger the error UI.
Native HTML attributes, ~10 lines of glue JS, no library.
Frequently asked questions
Does Bootstrap 5 still need jQuery for validation?
No. Bootstrap 5 dropped jQuery entirely. Form validation uses native HTML attributes and ~10 lines of vanilla JS for the .was-validated toggle.
How do I show custom error messages in Bootstrap?
Place the error message in a `<div class="invalid-feedback">` element immediately after the input. It's hidden by default; .was-validated on the parent form reveals it for invalid inputs.
How do I do password confirmation in Bootstrap validation?
Use setCustomValidity on the confirm input via JavaScript: on input event, set it to '' if matching, or 'Passwords don't match' if not. Bootstrap displays the custom message the same way as built-in errors.
Can I use server-side validation with Bootstrap?
Yes — Bootstrap's .is-invalid class applied programmatically (e.g., from a server response) shows the error styling without triggering native validation. Useful for displaying errors returned by your backend.
What if a user has JavaScript disabled?
Native HTML validation still fires (the browser blocks submissions with empty required fields). The Bootstrap styling won't fully render — error divs stay hidden — but the form still rejects invalid input. Progressive enhancement works correctly.
Related guides
Ship the form, not the backend.
Free for 1,000 submissions/month. Email delivery, AI spam filtering, signed webhooks, real dashboard — all on the free plan. No credit card.
Get a free access key →