The select
is a component that provides a list of options for the user to select from.
There is a standard select html control, <select>
and <option>
, but it doesn't support the full level of detail, styling, etc. that most design systems need or require. For context please see MDN Docs.
- A customer using the component on a web page.
On a web page a customer is shopping for a new shirt in size medium. The customer opens the size
<fast-select>
and sees a list of options and selects size medium.
- Form association: The
select
is form-associated, allowing its selected value to be submitted with a form. - Opened and closed states: The
select
provides an expandable listbox can be displayed by clicking on the element, or using keyboard navigation. - When the
select
does not have enough screen real estate to open below the control, it will open above. - Single and multiple selection mode: Users can choose one or multiple options when the
multiple
attribute is present. (Note: While our implementation currently only supports single selection mode, multiple selection mode is being tracked in issue #4190.) - Keyboard navigation and type-ahead: When the
select
is focused, keyboard navigation with the arrow keys will cycle through the available options. Type-ahead is also supported. See Keyboard Interaction for more details.
Extends listbox
and form associated custom element.
Component Name:
fast-select
Attributes:
autofocus
- Automatically focuses the control on pageload.disabled
- Disables the control.multiple
- Allows the user to select more than one option.name
- Name of the control.open
- Indicates whether the listbox is displayed.required
- Boolean value that sets the field as requiredsize
- Indicates the height of the listbox based on the amount
Properties:
options
- An array of all options.selectedOptions
- An array of the selected options.selectedIndex
- The index of the first selected option, or-1
if nothing is selected. Setting theselectedIndex
property will update theselected
state of the option at the new index. Out of range values will reset theselectedIndex
to-1
.value
- Reflects the value of the first selected option. Setting thevalue
property will update theselected
state of the first option that matches the value. If no option with a matchingvalue
is present, thevalue
will reset to a blank string.
Events:
Event | description | bubbles | composed |
---|---|---|---|
input |
emits when the value is changed via user interaction. |
yes | yes |
change |
emits when the value is changed via user interaction. |
yes | no |
Slots:
- default - the list of options, either
<fast-option>
or elements withrole="option"
. start
- used to display content like glyphs or icons inside the button, before the control.button-container
- contains the selected value and indicator slots inside the control element.selected-value
- displays the currently selected value text. This slot is only available if thebutton-container
slot is not filled.indicator
- holds the glyph indicating that the select can be expanded. This slot is only available if thebutton-container
slot is not filled.
content
- the content of the buttonend
- often times a glyph, icon, or button follows the content
Parts:
control
- the container that holds the button content and its slots.indicator
- the container that holds theindicator
slot.selected-value
- the container that holds the displayed text for the button.start
- the container that holds thestart
slot.
Structure:
<template>
<div part="control" role="button">
<span part="start">
<slot name="start"></slot>
</span>
<slot name="button-container">
<div part="selected-value">
<slot name="selected-value"></slot>
</div>
<div part="indicator">
<slot name="indicator">
<svg part="select-indicator"></svg>
</slot>
</div>
</slot>
<span part="end">
<slot name="end"></slot>
</span>
</div>
<div part="listbox" role="listbox">
<slot></slot>
</div>
</template>
With fast-option
elements:
<fast-select>
<fast-option value="option-1">Option 1</fast-option>
<fast-option value="option-2">Option 2</fast-option>
<fast-option value="option-3">Option 3</fast-option>
</fast-select>
With compatible option
-like elements:
<fast-select>
<option value="option-1">Option 1</option>
<div role="option">Option 2</div>
</fast-select>
Note: While <fast-option>
, <option>
, and elements with a role="option"
will all function, <fast-option>
has built-in accessibility and form association support when used with a <fast-select>
. See Listbox Option for more information.
open
- This state is applied to the<fast-select>
when the listbox is visible to the user.required
- An option in the<fast-select>
with a value must beselected
when therequired
attribute is set totrue
.valid
- The<fast-select>
meets all its validation constraints, and is therefore considered to be valid.invalid
- The<fast-select>
does not meet its validation constraints, and is therefore considered to be invalid.disabled
- when disabled, the value will not be changeable through user interaction.
Select is RTL compliant and supports the following aria best practices for listbox W3C aria-practices.
While testing is still TBD for our web components, I would expect this to align with the testing strategy and not require any additional test support.