← Wszystkie wpisy

Customizable select: wreszcie można stylizować prawdziwy <select>

Wyjście poza domyślny element select oznaczało dotąd jeden z dwóch złych kompromisów: ciężkie biblioteki JavaScript albo mnóstwo elementów div, przy czym dostępność w obu przypadkach stawała się kłopotliwa.1 Na WWDC 2026 zespół Safari pokazał wyjście z tego impasu: customizable select, czyli zestaw rozszerzeń HTML i CSS, dzięki którym istniejący już element <select> daje się w pełni stylizować, zachowując zarazem semantykę, nawigację klawiaturą i obsługę czytników ekranu, które już zapewnia. Począwszy od Safari 27 i Chrome 135 można od nowa ostylować przycisk, menu rozwijane, znacznik wyboru, a nawet strzałkę, a następnie umieścić wewnątrz opcji obrazy, filmy lub emoji.1

TL;DR

  • Customizable select stylizuje prawdziwy element <select> wyłącznie za pomocą HTML i CSS, zastępując biblioteki JavaScript i sterty div, po które programiści sięgali wcześniej. Dostępność rozpoczyna się w Safari 27 i Chrome 135.1
  • Włączenie odbywa się przez appearance: base-select, stosowane dwukrotnie: raz na samym select, aby otworzyć stylizację przycisku, i raz na ::picker(select), aby zrezygnować z natywnego menu rozwijanego.1
  • Wraz z tym pojawiają się nowe stylizowalne części: ::picker-icon zmienia styl strzałki za pomocą właściwości content oraz width, ::checkmark na elemencie option w ten sam sposób wymienia znacznik, a pseudoklasa :open stylizuje przycisk, gdy menu jest otwarte.1
  • Opcje przyjmują dowolny rodzaj treści: obrazy, filmy, emoji. Demo z sesji umieszcza w każdej opcji SVG i etykietę, a następnie układa całe menu rozwijane jako siatkę CSS przy użyciu grid-template i gap.1
  • Umieszczenie <button> jako pierwszego dziecka <select>, czego wcześniej HTML nie dopuszczał, zastępuje wbudowany przycisk; znajdujący się w nim element <selectedcontent> wyświetla bogatą treść wybranej opcji.2
  • Progresywne ulepszanie otrzymuje się gratis: przeglądarki bez obsługi wracają do natywnego okienka, a semantyczny element select wszędzie zachowuje wbudowaną dostępność.1

Od zupy z div z powrotem do semantycznego HTML

Do obejrzenia: odkryj na nowo element select w HTML (WWDC26)

Tim, inżynier Safari, stosuje appearance: base-select w demie portfolio fotografa, zaczynając od 2:48.

Sesja wychodzi od tego, co <select> już robi dobrze. Element zapewnia podstawową dostępność od razu po wyjęciu z pudełka: nawigację klawiaturą między elementami option i solidne zachowanie z czytnikami ekranu, a wszystko bez zewnętrznych bibliotek.1 Na platformach Apple natywne renderowanie to znany przycisk rozwijany, który pasuje do wszystkich innych kontrolek na platformie, co daje użytkownikom znajomy sposób poruszania się po nim.1

Problemem zawsze był projekt graficzny. Wystarczy umieścić natywną kontrolkę na ostylowanej stronie, a wygląda nie na miejscu; nie chce się wtopić w otoczenie. Dotąd lekarstwem było całkowite porzucenie elementu na rzecz widżetu JavaScript albo sterty div i ręczne odtwarzanie dostępności. Customizable select zachowuje element i oddaje stylizację w ręce twórcy, w trzech etapach, które sesja omawia na przykładzie prawdziwego portfolio fotografa: przycisk, menu rozwijane, a na końcu treść wykraczająca poza zwykły tekst.1

Stylizowanie przycisku: base-select, ::picker-icon i :open

Przycisk to ta część select, którą klika się, aby pokazać menu, a pierwszym krokiem jest pojedyncza deklaracja:

select {
  appearance: base-select;
}

appearance: base-select zamienia natywne renderowanie na mniejszy zestaw stylów bazowych, które można zmieniać.1 Efekt pojawia się natychmiast dzięki dziedziczeniu: strona demonstracyjna ustawia font-family: Gill Sans na body, a przycisk select dziedziczy teraz czcionkę body, pasując do etykiety obok.1 Stąd tło, obramowanie i padding dostosowuje się jak w każdym innym elemencie.

Przycisk dopełniają dwa nowe punkty zaczepienia. Strzałka otrzymuje własny selektor ::picker-icon, który przyjmuje właściwość content na zastępczy glif oraz width do ustalenia jego rozmiaru. Pseudoklasa :open nadaje przyciskowi inny styl, gdy menu rozwijane jest otwarte:

select::picker-icon {
  content: "▼"; /* swap in your own glyph */
  width: 1rem;
}

select:open {
  background: #1d1d1f;
  color: #f5f5f7;
}

select:open::picker-icon {
  color: #f5f5f7; /* arrow matches the text color in the open state */
}

Werdykt sesji co do efektu: select pasujący do reszty strony w zaledwie kilku wierszach CSS.1

Stylizowanie menu rozwijanego: ::picker(select) i ::checkmark

Menu ma własne stylizowalne części. Samo menu rozwijane adresuje się za pomocą ::picker(select) na elemencie select, a znacznik za pomocą ::checkmark na elemencie option.1 Rezygnacja z natywnego menu wymaga appearance: base-select po raz drugi, tym razem na pickerze:

select::picker(select) {
  appearance: base-select;
  padding: 0.5rem;
  margin-top: 0.25rem;
  border: 1px solid #d2d2d7;
  box-shadow: 0 8px 24px rgb(0 0 0 / 0.12);
}

Mając czystą kartę, demo rozplanowuje odstępy za pomocą padding i margin, a następnie zajmuje się obramowaniem i box-shadow na menu rozwijanym.1 Do wyróżnienia bieżącego wyboru służy istniejący już selektor :checked, a nie cokolwiek nowego: pogrubić zaznaczoną opcję, wyszarzyć pozostałe.1

option:checked {
  font-weight: bold;
}

option:not(:checked) {
  color: #6e6e73;
}

option::checkmark {
  content: "✓";
  width: 1rem;
}

::checkmark działa dokładnie tak samo jak ::picker-icon: ustawia się content i width, a domyślny znacznik staje się dowolnym glifem pasującym do projektu.1

Bogata treść w opcjach, ułożona jako siatka

Większa zmiana dotyczy tego, co trafia do wnętrza <option>. Sesja mówi wprost: działa każdy rodzaj treści, obrazy, filmy, emoji, cokolwiek się chce.1 Demo buduje przeglądarkę kategorii dla najpopularniejszych tematów fotografa, z symbolem SVG i etykietą wewnątrz każdej opcji:

<select>
  <option value="flowers">
    <img src="flowers.svg" alt="">
    Flowers
  </option>
  <!-- more categories -->
</select>

Warto zwrócić uwagę na pusty atrybut alt. Tim celowo pozostawia tekst alternatywny obrazu pusty, ponieważ w przeciwnym razie czytniki ekranu odczytałyby etykietę „Flowers” dwukrotnie.1 Drobny szczegół o realnym skutku: bogate opcje pozostają tak samo użyteczne z technologiami wspomagającymi jak zwykłe.

Po usunięciu domyślnego znacznika wyboru demo wyróżnia wybraną opcję za pomocą selektora checked oraz zmian koloru.1 Pozostaje jeden problem: opcje z symbolem i etykietą sprawiają, że menu rozwijane robi się bardzo długie. Lekarstwem jest ponowne użycie CSS, który już istnieje, bo picker jest teraz zwykłym celem stylizacji. Układ siatki przebudowuje całe menu:

select::picker(select) {
  display: grid;
  grid-template: 1fr 1fr / 1fr 1fr 1fr; /* rows / columns */
  gap: 0.5rem;
}

grid-template definiuje liczbę wierszy i kolumn, a gap definiuje odstępy między komórkami siatki, dzięki czemu menu rozwijane układa się w uporządkowaną siatkę kategorii.1 Sesja kończy się efektowną klamrą na ten sam temat: radialnym selektorem koloru, zbudowanym w całości za pomocą customizable select.1

Wymienny przycisk i selectedcontent

W przeglądarce kategorii pozostaje jedna luka: symbole SVG żyją w opcjach, ale przycisk pokazujący bieżący wybór wyświetla wyłącznie tekst.1 Customizable select zamyka tę lukę, pozwalając zastąpić wbudowany przycisk poprzez umieszczenie elementu <button> jako pierwszego dziecka <select>. Umieszczenie przycisku wewnątrz select nie było wcześniej w HTML dozwolone; teraz przyjmuje on niestandardową treść, taką jak etykiety, lub jak element stworzony dokładnie do tego zadania.1

Ogłoszenie bety Safari 27 od WebKit nazywa ten element: <selectedcontent>. Umieszczony w przycisku będącym pierwszym dzieckiem select, wyświetla treść aktualnie wybranej opcji i można go stylizować bezpośrednio.2

<select>
  <button>
    <selectedcontent></selectedcontent>
  </button>
  <option value="everything">
    <img src="everything.svg" alt="">
    Everything
  </option>
  <!-- more categories -->
</select>

Element odzwierciedla dowolną bogatą treść należącą do wybranej opcji, jak SVG obok etykiety „Everything” w demie, dzięki czemu przycisk pokazuje wreszcie ten sam język wizualny co menu, które otwiera.12

Progresywne ulepszanie jest wbudowane

Ostatni krok w sesji to ten, który zespoły pomijają na własne ryzyko: sprawdzenie projektu w przeglądarkach, które nie obsługują customizable select. Odpowiedź jest nudna w najlepszym sensie. Wkracza progresywne ulepszanie, kontrolka pozostaje użyteczna, a klienci otrzymują natywne okienko.1 Ponowne wykorzystanie elementu select oznacza, że scenariusz awaryjny już istnieje, a ponieważ <select> jest elementem semantycznym, wbudowane funkcje dostępności przetrwają w każdej przeglądarce.1

Dostępność jest konkretna: Safari 27 i Chrome 135. Aby wypróbować te funkcje już teraz, należy pobrać Safari Technology Preview lub Safari Beta.1 Końcowe wskazówki sesji są praktyczne: sprawdź demo na webkit.org, ostyluj coś prostego na własnej stronie, przetestuj w przeglądarkach bez obsługi oraz z narzędziami wspomagającymi i przeczytaj materiały WebKit o dobrych praktykach, aby interfejs działał dla wszystkich.1

Najważniejsze wnioski

Dla programistów frontendu: - Włącz funkcję przez appearance: base-select na elemencie select dla przycisku, a następnie ponownie na ::picker(select) dla menu rozwijanego; potem ostyluj tło, obramowanie, padding, odstępy i box-shadow jak w każdym innym elemencie.1 - Wymień strzałkę za pomocą ::picker-icon, a znacznik za pomocą ::checkmark, oba przez content oraz width; ostyluj stan otwarcia za pomocą :open; wyróżnij wybór istniejącym już selektorem :checked.1 - Umieść prawdziwy HTML wewnątrz <option> (obrazy, filmy, emoji) i przebuduj menu istniejącym CSS, jak siatka grid-template plus gap; zastąp wbudowany przycisk elementem <button> będącym pierwszym dzieckiem, zawierającym <selectedcontent>.12

Dla zespołów dbających o dostępność: - Semantyczny select zachowuje nawigację klawiaturą i obsługę czytników ekranu bez zewnętrznych bibliotek, zarówno w przeglądarkach obsługiwanych, jak i nieobsługiwanych.1 - Gdy opcje niosą zarówno obraz, jak i etykietę tekstową, pozostaw tekst alternatywny obrazu pusty, aby czytniki ekranu nie odczytywały etykiety dwukrotnie.1 - Przetestuj w przeglądarkach pozbawionych obsługi oraz z narzędziami wspomagającymi przed wdrożeniem, zgodnie z listą kontrolną samej sesji.1

Dla liderów technicznych planujących wdrożenie: - Traktuj customizable select jako progresywne ulepszanie: Safari 27 i Chrome 135 dostają niestandardowy projekt, wszyscy pozostali dostają natywne okienko, a żaden awaryjny mechanizm JavaScript nie jest wymagany.1 - Oceń go już teraz w Safari Technology Preview lub Safari Beta i zważ go względem biblioteki menu rozwijanego, która obecnie zalega w twoim bundle.1

FAQ

Czym jest customizable select?

Customizable select to zestaw możliwości HTML i CSS, przedstawiony przez zespół Safari na WWDC 2026 i dostępny od Safari 27 oraz Chrome 135, który czyni istniejący już element <select> w pełni konfigurowalnym. Przycisk, menu rozwijane, strzałkę i znacznik wyboru stylizuje się za pomocą CSS, a wewnątrz opcji umieszcza się bogatą treść, zachowując przy tym wbudowaną dostępność elementu.1

Jak włączyć customizable select?

Należy zastosować appearance: base-select w dwóch miejscach: na samym elemencie select, co zastępuje natywne renderowanie przycisku mniejszym zestawem stylów bazowych, oraz na ::picker(select), co sprawia, że menu rozwijane rezygnuje z natywnego renderowania, dzięki czemu można je dowolnie stylizować.1

Czy mogę umieścić obrazy lub inny HTML wewnątrz elementów option?

Tak. Sesja stwierdza, że wewnątrz opcji można umieścić każdy rodzaj treści: obrazy, filmy, emoji. Demo używa SVG i etykiety tekstowej na opcję, z pustym tekstem alternatywnym obrazu, aby czytniki ekranu odczytywały etykietę tylko raz, i układa menu jako siatkę CSS przy użyciu grid-template oraz gap.1

Czym jest element selectedcontent?

<selectedcontent> to element, który wyświetla bogatą treść aktualnie wybranej opcji wewnątrz przycisku select. Customizable select dopuszcza <button> jako pierwsze dziecko <select>, czego wcześniej HTML nie pozwalał; umieszczenie <selectedcontent> w tym przycisku odzwierciedla treść wybranej opcji, na przykład SVG obok jej etykiety, a sam element można stylizować bezpośrednio.12

Co dzieje się w przeglądarkach, które nie obsługują customizable select?

Kontrolka degraduje się płynnie. Progresywne ulepszanie oznacza, że select pozostaje w pełni użyteczny, a klienci otrzymują natywne okienko, a ponieważ <select> jest elementem semantycznym, wbudowane funkcje dostępności pozostają. Sesja zaleca testowanie w przeglądarkach bez obsługi oraz z narzędziami wspomagającymi przed wdrożeniem.1


Customizable select usuwa zależność w taki sam sposób, w jaki CSS Grid Lanes robi to dla układów typu masonry, a to zestawienie jest celowe: sama sesja 315 kończy się skierowaniem widzów do sesji Grid Lanes, a strona demonstracyjna używa obu funkcji razem.1 Apple wciąż rozszerza to, co potrafią zwykłe elementy HTML, tą samą drogą, którą omówiono w elemencie model w HTML na platformach Apple, a każda biblioteka menu rozwijanego, której już nie dostarczasz, wzmacnia argumentację manifestu no-build. Pełny węzeł serii to seria Apple Ecosystem.

References


  1. Apple, WWDC 2026 session 315, Rediscover the HTML select element. Source for the before-state (heavy JavaScript libraries or lots of div elements); availability starting in Safari 27 and Chrome 135, with Safari Technology Preview and Safari Beta for early access; appearance: base-select applied on the select and on ::picker(select); the ::picker-icon and ::checkmark selectors styled via content and width; the :open pseudo-class; the pre-existing :checked selector for emphasizing the selection; arbitrary HTML inside options (images, videos, emojis) with the SVG-plus-label demo and the empty-alt screen-reader detail; the grid layout inside the drop-down via grid-template and gap; the first-child <button> replacing the built-in button (previously not allowed in HTML); the radial color picker demo; the “pull down buttons on Apple platforms” naming; and the progressive-enhancement fallback to the native pop-up. 

  2. WebKit, News from WWDC26: WebKit in Safari 27 beta. Source for the name of the <selectedcontent> element, its placement inside the select’s first-child <button>, and its behavior of displaying the currently selected option’s content while being directly stylable. 

Powiązane artykuły

CSS Grid Lanes: natywny układ masonry w Safari

CSS Grid Lanes wnosi natywny układ masonry do Safari 26.4 w trzech liniach CSS, a regulator `flow-tolerance` rozwiązuje …

8 min czytania

Element HTML <model> trafia do każdego systemu operacyjnego Apple

Element HTML model renderuje teraz gotowe do użycia treści 3D w Safari na iOS, iPadOS i macOS, z obsługą stagemode, enti…

8 min czytania

Manifest bez bundlera: produkcja bez narzędzi budowania

FastAPI + HTMX + czysty CSS bez żadnych narzędzi budowania i perfekcyjne wyniki Lighthouse. Prawdziwe dane produkcyjne, …

8 min czytania