Native <select> (the preferred answer), styling natively, custom role="listbox"for rich options, and the searchable combobox pattern — Vanilla & React.
WCAG: 1.3.1 · 2.1.1 · 4.1.2
Level: Intermediate → Advanced
Icons: lucide-react (ChevronDown, Check)
1
What we are building
Native first. Custom only when native truly can't deliver.
What we are building
The native <select> gives you keyboard, mobile wheel pickers, type-ahead search, voice-control labels, autofill, and perfect SR support — for free. 90% of the time that is the right answer. Reach for a custom listbox or combobox only when native cannot do what you need (rich option content with descriptions / icons, or type-ahead filtering).
2
The 4 real-world variants
Switch between the inaccessible version and the accessible fix.
The 4 real-world variants
Variant A
Native <select>
Preferred
Live example
Native: full keyboard, mobile wheel picker, autofill, type-ahead search — all for free.