Slider
| install | yarn add @react-spectrum/slider |
|---|---|
| version | 3.0.0-alpha.0 |
| usage | import {Slider} from '@react-spectrum/slider' |
Example#
<Slider label="Cookies to buy" defaultValue=12 /><Slider label="Cookies to buy" defaultValue=12 /><Slider
label="Cookies to buy"
defaultValue=12
/>Value#
Sliders are controlled with the value and defaultValue props which must fall between
the minimum and maximum values which default of 0 and 100, respectively.
function Example() {
let [value setValue] = ReactuseState(25);
return (
<Flex gap="size-150">
<Slider label="Cookies to buy (Uncontrolled)" defaultValue=25 />
<Slider
label="Cookies to buy (Controlled)"
value=value
onChange=setValue
/>
</Flex>
);
}
function Example() {
let [value setValue] = ReactuseState(25);
return (
<Flex gap="size-150">
<Slider
label="Cookies to buy (Uncontrolled)"
defaultValue=25
/>
<Slider
label="Cookies to buy (Controlled)"
value=value
onChange=setValue
/>
</Flex>
);
}
function Example() {
let [
value
setValue
] = ReactuseState(25);
return (
<Flex gap="size-150">
<Slider
label="Cookies to buy (Uncontrolled)"
defaultValue=25
/>
<Slider
label="Cookies to buy (Controlled)"
value=value
onChange=
setValue
/>
</Flex>
);
}
Alternatively, a different scale can be used by setting the minValue and maxValue props.
<Slider
label="Cookies to buy"
minValue=50
maxValue=150
defaultValue=100
/><Slider
label="Cookies to buy"
minValue=50
maxValue=150
defaultValue=100
/><Slider
label="Cookies to buy"
minValue=50
maxValue=150
defaultValue=100
/>Values are formatted as plainly by default, but this can be modified by using the formatOptions prop to specify a different format.
formatOptions is compatible with the option parameter of Intl.NumberFormat and is applied based on the current locale.
<Slider
label="Currency"
formatOptions={style: 'currency' currency: 'JPY'}
defaultValue=60
/><Slider
label="Currency"
formatOptions={style: 'currency' currency: 'JPY'}
defaultValue=60
/><Slider
label="Currency"
formatOptions={
style: 'currency'
currency: 'JPY'
}
defaultValue=60
/>Accessibility#
Depending on the visualization being used (i.e. depending on the showValueLabel prop), a label, aria-label, or aria-labelledby prop is required.
Internationalization#
To internationalize a Slider, a localized string should be passed to the label prop, aria-label prop, or value of the associated aria-labelledby element.
For languages that are read right-to-left (e.g. Hebrew and Arabic), the layout of the slider is automatically flipped. In addition, Slider automatically uses the current locale to format the value label.
Labeling#
Value labels are shown above the Slider by default, but they can also be moved to the side or hidden as needed. The label text should be in sentence case.
<Flex direction="column" maxWidth="size-3000" gap="size-300">
<Slider label="Cookies to buy" defaultValue=25 />
<Slider label="Donuts to buy" labelPosition="side" defaultValue=25 />
<Slider label="Pastries to buy" showValueLabel=false defaultValue=25 />
</Flex><Flex
direction="column"
maxWidth="size-3000"
gap="size-300">
<Slider label="Cookies to buy" defaultValue=25 />
<Slider
label="Donuts to buy"
labelPosition="side"
defaultValue=25
/>
<Slider
label="Pastries to buy"
showValueLabel=false
defaultValue=25
/>
</Flex><Flex
direction="column"
maxWidth="size-3000"
gap="size-300">
<Slider
label="Cookies to buy"
defaultValue=25
/>
<Slider
label="Donuts to buy"
labelPosition="side"
defaultValue=25
/>
<Slider
label="Pastries to buy"
showValueLabel=
false
defaultValue=25
/>
</Flex>The value label can be updated via the valueLabel prop in cases where showing a different scale makes sense. The valueLabel
should be appropriately translated.
function Example() {
let [value setValue] = ReactuseState(25);
return (
<Slider
label="Cookies to buy"
marginBottom="size-300"
value=value
onChange=setValue
valueLabel=` of 100`
/>
);
}
function Example() {
let [value setValue] = ReactuseState(25);
return (
<Slider
label="Cookies to buy"
marginBottom="size-300"
value=value
onChange=setValue
valueLabel=` of 100`
/>
);
}
function Example() {
let [
value
setValue
] = ReactuseState(25);
return (
<Slider
label="Cookies to buy"
marginBottom="size-300"
value=value
onChange=setValue
valueLabel=` of 100`
/>
);
}
By default, the value label is formatted as a plain number. This can be customized using the following props.
showValueLabel: Allows you to display or hide the value label.formatOptions: Allows you to customize the format of the value.valueLabel: Allows you to customize the value label to any string.
<Flex direction="column" maxWidth="size-3000" gap="size-300">
<Slider label="Cookies to buy" showValueLabel=false defaultValue=90 />
<Slider
label="Donuts to buy"
maxValue=60
valueLabel="54 of 60 Donuts"
defaultValue=54
/>
<Slider
label="Percent donus eaten"
maxValue=1
formatOptions={style: 'percent' minimumFractionDigits: 2}
defaultValue=0.8912
/>
</Flex><Flex
direction="column"
maxWidth="size-3000"
gap="size-300">
<Slider
label="Cookies to buy"
showValueLabel=false
defaultValue=90
/>
<Slider
label="Donuts to buy"
maxValue=60
valueLabel="54 of 60 Donuts"
defaultValue=54
/>
<Slider
label="Percent donus eaten"
maxValue=1
formatOptions={
style: 'percent'
minimumFractionDigits: 2
}
defaultValue=0.8912
/>
</Flex><Flex
direction="column"
maxWidth="size-3000"
gap="size-300">
<Slider
label="Cookies to buy"
showValueLabel=
false
defaultValue=90
/>
<Slider
label="Donuts to buy"
maxValue=60
valueLabel="54 of 60 Donuts"
defaultValue=54
/>
<Slider
label="Percent donus eaten"
maxValue=1
formatOptions={
style: 'percent'
minimumFractionDigits: 2
}
defaultValue=
0.8912
/>
</Flex>Props#
| Name | Type | Default | Description |
isFilled | boolean | — | Whether a fill color is shown between the start of the slider and the current value. |
fillOffset | number | — | The offset from which to start the fill. |
trackGradient | string[] | — | The background of the track, specified as the stops for a CSS background: linear-gradient(to right/left, ...trackGradient). |
labelPosition | LabelPosition | — | |
showValueLabel | boolean | — | Whether the value's label is displayed. True by default if there's a label, false by default if not. |
valueLabel | ReactNode | — | The content to display as the value's label. Overrides default formatted number. |
orientation | Orientation | — | |
isDisabled | boolean | — | |
formatOptions | Intl.NumberFormatOptions | — | |
minValue | number | — | The smallest value allowed for the input. |
maxValue | number | — | The largest value allowed for the input. |
step | number | — | The amount that the input value changes with each increment or decrement "tick". |
label | ReactNode | — | The content to display as the label. |
value | number[] | — | The current value (controlled). |
defaultValue | number[] | — | The default value (uncontrolled). |
Events
| Name | Type | Default | Description |
onChange | (
(value: number[]
)) => void | — | Handler that is called when the value changes. |
Layout
| Name | Type | Default | Description |
flex | string
| number
| boolean | — | When used in a flex layout, specifies how the element will grow or shrink to fit the space available. See MDN. |
flexGrow | number | — | When used in a flex layout, specifies how the element will grow to fit the space available. See MDN. |
flexShrink | number | — | When used in a flex layout, specifies how the element will shrink to fit the space available. See MDN. |
flexBasis | number | string | — | When used in a flex layout, specifies the initial main size of the element. See MDN. |
alignSelf | 'auto'
| 'normal'
| 'start'
| 'end'
| 'center'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'stretch' | — | Overrides the alignItems property of a flex or grid container. See MDN. |
justifySelf | 'auto'
| 'normal'
| 'start'
| 'end'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'center'
| 'left'
| 'right'
| 'stretch' | — | Specifies how the element is justified inside a flex or grid container. See MDN. |
order | number | — | The layout order for the element within a flex or grid container. See MDN. |
gridArea | string | — | When used in a grid layout, specifies the named grid area that the element should be placed in within the grid. See MDN. |
gridColumn | string | — | When used in a grid layout, specifies the column the element should be placed in within the grid. See MDN. |
gridRow | string | — | When used in a grid layout, specifies the row the element should be placed in within the grid. See MDN. |
gridColumnStart | string | — | When used in a grid layout, specifies the starting column to span within the grid. See MDN. |
gridColumnEnd | string | — | When used in a grid layout, specifies the ending column to span within the grid. See MDN. |
gridRowStart | string | — | When used in a grid layout, specifies the starting row to span within the grid. See MDN. |
gridRowEnd | string | — | When used in a grid layout, specifies the ending row to span within the grid. See MDN. |
Spacing
| Name | Type | Default | Description |
margin | DimensionValue | — | The margin for all four sides of the element. See MDN. |
marginTop | DimensionValue | — | The margin for the top side of the element. See MDN. |
marginBottom | DimensionValue | — | The margin for the bottom side of the element. See MDN. |
marginStart | DimensionValue | — | The margin for the logical start side of the element, depending on layout direction. See MDN. |
marginEnd | DimensionValue | — | The margin for the logical end side of an element, depending on layout direction. See MDN. |
marginX | DimensionValue | — | The margin for both the left and right sides of the element. See MDN. |
marginY | DimensionValue | — | The margin for both the top and bottom sides of the element. See MDN. |
Sizing
| Name | Type | Default | Description |
width | DimensionValue | — | The width of the element. See MDN. |
minWidth | DimensionValue | — | The minimum width of the element. See MDN. |
maxWidth | DimensionValue | — | The maximum width of the element. See MDN. |
height | DimensionValue | — | The height of the element. See MDN. |
minHeight | DimensionValue | — | The minimum height of the element. See MDN. |
maxHeight | DimensionValue | — | The maximum height of the element. See MDN. |
Positioning
| Name | Type | Default | Description |
position | 'static'
| 'relative'
| 'absolute'
| 'fixed'
| 'sticky' | — | Specifies how the element is positioned. See MDN. |
top | DimensionValue | — | The top position for the element. See MDN. |
bottom | DimensionValue | — | The bottom position for the element. See MDN. |
left | DimensionValue | — | The left position for the element. See MDN. Consider using start instead for RTL support. |
right | DimensionValue | — | The right position for the element. See MDN. Consider using start instead for RTL support. |
start | DimensionValue | — | The logical start position for the element, depending on layout direction. See MDN. |
end | DimensionValue | — | The logical end position for the element, depending on layout direction. See MDN. |
zIndex | number | — | The stacking order for the element. See MDN. |
isHidden | boolean | — | Hides the element. |
Accessibility
| Name | Type | Default | Description |
aria-label | string | — | Defines a string value that labels the current element. |
aria-labelledby | string | — | Identifies the element (or elements) that labels the current element. |
aria-describedby | string | — | Identifies the element (or elements) that describes the object. |
aria-details | string | — | Identifies the element (or elements) that provide a detailed, extended description for the object. |
Advanced
| Name | Type | Default | Description |
UNSAFE_className | string | — | Sets the CSS className for the element. Only use as a last resort. Use style props instead. |
UNSAFE_style | CSSProperties | — | Sets inline style for the element. Only use as a last resort. Use style props instead. |
Visual options#
Fill#
<Flex direction="column" gap="size-300">
<Slider
label="Opacity"
maxValue=1
formatOptions={style: 'percent'}
defaultValue=0.9
step=0.01
isFilled
/>
<Slider
label="Exposure"
minValue=-5
maxValue=5
defaultValue=1.83
formatOptions={signDisplay: 'always'}
step=0.01
fillOffset=0
isFilled
/>
</Flex><Flex direction="column" gap="size-300">
<Slider
label="Opacity"
maxValue=1
formatOptions={style: 'percent'}
defaultValue=0.9
step=0.01
isFilled
/>
<Slider
label="Exposure"
minValue=-5
maxValue=5
defaultValue=1.83
formatOptions={signDisplay: 'always'}
step=0.01
fillOffset=0
isFilled
/>
</Flex><Flex
direction="column"
gap="size-300">
<Slider
label="Opacity"
maxValue=1
formatOptions={
style: 'percent'
}
defaultValue=0.9
step=0.01
isFilled
/>
<Slider
label="Exposure"
minValue=-5
maxValue=5
defaultValue=1.83
formatOptions={
signDisplay:
'always'
}
step=0.01
fillOffset=0
isFilled
/>
</Flex>Disabled#
<Slider label="Cookies to share" defaultValue=25 isDisabled /><Slider
label="Cookies to share"
defaultValue=25
isDisabled
/><Slider
label="Cookies to share"
defaultValue=25
isDisabled
/>