Menu

Select HTML: menu a tendina con option, optgroup e multiple

Come creare un menu a tendina in HTML con <select> e <option>: valori, un'opzione predefinita o segnaposto, required, gruppi di opzioni, selezione multipla, leggere e impostare il valore in JavaScript e dare uno stile alla freccia.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Come creare un menu a tendina in HTML

Un menu a tendina è un elemento <select> con un <option> per ogni scelta. Il value di ogni opzione è ciò che invia il modulo; il testo tra i tag è ciò che vede il lettore. Scegline una e premi Submit:

Il modulo invia language=js: il name della select e il value dell'opzione scelta. selected imposta il valore predefinito; senza, viene scelta la prima opzione. Se un'opzione non ha value, viene inviato il suo testo.

Collega l'etichetta alla select con for e id (o racchiudendola) così cliccando l'etichetta il focus va sul menu e gli screen reader lo annunciano.

Attributi di select e option

ElementoAttributoCosa fa
<select>nameLa chiave con cui viene inviato il valore
<select>requiredBisogna scegliere un'opzione vera, non una prima opzione segnaposto vuota
<select>multipleSi possono scegliere più opzioni
<select>sizeQuante righe sono visibili (la trasforma in una casella di riepilogo)
<select>disabledL'intero menu è disattivato e non viene inviato
<option>valueCiò che viene inviato quando è scelta
<option>selectedScelta al caricamento della pagina
<option>disabledMostrata ma non selezionabile
<optgroup>labelIl titolo del gruppo

Un'opzione segnaposto con required

Una select ha sempre un valore, quindi senza un segnaposto viene inviata la prima opzione vera anche se il lettore non ha mai toccato il menu. Una prima opzione vuota risolve il problema, e required blocca l'invio finché non viene scelta un'opzione vera:

Premi Continue prima di scegliere: il browser rifiuta e ti chiede di selezionare un elemento. Il segnaposto ha value="", che required considera vuoto, e disabled così non si può scegliere di nuovo una volta selezionato un paese.

Raggruppare le opzioni con optgroup

<optgroup label="..."> mette un titolo sopra un insieme di opzioni. Il titolo non è selezionabile:

I gruppi non si possono annidare: una lista ha un solo livello di titoli, non di più. disabled su un <optgroup> disattiva tutte le sue opzioni.

Selezione multipla

multiple permette al lettore di scegliere più opzioni, e trasforma il menu a tendina in una casella di riepilogo. Tieni premuto Ctrl (Cmd su Mac) per aggiungere le opzioni una alla volta, o Maiusc per selezionare un intervallo:

Il modulo invia skills=html e skills=css: lo stesso nome una volta per ogni opzione scelta. Molte persone non conoscono il gesto Ctrl+clic, quindi per poche opzioni un gruppo di checkbox è più facile da usare.

Leggere e impostare il valore in JavaScript

select.value legge e imposta il valore dell'opzione scelta, e l'evento change scatta quando il lettore sceglie un'opzione diversa. Un uso comune è un secondo menu le cui opzioni dipendono dal primo:

new Option(text, value) crea un'opzione. select.selectedIndex è la posizione dell'opzione scelta, e select.selectedOptions elenca quelle scelte, ed è così che si legge una select multipla.

Dare uno stile a una select

La lista aperta del menu è disegnata dal browser e dal sistema operativo, e se ne può personalizzare poco. Il riquadro chiuso invece sì: appearance: none toglie la freccia nativa, e un'immagine di sfondo ci mette la tua:

Il padding extra alla fine lascia spazio alla freccia così il testo lungo delle opzioni non ci finisce sotto. font: inherit conta qui quanto sui pulsanti: per impostazione predefinita le select usano il piccolo font dei moduli del browser. Le opzioni nella lista aperta mantengono l'aspetto nativo. Chrome permette di dare uno stile anche alla lista aperta se lo attivi con appearance: base-select; i browser che non lo supportano mostrano la lista nativa. Il controllo completo ovunque richiede un widget personalizzato costruito con ARIA, che è molto più difficile da fare bene di quanto sembri.

select, radio button o datalist?

UsaQuando
<select>Una scelta da una lista lunga, o quando lo spazio è poco
Radio buttonUna scelta tra poche opzioni che devono essere tutte visibili (vedi radio button HTML)
<input> con <datalist>Suggerimenti, ma è ammesso qualsiasi valore digitato

Errori comuni

  • Nessun segnaposto in una scelta obbligatoria. Viene inviata la prima opzione vera anche se il lettore non l'ha mai scelta.
  • Un segnaposto con un valore vero, come value="none". required lo considera una scelta valida. Usa value="".
  • Opzioni senza value quando il testo è lungo o tradotto. Il server riceve il testo visibile, che cambia con la lingua.
  • multiple per poche opzioni. Le checkbox sono più facili da usare.
  • Ascoltare click sulle opzioni. Usa change sulla <select>; scatta anche per i cambiamenti da tastiera.
  • Nessuna etichetta. Una select con solo un segnaposto resta senza nome una volta scelta un'opzione.

Domande frequenti

Come si crea un menu a tendina in HTML?

Usa <select> con un <option> per ogni scelta: <select name="color"><option value="red">Red</option><option value="blue">Blue</option></select>. Dai alla select un name e un <label>.

Come imposto l'opzione predefinita in una select?

Aggiungi selected a quell'opzione: <option value="blue" selected>Blue</option>. Senza, è selezionata la prima opzione. In JavaScript, imposta select.value = 'blue'.

Come aggiungo un segnaposto a una select?

Rendi la prima opzione vuota e non selezionabile: <option value="" disabled selected>Choose a country</option>. Aggiungi required alla <select> così il modulo non si può inviare finché non viene scelta un'opzione vera.

Come leggo il valore selezionato di una select in JavaScript?

select.value è il valore dell'opzione selezionata. Per il suo testo visibile usa select.selectedOptions[0].text, e ascolta l'evento change per reagire quando la scelta cambia. Per una select multipla, scorri select.selectedOptions con map.

Che differenza c'è tra una select e una datalist?

Una <select> permette solo le opzioni elencate. Un <input> con una <datalist> suggerisce opzioni mentre il lettore scrive, ma accetta qualsiasi testo. Usa la select quando la risposta deve essere una delle tue.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA