Interfejs Customizable Select API umożliwia deklaratywne, oparte na CSS stylizowanie elementów <select>, aby idealnie pasowały do systemu projektowania Twojej marki. Po włączeniu appearance: base-select uzyskasz dostęp do wewnętrznego shadow DOM elementu select, co pozwoli Ci stylizować przycisk, listę wyboru opcji, ikonę strzałki i znacznik wyboru za pomocą standardowych właściwości CSS.
Wcześniej, aby uzyskać w pełni dostosowany element select, trzeba było od podstaw utworzyć element sterujący za pomocą JavaScriptu, co często powodowało problemy z ułatwieniami dostępu, nawigacją za pomocą klawiatury i integracją z formularzami natywnymi. Dzięki appearance: base-select możesz uzyskać niestandardowy wygląd, podczas gdy przeglądarka zajmuje się zarządzaniem zaznaczeniem, renderowaniem górnej warstwy i powiązaniami ułatwień dostępu.
Jak to zrobić?
Aby wdrożyć stylizację wyboru marki:
- Akceptacja dostosowywania: zastosuj
appearance: base-selectzarówno do elementu<select>, jak i pseudoelementu::picker(select)(który jest kierowany na listę opcji). - Struktura przycisku niestandardowego (opcjonalnie): zdefiniuj element
<button>bezpośrednio w elemencie<select>, aby zastąpić domyślny aktywator. Użyj elementu<selectedcontent>wewnątrz tego przycisku, aby reprezentować tekst lub zawartość aktualnie wybranej opcji. - Stylizacja listy wyboru: użyj pseudoelementu
::picker(select), aby zastosować typografię, kolory tła, obramowania i cienie do listy rozwijanej. Przeglądarka renderuje go w górnej warstwie, dzięki czemu konfliktyz-indexnależą do przeszłości. - Style ikon wewnętrznych:
- Użyj
select::picker-icon, aby zmienić styl ikony strzałki lub ją zastąpić. - Użyj
option::checkmark, aby określić styl znacznika wyboru obok aktywnej opcji.
- Użyj
- Opcje stylu: zastosuj style do elementów
<option>, aby określić stany najechania kursorem, dopełnienie i układ.
Przykładowy kod: wybór kuriera markowego
Poniższy przykład pokazuje niestandardowe pole wyboru ze stylem czcionki o stałej szerokości znaków i przerywanymi obramowaniami, które pasują do estetyki marki „parcel”.
/* Enable customization for the select and its picker */
.brand-select,
.brand-select::picker(select) {
appearance: base-select;
}
/* Style the visible trigger button */
.brand-select {
font-family: 'Courier New', monospace;
background-color: #fffaf0;
color: #8b4513;
border: 2px dashed #8b4513;
border-radius: 4px;
padding: 0.75rem;
font-size: 1rem;
cursor: pointer;
}
/* Style the dropdown options list */
.brand-select::picker(select) {
font-family: 'Courier New', monospace;
background-color: #fffaf0;
border: 2px dashed #8b4513;
border-radius: 4px;
padding: 0.5rem;
}
/* Customize internal part colors to match text */
.brand-select::picker-icon {
color: #8b4513;
}
.brand-select option::checkmark {
color: #8b4513;
}
/* Style individual options and hover effects */
.brand-select option {
padding: 0.5rem;
border-radius: 4px;
color: #8b4513;
cursor: pointer;
}
.brand-select option:hover {
background-color: #fdf5e6;
}
<label for="preferences">Select shipping preference</label>
<select class="brand-select" id="preferences" name="preferences">
<button>
<selectedcontent></selectedcontent>
</button>
<option value="standard">Standard Shipping</option>
<option value="express" selected>Express Shipping</option>
<option value="overnight">Overnight Delivery</option>
</select>
Strategiczne wdrażanie i sprawdzone metody
- UŻYWAJ elementu
appearance: base-select, gdy system projektowania wymaga wysokiej jakości i spójności wizualnej wszystkich elementów sterujących formularza, której nie można osiągnąć za pomocą standardowych zastąpień wyboru w różnych przeglądarkach. - NIE używaj tego, jeśli korzystasz z natywnego selektora systemu operacyjnego (np. standardowego selektora kółka przewijania na urządzeniach z iOS). Włączenie
base-selectpowoduje wyłączenie natywnych elementów sterujących interfejsu mobilnego na rzecz menu najwyższego poziomu renderowanych w internecie. - DO verify that color contrast meets WCAG standards. Selektor z możliwością dostosowania umożliwia ustawianie kolorów ad hoc, ale to Ty odpowiadasz za to, aby tekst był czytelny na niestandardowym tle.
- Przetestuj działanie układu. Ustawienie
appearance: base-selectusuwa domyślne działanie przeglądarki polegające na określaniu rozmiaru elementu select na podstawie szerokości najdłuższej opcji. Aby zapobiec przesunięciom układu, może być konieczne ustawienie stałej szerokości lub użycie ograniczeń flex/grid. - Upewnij się, że element
<select>ma atrybutnamei powiązany element<label>. Dzięki temu nawet w przypadku niestandardowego interfejsu komponent pozostaje dostępny dla czytników ekranu i działa prawidłowo ze standardowymi formularzami. - Użyj standardowych atrybutów
valuew opcjach, aby przesyłanie formularzy działało dokładnie tak jak wcześniej.
Strategie zastępcze
Kreacje zastępcze i obsługa przez przeglądarki w przypadku formatu <select> z możliwością dostosowania
W przypadku przeglądarek, które nie obsługują jeszcze appearance: base-select, element <select> jest zastępowany standardowym menu rozwijanym systemu operacyjnego.
- Ignorowanie treści nietekstowych: starsze przeglądarki usuwają tagi HTML (takie jak
<svg>lub<div>) wewnątrz tagów<option>i renderują tylko węzły tekstowe. Upewnij się, że treść tekstowa elementu<option>jest czytelna i ma sens sama w sobie. - Obsługa struktury HTML: standardowe parsery mogą ignorować tagi
<button>i<selectedcontent>wewnątrz tagu<select>lub traktować je jako nieprawidłowe. Jeśli standardowy tekst jest dla Ciebie czytelną opcją zastępczą, do progresywnego ulepszania nie są wymagane żadne obciążające skrypty polyfill JavaScript.
document.addEventListener("DOMContentLoaded", () => {
// Check if browser supports base-select value
if (!CSS.supports("appearance", "base-select")) {
// Custom select overrides are not supported natively.
}
});