Slider
Wähle einen Wert oder Bereich durch Ziehen, Tippen auf die Spur oder mit den Tasten, mit gleitenden Sprüngen und einer optionalen Wertblase.
pnpm dlx shadcn@latest add https://hextaui.com/r/slider.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @base-ui/react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/slider.tsx Passe die Importpfade an dein Projekt-Setup an.
<Slider /> zeichnet einen Thumb pro Wert, sodass eine Zahl oder ein Array mit einem Element einen einzelnen Slider ergibt und zwei Elemente einen Bereich. Kinder wie <SliderLabel /> und <SliderValue /> sitzen in einer Zeile über der Spur.
Beim Ziehen folgt der Thumb dem Zeiger exakt. Springt der Wert, durch einen Druck auf die Spur, eine Taste oder einen neuen kontrollierten Wert, gleiten Thumb und Füllung in 180ms dorthin, statt zu teleportieren.
Größen
sm, default und lg skalieren Thumb und Spur gemeinsam.
Range
Übergib zwei Werte für einen Bereich. Benenne jeden Thumb mit getAriaLabel und halte sie mit minStepsBetweenValues auseinander. Mit draggableRange ziehst du irgendwo zwischen den Thumbs, um beide gleichzeitig zu bewegen; ein Tippen dort bewegt weiterhin den nächsten Thumb.
Wertblase
showValue zeigt den formatierten Wert über dem Thumb, während er gezogen oder per Tastatur fokussiert wird. Nutze es statt einer Label-Zeile, da die Blase in den Raum über der Spur aufsteigt.
Schritte und Format
step rastet den Wert ein, largeStep legt den Sprung für Page Up und Shift + Pfeil fest, und format formatiert jede Zahl, die der Slider zeigt oder ansagt.
Kontrolliert
onValueChange feuert bei jeder Bewegung und onValueCommitted einmal beim Loslassen, was der Moment zum Speichern ist. Auch das Setzen des Werts von außen gleitet.
Vertikal
Mit orientation="vertical" füllt der Slider die Höhe seines Elternelements, und Hoch erhöht den Wert.
Mit Icons
Setze Icons neben den Slider in einer Flex-Zeile. Der Slider nimmt die restliche Breite.
Deaktiviert
Der ganze Slider dimmt und ignoriert Zeiger- und Tastatureingaben.
Lange Labels
Lange Labels umbrechen, und der Wert bleibt am Ende.
Rechts nach links
In einem rechts-nach-links-Elternelement startet die Füllung von rechts, und die Pfeiltasten folgen ihr. Übergib locale für die Ziffern des Lesers.
| Taste | Aktion |
|---|---|
| Tab | Setzt den Fokus auf den nächsten Thumb. |
| →↑ | Erhöht den Wert um einen Schritt. → verringert ihn in rechts-nach-links. |
| ←↓ | Verringert den Wert um einen Schritt. ← erhöht ihn in rechts-nach-links. |
| Shift + ArrowPage UpPage Down | Bewegt um largeStep. |
| Home | Setzt das Minimum oder in einem Bereich den Wert des vorherigen Thumbs. |
| End | Setzt das Maximum oder in einem Bereich den Wert des nächsten Thumbs. |
- Jeder Thumb enthält ein natives
input type="range"und ist damit einslidermit eigenem Wert, min und max. <SliderLabel />benennt jeden Thumb. Ohne eines wirdaria-labelan<Slider />an die Thumbs weitergegeben, nicht an den Wrapper, sodass der Slider nie unbenannt bleibt. Nutze in einem BereichgetAriaLabel, um die Thumbs zu unterscheiden.<SliderValue />und die Wertblase werden nicht bei jeder Änderung angesagt; der Thumb meldet seinen Wert bereits.- Das Drücken eines Thumbs zeigt keinen Fokusring; die Pfeiltasten tun es. Bei reduzierter Bewegung springt der Thumb, statt zu gleiten.
- Auf Touchscreens wächst die Trefferfläche auf mindestens 44px, ohne das Layout zu ändern.
Gebaut auf dem Base UI Slider. Jeder Teil akzeptiert die Props des Primitivs, das er umschließt.
| Prop | Typ | Standard |
|---|---|---|
valueDer kontrollierte Wert. Ein Thumb pro Element. | number | number[] | – |
defaultValue | number | number[] | – |
onValueChangeFeuert bei jeder Änderung während des Ziehens. | (value, eventDetails) => void | – |
onValueCommittedFeuert einmal, wenn eine Änderung endet. | (value, eventDetails) => void | – |
min | number | 0 |
max | number | 100 |
step | number | 1 |
largeStep | number | 10 |
minStepsBetweenValues | number | 0 |
size | "sm" | "default" | "lg" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
draggableRangeIn einem Bereich bewegt das Ziehen zwischen den Thumbs beide gemeinsam und hält den Abstand. | boolean | false |
showValueZeigt den Wert über dem Thumb, während gezogen oder per Tastatur fokussiert wird. | boolean | false |
thumbAlignmentedge hält den Thumb bei min und max innerhalb der Spur. | "edge" | "center" | "edge-client-only" | "edge" |
thumbCollisionBehavior | "push" | "swap" | "none" | "push" |
format | Intl.NumberFormatOptions | – |
locale | Intl.LocalesArgument | "en-US" |
aria-labelBenennt die Thumbs. | string | – |
getAriaLabelBenennt jeden Thumb eines Bereichs. | (index: number) => string | – |
getAriaValueText | (formattedValue: string, value: number, index: number) => string | – |
name | string | – |
disabled | boolean | false |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="slider" | Das Root. |
data-size | sm, default oder lg. |
data-jump | Vorhanden für 220ms, während der Thumb zu einem neuen Wert gleitet. |
data-range-dragging | Vorhanden, solange der ganze Bereich gezogen wird. |
data-orientation | horizontal oder vertical. |
data-dragging | Vorhanden, solange ein Zeiger gedrückt ist. |
data-disabled | Vorhanden, wenn deaktiviert. |
data-invalid | Vorhanden, wenn in einem Field ungültig. |
--slider-thumb | Der Durchmesser des Thumbs, über size gesetzt. |
--slider-track | Die Dicke der Spur, über size gesetzt. |
data-slot="slider-control" | Die drückbare Fläche um die Spur. |
data-slot="slider-track" | Die Spur. |
data-slot="slider-range" | Die Füllung zwischen dem Start oder dem ersten Thumb und dem letzten Thumb. |
data-slot="slider-thumb" | Jeder Thumb. data-index gibt seine Position an. |
data-active | Am Thumb, der fokussiert ist oder gezogen wird. |
data-slot="slider-thumb-value" | Die Wertblase von showValue. |
Benennt die Thumbs und wächst, um die Zeile zu füllen. Rendert ein <div>.
| Prop | Typ | Standard |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="slider-label" | Das Label. |
Zeigt die formatierten Werte, in einem Bereich mit einem Halbgeviertstrich verbunden. Rendert ein <output>.
| Prop | Typ | Standard |
|---|---|---|
childrenEigener Text. | (formattedValues: string[], values: number[]) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <output> |
| Attribut | Beschreibung |
|---|---|
data-slot="slider-value" | Der Wert. |
data-orientation | horizontal oder vertical. |
data-dragging | Vorhanden, solange ein Zeiger gedrückt ist. |
data-disabled | Vorhanden, wenn deaktiviert. |
data-invalid | Vorhanden, wenn in einem Field ungültig. |
- CalendarEin Datumsraster für Einzel-, Bereichs- und Mehrfachauswahl, mit gleitenden Monaten, Bereichsvorschau und Tagen in Touch-Größe.
- CheckboxEine Checkbox, deren Häkchen sich einzeichnet, mit unbestimmten übergeordneten Elementen, Gruppen und Labels, die ihren Hover teilen.
- ComboboxEin filterbares Select mit Chips, Gruppen und asynchronen Ergebnissen, in einem Popup, das sich beim Tippen anpasst.
- Date pickerEin Button, der einen Kalender in einem Popover öffnet, auf Smartphones als Bottom Sheet, für einzelne Daten und Zeiträume.
- FieldLabels, Beschreibungen und Fehler, mit ihrem Steuerelement verbunden, mit Validierungszuständen und Layouts für Formulare.
- InputEin Texteingabefeld mit drei Größen, ungültigen und schreibgeschützten Zuständen, nativem Validierungsstyling und einer 16-px-Schrift für Touch, damit Smartphones nie hineinzoomen.
In Blocks verwendet
Blocks, die auf Slider aufbauen.
- AppearanceDer Bereich „Erscheinungsbild“ in den Einstellungen eines KI-Produkts: Theme, Akzent, Hintergrundtönung, Dichte, Chat-Schrift, Textgrößen und Barrierefreiheitsoptionen, alles als Entwurf gehalten, bis gespeichert wird.
- BillingPlan & Nutzung für ein KI-Produkt, im Stil von Cursor, Claude und Vercel. Eine nach Modell aufgeteilte Nutzungsanzeige, die das Ende des Zyklus hochrechnet und warnt, bevor die Credits ausgehen, ein tägliches Diagramm zum Scrubben, ein Ausgabenlimit mit Warnungen, die du auf der Anzeige in der Vorschau siehst, Planwechsel mit exakter Anteilsberechnung, ein Kartenformular mit echter Validierung und Rechnungen als PDF-Download.
- ProfileDer Bereich „Profil“ in den Einstellungen eines KI-Produkts. Ein Foto kreisförmig zuschneiden, einen Benutzernamen wählen, der beim Tippen geprüft wird, eine neue E-Mail mit einem 6-stelligen Code bestätigen, Links hinzufügen, die die Website erkennen, und eine Live-Karte sehen, wie andere dich sehen.
- SettingsEinstellungen für ein KI-Produkt, gestaltet wie bei Cursor und Claude. Eine gefüllte Seitenleiste mit Suche, Gruppen und externen Links, Karten mit Zeilen, dezenten Pickern und verschachtelten Optionen, eine dunkle Speicher-Insel, die nur erscheint, wenn sich etwas geändert hat, ⌘S zum Speichern, Feldfehler aus deinen Prüfungen oder deinem Server und Ladezustände in der Form des Inhalts.