So erstellst du ein Dropdown in HTML
Eine Dropdown-Liste ist ein <select>-Element mit einem <option> für jede Auswahl. Der value jeder Option ist das, was das Formular sendet; der Text zwischen den Tags ist das, was der Leser sieht. Wähl eine aus und drück auf Submit:
Das Formular sendet language=js: den name des Select und den value der gewählten Option. selected legt den Standard fest; ohne ist die erste Option gewählt. Hat eine Option keinen value, wird stattdessen ihr Text gesendet.
Verbinde das Label über for und id mit dem Select (oder indem du es drumherum legst), damit ein Klick auf das Label das Dropdown fokussiert und Screenreader es ansagen.
Attribute von select und option
| Element | Attribut | Macht |
|---|---|---|
<select> | name | Der Schlüssel, unter dem der Wert gesendet wird |
<select> | required | Eine echte Option muss gewählt sein, keine leere erste Platzhalter-Option |
<select> | multiple | Mehrere Optionen können gewählt werden |
<select> | size | Wie viele Zeilen sichtbar sind (macht daraus ein Listenfeld) |
<select> | disabled | Das ganze Dropdown ist aus und wird nicht gesendet |
<option> | value | Was gesendet wird, wenn sie gewählt ist |
<option> | selected | Gewählt, wenn die Seite lädt |
<option> | disabled | Wird angezeigt, kann aber nicht gewählt werden |
<optgroup> | label | Die Überschrift der Gruppe |
Eine Platzhalter-Option mit required
Ein Select hat immer einen Wert, ohne Platzhalter wird also die erste echte Option gesendet, auch wenn der Leser das Dropdown nie angefasst hat. Eine leere erste Option behebt das, und required stoppt das Absenden, bis eine echte Option gewählt ist:
Drück auf Continue, bevor du etwas wählst: Der Browser verweigert und bittet dich, einen Eintrag auszuwählen. Der Platzhalter hat value="", was required als leer behandelt, und disabled, damit er nicht wieder gewählt werden kann, sobald ein Land ausgewählt ist.
Optionen mit optgroup gruppieren
<optgroup label="..."> setzt eine Überschrift über eine Reihe von Optionen. Die Überschrift ist nicht auswählbar:
Gruppen lassen sich nicht verschachteln: Eine Liste bekommt eine Ebene von Überschriften, mehr nicht. disabled an einer <optgroup> deaktiviert jede Option darin.
Mehrfachauswahl
Mit multiple kann der Leser mehrere Optionen wählen, und aus dem Dropdown wird ein Listenfeld. Halte Strg (Cmd auf dem Mac) gedrückt, um Optionen einzeln hinzuzufügen, oder Shift, um einen Bereich auszuwählen:
Das Formular sendet skills=html und skills=css: denselben Namen einmal pro gewählter Option. Viele kennen die Geste Strg+Klick nicht, bei einer Handvoll Optionen ist eine Gruppe von Checkboxen also leichter zu bedienen.
Den Wert in JavaScript lesen und setzen
select.value liest und setzt den Wert der gewählten Option, und das Event change feuert, wenn der Leser eine andere Option wählt. Ein häufiger Einsatz ist ein zweites Dropdown, dessen Optionen vom ersten abhängen:
new Option(text, value) erzeugt eine Option. select.selectedIndex ist die Position der gewählten Option, und select.selectedOptions listet die gewählten auf; so liest du ein Mehrfach-Select aus.
Ein Select stylen
Die geöffnete Liste des Dropdowns zeichnen Browser und Betriebssystem, und nur wenig davon lässt sich stylen. Den geschlossenen Kasten schon: appearance: none entfernt den nativen Pfeil, und ein Hintergrundbild setzt deinen eigenen an seine Stelle:
Der zusätzliche Innenabstand am Ende lässt Platz für den Pfeil, damit langer Optionstext nicht darunter läuft. font: inherit ist hier so wichtig wie bei Buttons: Selects verwenden standardmäßig die kleine Formularschrift des Browsers. Die Optionen in der geöffneten Liste behalten das native Aussehen. Chrome kann auch die geöffnete Liste stylen, wenn du dich mit appearance: base-select dafür entscheidest; Browser ohne diese Unterstützung zeigen die native Liste. Volle Kontrolle überall braucht ein eigenes Widget mit ARIA, und das richtig hinzubekommen ist viel mehr Arbeit, als es aussieht.
Select, Radio Buttons oder datalist?
| Nimm | Wenn |
|---|---|
<select> | Eine Auswahl aus einer langen Liste, oder wenn wenig Platz ist |
| Radio Buttons | Eine Auswahl aus wenigen Optionen, die alle sichtbar sein sollen (siehe HTML Radio Button) |
<input> mit <datalist> | Vorschläge, aber jeder getippte Wert ist erlaubt |
Häufige Fehler
- Kein Platzhalter bei einer Pflichtauswahl. Die erste echte Option wird gesendet, auch wenn der Leser sie nie gewählt hat.
- Ein Platzhalter mit echtem Wert, etwa
value="none".requiredbehandelt ihn als gültige Auswahl. Nimmvalue="". - Optionen ohne
value, wenn der Text lang oder übersetzt ist. Der Server bekommt den sichtbaren Text, der sich mit der Sprache ändert. multiplebei wenigen Optionen. Checkboxen sind leichter zu bedienen.- Auf
clickan Optionen hören. Nimmchangeam<select>; es feuert auch bei Änderungen per Tastatur. - Kein Label. Ein Select, das nur einen Platzhalter hat, hat keinen Namen mehr, sobald eine Option gewählt ist.
Häufig gestellte Fragen
Wie erstelle ich eine Dropdown-Liste in HTML?
Mit <select> und einem <option> pro Auswahl: <select name="color"><option value="red">Red</option><option value="blue">Blue</option></select>. Gib dem Select einen name und ein <label>.
Wie lege ich die Standardoption eines Select fest?
Füg dieser Option selected hinzu: <option value="blue" selected>Blue</option>. Ohne ist die erste Option ausgewählt. In JavaScript setzt du select.value = 'blue'.
Wie füge ich einem Select einen Platzhalter hinzu?
Mach die erste Option leer und nicht auswählbar: <option value="" disabled selected>Choose a country</option>. Füg dem <select> required hinzu, damit das Formular erst abgesendet werden kann, wenn eine echte Option gewählt ist.
Wie lese ich den gewählten Wert eines Select in JavaScript aus?
select.value ist der Wert der gewählten Option. Für ihren sichtbaren Text nimm select.selectedOptions[0].text, und hör auf das Event change, um auf eine geänderte Auswahl zu reagieren. Bei einem Mehrfach-Select gehst du mit map über select.selectedOptions.
Was ist der Unterschied zwischen select und datalist?
Ein <select> erlaubt nur die aufgelisteten Optionen. Ein <input> mit <datalist> schlägt Optionen vor, während der Leser tippt, akzeptiert aber jeden Text. Nimm select, wenn die Antwort eine deiner Optionen sein muss.