Slider
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 totrue
on theSlider.Root
component. - Provide a
value
prop toSlider.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.
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
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 |
onValueChangeEnd | function | A callback function called when the user finishes dragging the thumb and the value changes. This is different than the Default: undefined |
controlledValue | boolean | Whether or not the value is controlled or not. If 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 delegation 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. |
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 delegation docs for more information. Default: undefined |
Data Attribute | Value | Description |
---|---|---|
data-slider-range | '' | Present on the range elements. |
A thumb on the slider.
Property | Type | Description |
---|---|---|
index required | number | The index of the thumb in the array of thumbs provided by the 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 delegation docs for more information. Default: undefined |
Data Attribute | Value | Description |
---|---|---|
data-slider-thumb | '' | Present on the thumb elements. |
A tick mark on the slider.
Property | Type | Description |
---|---|---|
index required | number | The index of the tick in the array of ticks provided by the 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 delegation docs for more information. Default: undefined |
Data Attribute | Value | Description |
---|---|---|
data-bounded | '' | Present when the tick is bounded. |
data-slider-tick | '' | Present on the tick elements. |