Menu select i pola wyboru
Stylować natywne listy rozwijane select i pola wyboru oraz używać pluginu @tailwindcss/forms do ujednolicania wyglądu formularzy w różnych przeglądarkach.
Menu select i pola wyboru to bezpłatna lekcja Tailwind CSS Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Tailwind CSS Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Tailwind CSS Academy zawiera 4 lekcji w sumie.
Wyzwanie związane z natywnymi kontrolkami formularzy
Natywne elementy <select>, <checkbox> i <radio> słyną z trudności w uzyskaniu spójnego wyglądu w różnych przeglądarkach. Domyślnie dziedziczą wygląd systemu operacyjnego za pomocą właściwości CSS appearance, którą Tailwind resetuje klasą użytkową appearance-none.
Po usunięciu natywnego wyglądu odzyskują Państwo pełną kontrolę nad stylami. Wtyczka @tailwindcss/forms automatyzuje ten reset dla wszystkich elementów formularzy, zapewniając czystą bazę zgodną z różnymi przeglądarkami bez konieczności ręcznego dodawania appearance-none w każdym miejscu.
<!-- Without plugin: manual appearance reset needed -->
<select class="appearance-none w-full px-3 py-2 border border-gray-300 rounded-lg">
<option>Option A</option>
</select>
<!-- With @tailwindcss/forms plugin: already normalized -->
<select class="w-full px-3 py-2 border border-gray-300 rounded-lg">
<option>Option A</option>
</select>Stylizacja listy wyboru
Wystylizowana lista wyboru używa tych samych klas bazowych co pole tekstowe: w-full px-3 py-2 text-sm border border-gray-300 rounded-lg bg-white. Dodaj niestandardową strzałkę listy wyboru, pozycjonując obraz SVG w tle lub nakładając ikonę SVG pozycjonowaną absolutnie.
Stan fokusu korzysta ze znanego zestawu focus:outline-none focus:ring-2 focus:ring-blue-500. Dodaj cursor-pointer, aby kursor myszy informował, że kliknięcie otworzy menu.
<div class="relative">
<select
class="w-full appearance-none px-3 py-2 text-sm text-gray-900 bg-white
border border-gray-300 rounded-lg cursor-pointer
focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent">
<option value="">Select a country</option>
<option value="us">United States</option>
<option value="uk">United Kingdom</option>
<option value="de">Germany</option>
</select>
<!-- Custom dropdown arrow -->
<div class="pointer-events-none absolute inset-y-0 right-3 flex items-center">
<svg class="w-4 h-4 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
</svg>
</div>
</div>Instalacja wtyczki Forms
Wtyczka @tailwindcss/forms zapewnia opiniotwórczy reset dla wszystkich natywnych elementów formularzy. Zainstaluj ją za pomocą npm install -D @tailwindcss/forms i dodaj do tablicy plugins w pliku tailwind.config.js.
Po instalacji wszystkie pola wejściowe, listy wyboru, obszary tekstowe, pola wyboru i przyciski opcji otrzymają spójny styl bazowy. Następnie można nakładać na nie klasy użytkowe Tailwind bez konieczności walki z domyślnymi stylami przeglądarki. Użyj require('@tailwindcss/forms')({ strategy: 'class' }), jeśli wolisz, aby wtyczka działała tylko po dodaniu określonej klasy.
// tailwind.config.js
module.exports = {
content: ['./src/**/*.{html,js}'],
theme: {
extend: {},
},
plugins: [
require('@tailwindcss/forms'),
// Or with class strategy:
// require('@tailwindcss/forms')({ strategy: 'class' }),
],
}Stylizacja pól wyboru
Za pomocą wtyczki forms pola wyboru są już znormalizowane. Następnie można dostosować ich rozmiar, kolor i zaokrąglenie za pomocą utilities. Użyj w-4 h-4 rounded text-blue-600 border-gray-300 — klasa text-blue-600 na polu wyboru ustawia kolor wypełnienia znacznika wyboru.
Połącz pole wyboru z etykietą za pomocą flex items-center gap-2, aby zachować ich wyrównanie w poziomie. Tekst etykiety używa text-sm font-medium text-gray-700.
<div class="flex items-center gap-2">
<input
id="terms"
type="checkbox"
class="w-4 h-4 rounded text-blue-600 border-gray-300
focus:ring-blue-500 focus:ring-2 cursor-pointer"
/>
<label for="terms" class="text-sm font-medium text-gray-700 cursor-pointer">
I agree to the <a href="/terms" class="text-blue-600 hover:underline">Terms of Service</a>
</label>
</div>Lista pól wyboru do zaznaczania wielu opcji
Lista pól wyboru pozwala użytkownikom zaznaczyć wiele opcji. Ułóż wiele elementów pól wyboru jeden pod drugim, dodając space-y-3 do kontenera. Umieść je w elemencie <fieldset> z elementem <legend>, aby zapewnić dostępność.
Element legend identyfikuje całą grupę dla czytników ekranu, a poszczególne etykiety są powiązane z właściwymi polami wyboru za pomocą atrybutów for/id.
<fieldset>
<legend class="text-sm font-semibold text-gray-900 mb-3">Notification preferences</legend>
<div class="space-y-3">
<div class="flex items-center gap-2">
<input id="email-notif" type="checkbox" checked class="w-4 h-4 rounded text-blue-600 border-gray-300 focus:ring-blue-500" />
<label for="email-notif" class="text-sm text-gray-700">Email notifications</label>
</div>
<div class="flex items-center gap-2">
<input id="push-notif" type="checkbox" class="w-4 h-4 rounded text-blue-600 border-gray-300 focus:ring-blue-500" />
<label for="push-notif" class="text-sm text-gray-700">Push notifications</label>
</div>
<div class="flex items-center gap-2">
<input id="sms-notif" type="checkbox" class="w-4 h-4 rounded text-blue-600 border-gray-300 focus:ring-blue-500" />
<label for="sms-notif" class="text-sm text-gray-700">SMS notifications</label>
</div>
</div>
</fieldset>Stylowanie przycisków radiowych
Przyciski radiowe styluje się tak samo jak pola wyboru, ale zamiast rounded używa się rounded-full, aby zachować okrągły wygląd kojarzony przez użytkowników z wyborem jednej opcji. Sposób z text-blue-600 działa tutaj również i ustawia kolor wypełnienia.
Wszystkie przyciski radiowe w tej samej grupie muszą mieć ten sam atrybut name, aby przeglądarka wymuszała możliwość zaznaczenia tylko jednej opcji.
<fieldset>
<legend class="text-sm font-semibold text-gray-900 mb-3">Plan</legend>
<div class="space-y-2">
<div class="flex items-center gap-2">
<input id="plan-starter" type="radio" name="plan" value="starter"
class="w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500" />
<label for="plan-starter" class="text-sm text-gray-700">Starter — Free</label>
</div>
<div class="flex items-center gap-2">
<input id="plan-pro" type="radio" name="plan" value="pro" checked
class="w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500" />
<label for="plan-pro" class="text-sm text-gray-700">Pro — $29/mo</label>
</div>
<div class="flex items-center gap-2">
<input id="plan-enterprise" type="radio" name="plan" value="enterprise"
class="w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500" />
<label for="plan-enterprise" class="text-sm text-gray-700">Enterprise — Custom</label>
</div>
</div>
</fieldset>Grupa przycisków radiowych w stylu kart
Grupa przycisków radiowych w stylu kart umieszcza każdą opcję w klikalnej karcie zamiast wyświetlać sam przycisk radiowy. Ukryj wizualnie pole input, ale zachowaj jego dostępność, a następnie użyj utility peer, aby stylować kartę na podstawie stanu zaznaczenia pola.
peer-checked:border-blue-600 peer-checked:ring-2 peer-checked:ring-blue-600 na sąsiadującej karcie etykiety tworzy wyróżniony stan zaznaczenia bez konieczności używania JavaScriptu.
<div class="grid grid-cols-3 gap-3">
<label class="cursor-pointer">
<input type="radio" name="tier" value="starter" class="sr-only peer" />
<div class="border-2 border-gray-200 rounded-lg p-4 text-center
peer-checked:border-blue-600 peer-checked:ring-2 peer-checked:ring-blue-600
hover:border-gray-300 transition-colors">
<p class="font-semibold text-gray-900">Starter</p>
<p class="text-sm text-gray-500">Free</p>
</div>
</label>
<label class="cursor-pointer">
<input type="radio" name="tier" value="pro" class="sr-only peer" checked />
<div class="border-2 border-gray-200 rounded-lg p-4 text-center
peer-checked:border-blue-600 peer-checked:ring-2 peer-checked:ring-blue-600
hover:border-gray-300 transition-colors">
<p class="font-semibold text-gray-900">Pro</p>
<p class="text-sm text-gray-500">$29/mo</p>
</div>
</label>
</div>Komponent przełącznika
Przełącznik to stylizowane pole wyboru, które wygląda jak przesuwny przełącznik włączania i wyłączania. Zbuduj go za pomocą <input type='checkbox'> z klasą sr-only oraz sąsiadującego elementu <div>, który używa utilities peer-checked do animacji.
Ścieżka przełącznika używa w-11 h-6 bg-gray-200 rounded-full, a jego suwak — absolutnie pozycjonowanego elementu w-4 h-4 bg-white rounded-full shadow. Utility peer-checked:translate-x-5 przesuwa suwak w prawo po zaznaczeniu pola.
<label class="flex items-center gap-3 cursor-pointer">
<div class="relative">
<input type="checkbox" class="sr-only peer" />
<div class="w-11 h-6 bg-gray-200 rounded-full transition-colors duration-200
peer-checked:bg-blue-600"></div>
<div class="absolute top-1 left-1 w-4 h-4 bg-white rounded-full shadow
transition-transform duration-200 peer-checked:translate-x-5"></div>
</div>
<span class="text-sm font-medium text-gray-700">Enable notifications</span>
</label>Niestandardowa lista wyboru z wyszukiwaniem
Natywny element <select> nie obsługuje wyszukiwania. W przypadku rozwijanych list z wyszukiwaniem użyj niestandardowego połączenia pola input i listy. Wyświetl pole tekstowe, w którym użytkownik wpisuje tekst, a następnie za pomocą JavaScriptu filtruj widoczny element <ul> znajdujący się poniżej.
Ostyluj rozwijaną listę za pomocą absolute top-full left-0 right-0 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg max-h-48 overflow-y-auto z-10, aby prawidłowo umieścić ją pod polem input.
<div class="relative">
<input
type="text"
placeholder="Search country..."
class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg
focus:outline-none focus:ring-2 focus:ring-blue-500"
/>
<ul class="absolute top-full left-0 right-0 mt-1 bg-white border border-gray-200
rounded-lg shadow-lg max-h-48 overflow-y-auto z-10">
<li class="px-3 py-2 text-sm text-gray-700 hover:bg-blue-50 cursor-pointer">Germany</li>
<li class="px-3 py-2 text-sm text-gray-700 hover:bg-blue-50 cursor-pointer">France</li>
<li class="px-3 py-2 text-sm text-blue-600 font-medium bg-blue-50 cursor-pointer">United Kingdom</li>
<li class="px-3 py-2 text-sm text-gray-700 hover:bg-blue-50 cursor-pointer">United States</li>
</ul>
</div>Wyłączone pole wyboru i lista wyboru
Wyłączone pola wyboru i listy wyboru używają wariantu disabled:. W przypadku pól wyboru disabled:opacity-50 disabled:cursor-not-allowed przyciemnia element. W przypadku list wyboru połącz te klasy z disabled:bg-gray-50, aby zachować wzorzec wyłączonego pola tekstowego.
Zawsze dodawaj atrybut HTML disabled — warianty Tailwind disabled: aktywują się tylko wtedy, gdy ten atrybut znajduje się na elemencie.
<!-- Disabled checkbox -->
<div class="flex items-center gap-2">
<input
type="checkbox"
disabled
class="w-4 h-4 rounded border-gray-300 disabled:opacity-50 disabled:cursor-not-allowed"
/>
<label class="text-sm text-gray-400">Unavailable option</label>
</div>
<!-- Disabled select -->
<select
disabled
class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg
disabled:bg-gray-50 disabled:text-gray-400 disabled:cursor-not-allowed">
<option>Disabled option</option>
</select>Stylowanie pola zakresu
Element <input type='range'> tworzy suwak. Za pomocą wtyczki forms możesz stylować ścieżkę i uchwyt suwaka przez accent-blue-600 — właściwość CSS, która za pomocą jednego utility ustawia kolor natywnych kontrolek, takich jak suwaki zakresu, paski postępu i pola wyboru.
accent-blue-600 to najprostszy sposób na nadanie natywnym suwakom kolorystyki marki bez całkowitego zastępowania ich niestandardowymi komponentami.
<div class="flex flex-col gap-1">
<label for="volume" class="text-sm font-medium text-gray-700">Volume: <span id="vol">50</span>%</label>
<input
id="volume"
type="range"
min="0"
max="100"
value="50"
oninput="document.getElementById('vol').textContent = this.value"
class="w-full h-2 accent-blue-600 cursor-pointer"
/>
</div>Szybki test
Sprawdź, jak dobrze rozumiesz zagadnienia z Tailwind CSS Mastery omówione w tej lekcji.
Podsumowanie lekcji
W tej lekcji nauczyłeś się, że: wtyczka @tailwindcss/forms normalizuje natywne elementy formularzy w różnych przeglądarkach, zapewniając spójną bazę do stylowania; pola wyboru i przyciski radiowe używają text-blue-600 do ustawiania koloru wypełnienia oraz focus:ring-blue-500 do tworzenia obramowań fokusu; a utility peer umożliwia tworzenie grup przycisków radiowych w stylu kart i przełączników reagujących na stan zaznaczenia bez użycia JavaScriptu. W następnej części zajmiemy się wzorcami układu formularzy.
Ucz się HTML dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 30
- Lekcje
- 120
Często zadawane pytania
Czy lekcja „Menu select i pola wyboru” jest bezpłatna?
Tak — pełny tekst „Menu select i pola wyboru” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Tailwind CSS Academy, przejdź na CoddyKit PRO. Kurs Tailwind CSS Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Menu select i pola wyboru”?
Stylować natywne listy rozwijane select i pola wyboru oraz używać pluginu @tailwindcss/forms do ujednolicania wyglądu formularzy w różnych przeglądarkach. Ćwiczysz Tailwind CSS Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Tailwind CSS Academy?
Nie wymagamy żadnego doświadczenia. Tailwind CSS Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Menu select i pola wyboru”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Tailwind CSS Academy?
Tak. Każda lekcja Tailwind CSS Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Stylowanie pól tekstowych i textarea
- Menu select i pola wyboru
- Wzorce układów formularzy
- Walidacja i stany błędów