Scroll area
Natives Scrollen mit minimaler Scrollbar, Kanten, die nur dort ausblenden, wo es mehr zu sehen gibt, und einem optionalen Anschnitt, der das letzte Element halbiert.
pnpm dlx shadcn@latest add https://hextaui.com/r/scroll-area.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/scroll-area.tsx Passe die Importpfade an dein Projekt-Setup an.
Gib dem Scrollbereich eine feste Höhe oder Breite. Inhalt darüber hinaus scrollt mit dem nativen Scrollverhalten, und eine dünne Scrollleiste erscheint beim Hovern oder Scrollen.
Peek
Beide Listen haben dieselbe Höhe. Mit peek, rechts, kürzt sich die Box selbst, sodass das letzte sichtbare Item halb abgeschnitten ist, was zeigt, dass es mehr zu scrollen gibt, bevor es jemand versucht. Sie kürzt die Box nie unter die halbe Höhe.
Text
Ränder blenden nur dort aus, wo es mehr zu scrollen gibt. Oben blendet nur unten aus, und der Fade wächst ein, wenn du dich von einem Rand wegscrollst.
Unten beginnen
viewportRef gibt dir das scrollende Element. Setze sein scrollTop, um einen Chat bei der neuesten Nachricht zu beginnen, sodass nur der obere Rand ausblendet.
Horizontal
Setze scrollbars="horizontal" und gib dem Inhalt w-max, damit er über die Box hinauswachsen kann.
Beide Achsen
scrollbars="both" zeigt beide Scrollleisten und eine Ecke, wo sie sich treffen, und blendet alle vier Ränder aus.
Dynamischer Inhalt
Peek und die Fades aktualisieren sich, wenn Items hinzukommen oder entfallen. Bei zu wenigen Items zum Scrollen behält die Box ihre Höhe, und nichts blendet aus.
Auf einer farbigen Fläche
Der Fade ist eine Maske auf dem Inhalt und keine Überlagerungsfarbe, sodass er auf jedem Hintergrund funktioniert.
In einem Sheet
Umschließe ihn in einer Flex-Spalte mit einem Element mit min-h-0 flex-1 und gib dem Scrollbereich h-full, damit er den restlichen Platz füllt.
Ohne Fade
Schalte die Rand-Fades mit fade={false} ab.
Rechts nach links
Der Inhalt beginnt am rechten Rand, Scrollleiste und Fades folgen der Leserichtung, und die Richtung wird von der Seite übernommen.
Der Viewport gehört nur zur Tab-Reihenfolge, wenn er etwas zu scrollen hat. Fokussiert, scrollt er mit den nativen Tasten des Browsers.
| Taste | Aktion |
|---|---|
| Tab | Fokussiert den Viewport, wenn sein Inhalt überläuft. |
| ↑↓ | Scrollt vertikal. |
| ←→ | Scrollt horizontal. |
| Page UpPage DownSpace | Scrollt um eine Seite. |
| HomeEnd | Springt zum Anfang oder Ende. |
- Gib dem Scrollbereich ein
aria-label, wenn sein Zweck aus dem umgebenden Inhalt nicht klar wird, wie das Label „Messages“ im Chat-Beispiel. - Der Fokusring wird auf dem Scrollbereich selbst gezeichnet und bleibt so über den ausgeblendeten Rändern sichtbar.
Gebaut auf der Base UI Scroll Area. ScrollArea rendert Root, Viewport, Inhalt und Scrollleisten zusammen.
| Prop | Typ | Standard |
|---|---|---|
scrollbars | "vertical" | "horizontal" | "both" | "vertical" |
fadeBlende die Ränder aus, die mehr Inhalt haben. | boolean | true |
peekKürze die Höhe, sodass das letzte sichtbare Item halb abgeschnitten ist. Markiere Items mit data-scroll-area-item, um zu wählen, welche Elemente zählen. | boolean | false |
viewportRefDas Element, das scrollt. | Ref<HTMLDivElement> | – |
overflowEdgeThresholdPixel, die gescrollt werden, bevor ein Rand als überlaufend gilt. | number | { xStart, xEnd, yStart, yEnd } | 0 |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="scroll-area" | Das Root. |
data-slot="scroll-area-viewport" | Das Element, das scrollt. |
data-slot="scroll-area-content" | Umschließt deinen Inhalt im Viewport. |
data-peek | Vorhanden, wenn peek aktiv ist. |
data-peeking | Vorhanden, solange peek die Höhe kürzt. |
data-scrolling | Vorhanden, solange der Nutzer scrollt. |
data-has-overflow-x | Vorhanden, wenn der Inhalt breiter als der Viewport ist. |
data-has-overflow-y | Vorhanden, wenn der Inhalt höher als der Viewport ist. |
data-overflow-y-start | Vorhanden, wenn darüber mehr Inhalt liegt. Entsprechende Attribute -y-end, -x-start und -x-end gibt es für die anderen Ränder. |
--scroll-area-fade | Größe des Rand-Fades. Standard ist 2.5rem. |
--scroll-area-overflow-y-start | Abstand vom oberen Rand in Pixeln. Entsprechende Variablen -y-end, -x-start und -x-end existieren. |
Wird von ScrollArea für dich gerendert. Exportiere es nur, wenn du die Base-UI-Teile selbst zusammensetzt.
| Prop | Typ | Standard |
|---|---|---|
orientation | "vertical" | "horizontal" | "vertical" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="scroll-area-scrollbar" | Die Spur der Scrollleiste. |
data-slot="scroll-area-thumb" | Der ziehbare Thumb. |
data-orientation | vertical oder horizontal. |
data-hovering | Vorhanden, solange der Zeiger über dem Bereich ist. |
data-scrolling | Vorhanden, solange der Nutzer scrollt. |
--scroll-area-thumb-height | Die Höhe des Thumbs. |
--scroll-area-thumb-width | Die Breite des Thumbs. |
- AccordionGestapelte Überschriften, die jeweils ein Panel aufklappen, mit einer Höhenbewegung, die sich mittendrin umkehren lässt, und Panels, die auch geschlossen durchsuchbar bleiben.
- Aspect ratioEine Box, die ihre Form behält, bevor Medien geladen sind, beim Laden schimmert, das Medium einblendet und bei einem Fehler auf einen Fallback zurückfällt.
- CarouselNative Scroll-Snap-Slides mit Momentum auf Touch, Maus-Ziehen, Pfeiltasten, Punkten, Thumbnails und einem Autoplay, das pausiert, wenn es soll.
- CollapsibleEin Panel, das mit einer Höhenbewegung ein- und ausgeblendet wird, die sich mittendrin umkehren lässt, ohne das Layout springen zu lassen.
- ResizablePanels, die du auseinanderziehen kannst, mit einem dezenten Trenner, der beim Hover aufwacht, Größen, die beim Zurücksetzen oder Einklappen gleiten, und Layouts, die erhalten bleiben.
- SeparatorEine Haarlinie, die Inhalte horizontal oder vertikal trennt, mit optionalem Label und einem dekorativen Modus für rein visuelle Linien.