Bootstrap — Forms e Validazione

Form control · Input group · Validazione client-side · Bootstrap 5.3 · Marco Consiglio
Volta Institute · Napoli
A.A. 2026
📝 Form control — l'aspetto uniforme di input e select
La classe form-control applica automaticamente padding, bordo, angoli arrotondati e stile del focus a qualsiasi <input>, <textarea> o <select> — senza di essa, gli elementi dei form mantengono lo stile grezzo del browser, incoerente con il resto del design Bootstrap.
<div class="mb-3"> <label class="form-label" for="nome">Nome</label> <input type="text" class="form-control" id="nome"> </div> <div class="mb-3"> <label class="form-label">Messaggio</label> <textarea class="form-control" rows="4"></textarea> </div>
💡 mb-3 (margin-bottom, classe utility trattata nella guida dedicata) aggiunge lo spazio tra un campo e il successivo — senza, i campi risulterebbero visivamente troppo vicini tra loro.
🔗 Input group — combinare testo/icone con un campo
<div class="input-group"> <span class="input-group-text">€</span> <input type="number" class="form-control"> </div>
Anteprima
€
💡 input-group-text può stare prima O dopo l'input (o entrambe) — utile per prefissi (€, @, https://) o suffissi (kg, %, .com), fondendosi visivamente con il bordo del campo.
☑️ Checkbox e radio button
<div class="form-check"> <input class="form-check-input" type="checkbox" id="accetto"> <label class="form-check-label" for="accetto"> Accetto i termini e condizioni </label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="piano" id="base"> <label class="form-check-label" for="base">Piano Base</label> </div>
⚠️ for="accetto" sulla label deve corrispondere ESATTAMENTE all'id dell'input — un errore comune è dimenticare questo collegamento, che rende il testo non cliccabile per attivare il checkbox/radio associato.
💡 Radio button con lo stesso name (qui: piano) sono mutuamente esclusivi: selezionarne uno deseleziona automaticamente gli altri con lo stesso nome — un comportamento nativo HTML, non specifico di Bootstrap.
✅ Validazione client-side — feedback visivo integrato
Bootstrap integra la validazione HTML5 nativa (attributi come required, pattern) con classi CSS che mostrano visivamente il risultato — verde per valido, rosso per non valido — senza scrivere JavaScript di validazione da zero.
<form class="needs-validation" novalidate> <div class="mb-3"> <label class="form-label">Email</label> <input type="email" class="form-control" required> <div class="invalid-feedback">Inserisci un'email valida.</div> </div> <button class="btn btn-primary" type="submit">Invia</button> </form> <script> // JavaScript minimo richiesto per attivare la validazione visiva di Bootstrap document.querySelectorAll('.needs-validation').forEach(form => { form.addEventListener('submit', (e) => { if (!form.checkValidity()) { e.preventDefault(); e.stopPropagation(); } form.classList.add('was-validated'); }); }); </script>
Anteprima (campo non valido)
Inserisci un'email valida.
⚠️ novalidate sul <form> disattiva il popup di validazione nativo del browser (quello con l'icona rossa integrata), lasciando che sia Bootstrap a gestire visivamente il feedback tramite was-validated + invalid-feedback — senza novalidate, i due sistemi di validazione entrerebbero in conflitto.
💡 Il piccolo script JavaScript mostrato sopra è OBBLIGATORIO: senza di esso, la classe was-validated non viene mai aggiunta al form, e il feedback visivo (bordi verdi/rossi) non compare mai, anche se gli attributi required sono corretti.
📐 Layout form con la grid — campi affiancati
<form class="row g-3"> <div class="col-md-6"> <label class="form-label">Nome</label> <input type="text" class="form-control"> </div> <div class="col-md-6"> <label class="form-label">Cognome</label> <input type="text" class="form-control"> </div> </form>
✅ row g-3 applica il sistema di grid (guida Fondamenti) direttamente al <form>: g-3 è una utility di "gutter" (spaziatura tra colonne) — nome e cognome si affiancano su desktop (col-md-6 ciascuno) e si impilano automaticamente su mobile.
🧩 Applicazioni tipiche
TipologiaUso tipico
Form di contattoform-control + validazione client-side su email/messaggio obbligatori
Form di registrazioneLayout a grid per nome/cognome affiancati, input-group per prefissi telefonici
Filtri di ricercainput-group con icona di ricerca, select form-control per categorie
Form pagamentoinput-group con simbolo valuta, checkbox per termini e condizioni
🎓 Esercitazioni pratiche
1
Form di contatto con validazione
Costruisci un form con nome, email e messaggio, tutti obbligatori, applicando needs-validation e lo script JavaScript necessario per attivare il feedback visivo.
⏱ 30 min📦 1 file HTML💻 Individuale
2
Form di registrazione a due colonne
Crea un form con nome/cognome affiancati (col-md-6), email a piena larghezza, e un checkbox per l'accettazione termini, tutto dentro row g-3.
⏱ 25 min📦 1 file HTML💻 Individuale
3
Campo prezzo con input-group
Crea un campo numerico per un prezzo con simbolo € come prefisso e "IVA inclusa" come suffisso, usando due input-group-text sullo stesso input-group.
⏱ 15 min📦 1 file HTML💻 Individuale