Menu

Select w HTML: listy rozwijane, option, optgroup i multiple

Jak zrobić listę rozwijaną w HTML z <select> i <option>: wartości, opcja domyślna lub placeholder, required, grupy opcji, wybór wielokrotny, odczyt i ustawianie wartości w JavaScript oraz stylowanie strzałki.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Jak zrobić listę rozwijaną w HTML

Lista rozwijana to element <select> z elementem <option> dla każdego wyboru. value każdej opcji to to, co wysyła formularz; tekst między znacznikami to to, co widzi czytelnik. Wybierz jedną i naciśnij Submit:

Formularz wysyła language=js: name elementu select i value wybranej opcji. selected ustawia opcję domyślną; bez niego wybrana jest pierwsza opcja. Jeśli opcja nie ma value, zamiast niego wysyłany jest jej tekst.

Połącz etykietę z listą przez for i id (albo obejmując listę etykietą), żeby kliknięcie etykiety ustawiało fokus na liście, a czytniki ekranu ją ogłaszały.

Atrybuty select i option

ElementAtrybutDziałanie
<select>nameKlucz, pod którym wysyłana jest wartość
<select>requiredTrzeba wybrać prawdziwą opcję, a nie pusty placeholder na początku
<select>multipleMożna wybrać kilka opcji
<select>sizeIle wierszy jest widocznych (zamienia listę rozwijaną w pole listy)
<select>disabledCała lista jest wyłączona i nie jest wysyłana
<option>valueCo jest wysyłane po jej wybraniu
<option>selectedWybrana po wczytaniu strony
<option>disabledWidoczna, ale nie da się jej wybrać
<optgroup>labelNagłówek grupy

Opcja placeholder z required

Select zawsze ma wartość, więc bez placeholdera wysyłana jest pierwsza prawdziwa opcja, nawet jeśli czytelnik w ogóle nie dotknął listy. Pusta pierwsza opcja to naprawia, a required blokuje wysłanie, dopóki nie zostanie wybrana prawdziwa opcja:

Naciśnij Continue przed wyborem: przeglądarka odmówi i poprosi o wybranie pozycji. Placeholder ma value="", co required traktuje jako pustą wartość, oraz disabled, żeby nie dało się go wybrać ponownie po wybraniu kraju.

Grupowanie opcji przez optgroup

<optgroup label="..."> umieszcza nagłówek nad zestawem opcji. Nagłówka nie da się wybrać:

Grup nie można zagnieżdżać: lista ma jeden poziom nagłówków, nie więcej. disabled na <optgroup> wyłącza wszystkie jego opcje.

Wybór wielokrotny

multiple pozwala czytelnikowi wybrać kilka opcji i zamienia listę rozwijaną w pole listy. Przytrzymaj Ctrl (Cmd na Macu), żeby dodawać opcje pojedynczo, albo Shift, żeby zaznaczyć zakres:

Formularz wysyła skills=html i skills=css: tę samą nazwę raz dla każdej wybranej opcji. Wiele osób nie zna gestu Ctrl+kliknięcie, więc przy kilku opcjach łatwiejsza w użyciu jest grupa checkboxów.

Odczyt i ustawianie wartości w JavaScript

select.value odczytuje i ustawia wartość wybranej opcji, a zdarzenie change zachodzi, gdy czytelnik wybierze inną opcję. Częste zastosowanie to druga lista, której opcje zależą od pierwszej:

new Option(text, value) tworzy opcję. select.selectedIndex to pozycja wybranej opcji, a select.selectedOptions wymienia wybrane opcje; tak odczytuje się select z wyborem wielokrotnym.

Stylowanie select

Rozwiniętą listę rysują przeglądarka i system operacyjny, więc da się ją ostylować tylko w niewielkim stopniu. Zamknięte pole już tak: appearance: none usuwa natywną strzałkę, a obrazek tła wstawia w jej miejsce twoją własną:

Dodatkowy padding na końcu zostawia miejsce na strzałkę, żeby długi tekst opcji nie wchodził pod nią. font: inherit ma tu takie samo znaczenie jak przy przyciskach: select domyślnie używa małej czcionki formularzy przeglądarki. Opcje w rozwiniętej liście zachowują natywny wygląd. Chrome pozwala ostylować też rozwiniętą listę, gdy włączysz to przez appearance: base-select; przeglądarki bez tej obsługi pokazują natywną listę. Pełna kontrola wszędzie wymaga własnego widżetu zbudowanego z ARIA, co jest dużo trudniejsze do zrobienia dobrze, niż się wydaje.

select, przyciski radio czy datalist?

UżyjKiedy
<select>Jeden wybór z długiej listy albo gdy brakuje miejsca
Przycisków radioJeden wybór z kilku opcji, które powinny być widoczne naraz (zobacz radio button w HTML)
<input> z <datalist>Podpowiedzi, ale dozwolona jest dowolna wpisana wartość

Częste błędy

  • Brak placeholdera przy wymaganym wyborze. Wysyłana jest pierwsza prawdziwa opcja, nawet jeśli czytelnik jej nie wybrał.
  • Placeholder z prawdziwą wartością, na przykład value="none". required traktuje go jako poprawny wybór. Użyj value="".
  • Opcje bez value, gdy tekst jest długi albo tłumaczony. Serwer dostaje widoczny tekst, który zmienia się razem z językiem.
  • multiple przy kilku opcjach. Checkboxy są łatwiejsze w użyciu.
  • Nasłuchiwanie click na opcjach. Użyj change na <select>; zachodzi też przy zmianach z klawiatury.
  • Brak etykiety. Select z samym placeholderem po wybraniu opcji nie ma żadnej nazwy.

Najczęściej zadawane pytania

Jak zrobić listę rozwijaną w HTML?

Użyj <select> z jednym <option> na każdy wybór: <select name="color"><option value="red">Red</option><option value="blue">Blue</option></select>. Nadaj elementowi select name i <label>.

Jak ustawić domyślną opcję w select?

Dodaj selected do tej opcji: <option value="blue" selected>Blue</option>. Bez niego wybrana jest pierwsza opcja. W JavaScript ustaw select.value = 'blue'.

Jak dodać placeholder do select?

Zrób pierwszą opcję pustą i niemożliwą do wybrania: <option value="" disabled selected>Choose a country</option>. Dodaj required do <select>, żeby formularza nie dało się wysłać, dopóki nie zostanie wybrana prawdziwa opcja.

Jak odczytać wybraną wartość select w JavaScript?

select.value to wartość wybranej opcji. Jej widoczny tekst to select.selectedOptions[0].text, a zdarzenie change pozwala zareagować na zmianę wyboru. Przy select z wyborem wielokrotnym przejdź przez select.selectedOptions.

Czym różni się select od datalist?

<select> pozwala tylko na opcje z listy. <input> z <datalist> podpowiada opcje podczas pisania, ale przyjmuje dowolny tekst. Użyj select, gdy odpowiedź musi być jedną z twoich opcji.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ