Allows users to select a value from a continuous range by sliding a handle.
Structure
Reusable Components
Bits UI provides primitives that enable you to build your own custom slider component that can be reused throughout your application.
Here's an example of how you might create a reusable MySlider component.
You can then use the MySlider component in your application like so:
Managing Value State
Bits UI offers several approaches to manage and synchronize the Slider's value state, catering to different levels of control and integration needs.
1. Two-Way Binding
For seamless state synchronization, use Svelte's bind:value directive. This method automatically keeps your local state in sync with the component's internal state.
Key Benefits
Simplifies state management
Automatically updates myValue when the internal state changes (e.g., via dragging the thumb(s))
Allows external control (e.g., updating the value via a separate button)
2. Change Handler
For more granular control or to perform additional logic on state changes, use the onValueChange prop. This approach is useful when you need to execute custom logic alongside state updates.
Use Cases
Implementing custom behaviors on value change
Integrating with external state management solutions
Triggering side effects (e.g., logging, data fetching)
3. Fully Controlled
For complete control over the component's value state, use the controlledValue prop. This approach requires you to manually manage the value state, giving you full control over when and how the component responds to value change events.
To implement controlled state:
Set the controlledValue prop to true on the Slider.Root component.
Provide a value prop to Slider.Root, which should be a variable holding the current state.
Implement an onValueChange handler to update the state when the internal state changes.
When to Use
Implementing complex logic
Coordinating multiple UI elements
Debugging state-related issues
Note
While powerful, fully controlled state should be used judiciously as it increases complexity and can cause unexpected behaviors if not handled carefully.
For more in-depth information on controlled components and advanced state management techniques, refer to our Controlled State documentation.
Value Commit
You can use the onValueCommit prop to be notified when the user finishes dragging the thumb and the value changes. This is different than the onValueChange callback because it waits until the user stops dragging before calling the callback, where the onValueChange callback is called as the user dragging.
Multiple Thumbs and Ticks
If the value prop has more than one value, the slider will render multiple thumbs. You can also use the ticks snippet prop to render ticks at specific intervals
To determine the number of ticks that will be rendered, you can simply divide the max value by the step value.
Vertical Orientation
You can use the orientation prop to change the orientation of the slider, which defaults to "horizontal".
RTL Support
You can use the dir prop to change the reading direction of the slider, which defaults to "ltr".
Auto Sort
By default, the slider will sort the values from smallest to largest, so if you drag a smaller thumb to a larger value, the value of that thumb will be updated to the larger value.
You can disable this behavior by setting the autoSort prop to false.
HTML Forms
Since there is a near endless number of possible values that a user can select, the slider does not render a hidden input element by default.
You'll need to determine how you want to submit the value(s) of the slider with a form.
Here's an example of how you might do that:
API Reference
Slider.Root
The root slider component which contains the remaining slider components.
Property
Type
Description
value$bindable
number[]
The current value of the slider.
Default: []
onValueChange
function
A callback function called when the value state of the slider changes.
Default: ——undefined
onValueCommit
function
A callback function called when the user finishes dragging the thumb and the value changes. This is different than the onValueChange callback because it waits until the user stops dragging before calling the callback, where the onValueChange callback is called immediately after the user starts dragging.
Default: ——undefined
controlledValue
boolean
Whether or not the value is controlled or not. If true, the component will not update the value state internally, instead it will call onValueChange when it would have otherwise, and it is up to you to update the value prop that is passed to the component.
Default: false
disabled
boolean
Whether or not the switch is disabled.
Default: false
max
number
The maximum value of the slider.
Default: 100
min
number
The minimum value of the slider.
Default: 0
orientation
enum
The orientation of the slider.
Default: "horizontal"
step
number
The step value of the slider.
Default: 1
dir
enum
The reading direction of the app.
Default: ltr
autoSort
boolean
Whether to automatically sort the values in the array when moving thumbs past one another.
Default: true
ref$bindable
HTMLSpanElement
The underlying DOM element being rendered. You can bind to this to get a reference to the element.
Default: ——undefined
children
Snippet
The children content to render.
Default: ——undefined
child
Snippet
Use render delegation to render your own element. See Child Snippet docs for more information.
Default: ——undefined
Data Attribute
Value
Description
data-orientation
enum
The orientation of the slider.
data-slider-root
''
Present on the root element.
Slider.Range
The range of the slider.
Property
Type
Description
ref$bindable
HTMLSpanElement
The underlying DOM element being rendered. You can bind to this to get a reference to the element.
Default: ——undefined
children
Snippet
The children content to render.
Default: ——undefined
child
Snippet
Use render delegation to render your own element. See Child Snippet docs for more information.
Default: ——undefined
Data Attribute
Value
Description
data-slider-range
''
Present on the range elements.
Slider.Thumb
A thumb on the slider.
Property
Type
Description
indexrequired
number
The index of the thumb in the array of thumbs provided by the thumbschildren snippet prop.
Default: ——undefined
disabled
boolean
Whether or not the thumb is disabled.
Default: false
ref$bindable
HTMLSpanElement
The underlying DOM element being rendered. You can bind to this to get a reference to the element.
Default: ——undefined
children
Snippet
The children content to render.
Default: ——undefined
child
Snippet
Use render delegation to render your own element. See Child Snippet docs for more information.
Default: ——undefined
Data Attribute
Value
Description
data-slider-thumb
''
Present on the thumb elements.
Slider.Tick
A tick mark on the slider.
Property
Type
Description
indexrequired
number
The index of the tick in the array of ticks provided by the tickschildren snippet prop.
Default: ——undefined
ref$bindable
HTMLSpanElement
The underlying DOM element being rendered. You can bind to this to get a reference to the element.
Default: ——undefined
children
Snippet
The children content to render.
Default: ——undefined
child
Snippet
Use render delegation to render your own element. See Child Snippet docs for more information.