Select
Native select dropdown component with multiple sizes and width variants. Pure CSS-only, works without JavaScript.
Example
<label for="country">Country</label>
<select id="country" class="omni-select" data-size="md" data-width="md">
<option value="">Choose a country...</option>
<option value="us">United States</option>
<option value="ca">Canada</option>
<option value="uk">United Kingdom</option>
</select>
Sizes
Use data-size to adjust select dimensions:
<select class="omni-select" data-size="sm" data-width="md">...</select>
<select class="omni-select" data-size="md" data-width="md">...</select>
<select class="omni-select" data-size="lg" data-width="md">...</select>
Widths
Use data-width to control select width:
<select class="omni-select" data-size="md" data-width="sm">...</select>
<select class="omni-select" data-size="md" data-width="md">...</select>
<select class="omni-select" data-size="md" data-width="lg">...</select>
<select class="omni-select" data-size="md" data-width="full">...</select>
States
Disabled
Use the disabled attribute to prevent interaction:
<select class="omni-select" data-size="md" disabled>
<option value="">Cannot select...</option>
<option value="1">Option 1</option>
</select>
Required
Use the required attribute with aria-required="true":
<label for="role">
Role <span aria-hidden="true">*</span>
</label>
<select id="role" class="omni-select" required aria-required="true">
<option value="">Choose a role...</option>
<option value="admin">Administrator</option>
</select>
Error State
Use aria-invalid="true" and aria-describedby for error handling:
Please select a country
<label for="country">Country</label>
<select id="country" class="omni-select"
aria-invalid="true" aria-describedby="country-error">
<option value="">Choose a country...</option>
</select>
<span id="country-error" role="alert">Please select a country</span>
Multiple Selection
Use the multiple attribute for multi-select. The dropdown arrow is automatically removed:
<label for="fruits">Select multiple items</label>
<select id="fruits" class="omni-select" data-size="md" data-width="md" multiple>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
Option Groups
Organize options into groups using <optgroup>:
<select class="omni-select" data-size="md" data-width="md">
<option value="">Choose a location...</option>
<optgroup label="North America">
<option value="us">United States</option>
<option value="ca">Canada</option>
</optgroup>
<optgroup label="Europe">
<option value="uk">United Kingdom</option>
<option value="de">Germany</option>
</optgroup>
</select>
API Reference
| Attribute | Values | Default | Description |
|---|---|---|---|
data-size |
sm, md, lg | md | Select height and padding |
data-width |
sm (150px), md (250px), lg (350px), full (100%) | 200px | Select width |
disabled |
— | — | Disables interaction |
required |
— | — | Makes selection required |
multiple |
— | — | Allows multiple selections |
aria-invalid |
true, false | false | Indicates validation error |
aria-required |
true, false | false | Indicates required field for AT |
aria-describedby |
ID reference | — | Associates error/help text |
Accessibility
- Always associate selects with labels using
forandidattributes - Use
aria-required="true"in addition torequiredfor screen readers - Use
aria-invalid="true"andaria-describedbyfor error states - Error messages should have
role="alert"for immediate feedback - Full keyboard navigation support (Tab, Arrow keys, Enter, Escape)
- Focus visible indicators with semantic color-matched rings
- Visual required indicators (asterisks) should have
aria-hidden="true" - Native browser select provides built-in keyboard and screen reader support
- Optgroups provide semantic grouping for assistive technologies
Best Practices
- Always provide a default/placeholder option (e.g., "Choose...")
- Use
data-width="full"in forms for consistent alignment - Keep option text concise for better mobile experience
- Use optgroups for more than 10-15 options to improve scanability
- Consider using a searchable dropdown for 20+ options
- Don't rely solely on placeholder text to convey important information
- Match select size with surrounding form elements for visual consistency