Slider (Range)
- Source: https://github.com/reach/reach-ui/tree/main/packages/slider
- WAI-ARIA: https://www.w3.org/TR/wai-aria-practices-1.2/#slider
A UI input component where the user selects a value from within a given range. A Slider has a handle that can be moved along a track to change its value. When the user's mouse or focus is on the Slider's handle, the value can be incremented with keyboard controls.
Sliders are composed by an outer Slider component with a SliderTrack child component. SliderTrack can accept SliderRange, SliderMarker and SliderHandle components as children.
You can use Slider as a simple standalone component, or compose its parts with SliderInput.
function Example() { return <Slider />;}
function Example() { return ( <div> <SliderInput> <SliderTrack> <SliderRange /> <SliderMarker value={50} /> <SliderHandle /> </SliderTrack> </SliderInput> </div> );}
Installation
From the command line in your project directory, run npm install @reach/slider or yarn add @reach/slider. Then import the components and styles that you need:
npm install @reach/slider# oryarn add @reach/slider
import { Slider, SliderInput, SliderTrack, SliderRange, SliderHandle, SliderMarker,} from "@reach/slider";import "@reach/slider/styles.css";
Usage
// Basic sliderfunction Example() { return <Slider min={0} max={200} step={10} />;} // Composed slider componentsfunction ExampleComposed() { return ( <SliderInput min={0} max={200} step={10}> <SliderTrack> <SliderRange /> <SliderHandle /> </SliderTrack> </SliderInput> );}
Slider Events
Prior to v0.10.0, Slider used pointer events for unified event handling across different pointer types (mouse, touch, stylus, etc.). While we still use onPointerUp and onPointerDown to take advantage of setPointerCapture and releasePointerCapture, we have moved all other logic to onMouseDown, onTouchStart, onMouseUp and onTouchEnd to prevent the need for a polyfill.
Another note on events: because the slider move and end events fire on the document (and because of some quirks in Chrome related to onTouchStart), the following event props on Slider and SliderInput use native DOM events rather than React's synthetic events in their respective handlers.
onPointerDownonPointerUponMouseDownonMouseMoveonMouseUponTouchStartonTouchMoveonTouchEnd
Component API
Slider
High-level component to render a slider in its simplest form. This works simililarly to a native HTML range input.
<Slider min={0} max={100} />Slider CSS Selectors
Please see the styling guide.
[data-reach-slider] {}[data-reach-slider][data-disabled] {}[data-reach-slider][data-orientation="(horizontal|vertical)"] {}
Slider Props
| Prop | Type | Required | Default |
|---|---|---|---|
children | node | true | |
defaultValue | number | false | |
disabled | boolean | false | |
getAriaLabel | func | false | |
getAriaValueText | func | false | |
handleAlignment | "center" | "contain" | false | "center" |
max | number | false | 100 |
min | number | false | 0 |
name | string | false | |
onChange | func | false | |
orientation | "horizontal" | "vertical" | false | "horizontal" |
step | number | false | 1 |
value | number | false |
Slider children
children?: React.ReactNode
Slider can accept SliderMarker children to enhance display of specific values along the track.
<Slider min={0} max={100}> {new Array(11).fill("x").map((x, index) => ( <SliderMarker value={index * 10}> <span>{index * 10}</span> </SliderMarker> ))}</Slider>
Slider defaultValue
defaultValue?: number
The defaultValue is used to set an initial value for an uncontrolled Slider.
Slider disabled
disabled?: boolean
Whether or not the slider should be disabled from user interaction.
Slider getAriaLabel
getAriaLabel?(value: number): string
A function used to set a human-readable name for the slider.
Slider getAriaValueText
getAriaValueText?(value: number): string
A function used to set a human-readable value text based on the slider's current value.
Slider handleAlignment
handleAlignment?: "center" | "contain"
When set to center, the slider's handle will be positioned directly centered over the slider's curremt value on the track. This means that when the slider is at its min or max value, a visiable slider handle will extend beyond the width (or height in vertical mode) of the slider track. When set to contain, the slider handle will always be contained within the bounds of the track, meaning its position will be slightly offset from the actual value depending on where it sits on the track.
Slider max
max?: number
The maximum value of the slider. Defaults to 100.
Slider min
min?: number
The minimum value of the slider. Defaults to 0.
Slider name
name?: string
If the slider is used as a form input, it should accept a name prop to identify its value in context of the form.
Slider onChange
onChange?(newValue: number, props?: { min?: number, max?: number, handlePosition?: string }): void
Callback that fires when the slider value changes. When the value prop is set, the Slider state becomes controlled and onChange must be used to update the value in response to user interaction.
Slider orientation
orientation?: "horizontal" | "vertical"
Sets the slider to horizontal or vertical mode.
Slider step
step?: number
The step attribute is a number that specifies the granularity that the value must adhere to as it changes. Step sets minimum intervals of change, creating a "snap" effect when the handle is moved along the track.
Slider value
value?: number
An explicit value for the slider. When this prop is used, the Slider state becomes controlled and onChange must be used to update the value in response to user interaction.
SliderInput
The parent component of the slider interface. This is a lower level component if you need more control over styles or rendering the slider's inner components.
SliderInput CSS Selectors
See selectors for Slider.
SliderInput Props
SliderInput accepts the same props as Slider.
SliderInput children
children: React.ReactNode | ((props: { hasFocus?: boolean, id?: string | undefined, sliderId?: string | undefined, max?: number, min?: number, value?: number, valueText?: string | undefined }) => JSX.Element)
Slider expects <SliderTrack> as its child; The track will accept all additional slider sub-components as children. It can also accept a function/render prop as its child to expose some of its internal state variables.
SliderArgs = { hasFocus: boolean, id: string, max: number, min: number, value: number, valueText: string }
SliderTrack
The parent component of the slider's inner components. Represents the visual track on which the slider's handle moves to represent its value.
SliderTrack CSS Selectors
Please see the styling guide.
[data-reach-slider-track] {}[data-reach-slider-track][data-disabled] {}[data-reach-slider-track][data-orientation="(horizontal|vertical)"] {}
SliderTrack Props
| Prop | Type | Required |
|---|---|---|
children | node | true |
SliderTrack children
children: React.ReactNode
SliderTrack expects <SliderHandle>, at minimum, for the Slider to function. All other Slider subcomponents should be passed as children inside the SliderTrack.
SliderRange
The (typically) highlighted portion of the track that represents the space between the slider's min value and its current value.
NOTE: This component was named SliderTrackHighlight in a previous version of Reach UI. That component will be dropped in a future version. We recommend updating your projects to replace SliderTrackHighlight with SliderRange.
SliderRange CSS Selectors
Please see the styling guide.
[data-reach-slider-range] {}[data-reach-slider-range][data-disabled] {}[data-reach-slider-range][data-orientation="(horizontal|vertical)"] {}
SliderMarker
A fixed value marker. These can be used to illustrate a range of steps or highlight important points along the slider track.
SliderMarker CSS Selectors
Please see the styling guide.
[data-reach-slider-marker] {}[data-reach-slider-marker][data-disabled] {}[data-reach-slider-marker][data-orientation="(horizontal|vertical)"] {}[data-reach-slider-marker][data-state="(under|at|over)-value"] { /* marker is under, at, or over the slider value */}[data-reach-slider-marker][data-value="VALUE_REF"] { /* marker is under, at, or over the slider value */}
SliderMarker Props
| Prop | Type | Required |
|---|---|---|
value | number | true |
SliderMarker value
value: number
The value to denote where the marker should appear along the track.
SliderHandle
The handle that the user drags along the track to set the slider value.
SliderHandle CSS Selectors
Please see the styling guide.
[data-reach-slider-handle] {}[data-reach-slider-handle][aria-disabled] {}[data-reach-slider-handle][aria-orientation="(horizontal|vertical)"] {}