Scroll area
Un défilement natif avec une barre de défilement minimale, des bords qui s’estompent seulement là où il y a plus à voir, et un aperçu facultatif qui coupe le dernier élément en deux.
pnpm dlx shadcn@latest add https://hextaui.com/r/scroll-area.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/scroll-area.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Donnez à la zone de défilement une hauteur ou une largeur fixe. Le contenu au-delà défile avec le comportement natif, et une fine barre de défilement apparaît au survol ou pendant le défilement.
Peek
Les deux listes ont la même hauteur. Avec peek, à droite, la boîte se raccourcit pour que le dernier élément visible soit coupé à mi-hauteur, ce qui montre qu'il reste à faire défiler avant même que quelqu'un essaie. Elle ne rogne jamais la boîte en dessous de la moitié de sa hauteur.
Texte
Les bords ne s'estompent que là où il reste du contenu à faire défiler. En haut, seul le bas s'estompe, et le fondu s'installe progressivement quand vous vous éloignez d'un bord.
Démarrer en bas
viewportRef vous donne l'élément qui défile. Définissez son scrollTop pour démarrer un chat au dernier message, de sorte que seul le bord supérieur s'estompe.
Horizontal
Définissez scrollbars="horizontal" et donnez w-max au contenu pour qu'il puisse dépasser la boîte.
Les deux axes
scrollbars="both" affiche les deux barres de défilement et un coin à leur jonction, et estompe les quatre bords.
Contenu dynamique
Peek et les fondus se mettent à jour quand des éléments sont ajoutés ou retirés. Avec trop peu d'éléments pour défiler, la boîte garde sa hauteur et rien ne s'estompe.
Sur une surface colorée
Le fondu est un masque sur le contenu, pas une couleur en surcouche : il fonctionne sur n'importe quel arrière-plan.
Dans une sheet
Dans une colonne flex, entourez-la d'un élément min-h-0 flex-1 et donnez h-full à la zone de défilement pour qu'elle remplisse l'espace restant.
Sans fondu
Désactivez les fondus de bord avec fade={false}.
De droite à gauche
Le contenu commence au bord droit, la barre de défilement et les fondus suivent le sens de lecture, et la direction est reprise de la page.
Le viewport n'entre dans l'ordre de tabulation que s'il y a quelque chose à faire défiler. Une fois focalisé, il défile avec les touches natives du navigateur.
| Touche | Action |
|---|---|
| Tab | Donne le focus au viewport quand son contenu déborde. |
| ↑↓ | Défile verticalement. |
| ←→ | Défile horizontalement. |
| Page UpPage DownSpace | Défile d'une page. |
| HomeEnd | Saute au début ou à la fin. |
- Donnez un
aria-labelà la zone de défilement quand son rôle n'est pas clair d'après le contenu environnant, comme le label « Messages » dans l'exemple de chat. - L'anneau de focus est dessiné sur la zone de défilement elle-même, et reste donc visible au-dessus des bords estompés.
Construit sur le scroll area de Base UI. ScrollArea rend ensemble la racine, le viewport, le contenu et les barres de défilement.
| Prop | Type | Par défaut |
|---|---|---|
scrollbars | "vertical" | "horizontal" | "both" | "vertical" |
fadeEstompe les bords qui ont plus de contenu. | boolean | true |
peekRogne la hauteur pour que le dernier élément visible soit coupé à mi-hauteur. Marquez les éléments avec data-scroll-area-item pour choisir lesquels comptent. | boolean | false |
viewportRefL'élément qui défile. | Ref<HTMLDivElement> | – |
overflowEdgeThresholdPixels à parcourir avant qu'un bord compte comme débordant. | number | { xStart, xEnd, yStart, yEnd } | 0 |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="scroll-area" | La racine. |
data-slot="scroll-area-viewport" | L'élément qui défile. |
data-slot="scroll-area-content" | Enveloppe votre contenu dans le viewport. |
data-peek | Présent quand peek est activé. |
data-peeking | Présent tant que peek rogne la hauteur. |
data-scrolling | Présent pendant que l'utilisateur fait défiler. |
data-has-overflow-x | Présent quand le contenu est plus large que le viewport. |
data-has-overflow-y | Présent quand le contenu est plus haut que le viewport. |
data-overflow-y-start | Présent quand il y a plus de contenu au-dessus. Des attributs équivalents existent pour -y-end, -x-start et -x-end pour les autres bords. |
--scroll-area-fade | Taille du fondu de bord. 2.5rem par défaut. |
--scroll-area-overflow-y-start | Distance depuis le bord supérieur en pixels. Des variables équivalentes existent pour -y-end, -x-start et -x-end. |
Rendu pour vous par ScrollArea. N'exportez-le que si vous composez vous-même les parties de Base UI.
| Prop | Type | Par défaut |
|---|---|---|
orientation | "vertical" | "horizontal" | "vertical" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="scroll-area-scrollbar" | La piste de la barre de défilement. |
data-slot="scroll-area-thumb" | Le curseur déplaçable. |
data-orientation | vertical ou horizontal. |
data-hovering | Présent tant que le pointeur est sur la zone. |
data-scrolling | Présent pendant que l'utilisateur fait défiler. |
--scroll-area-thumb-height | La hauteur du curseur. |
--scroll-area-thumb-width | La largeur du curseur. |
- AccordionDes titres empilés qui révèlent chacun un panneau, avec un mouvement de hauteur réversible en cours de route et des panneaux qui restent consultables par la recherche une fois fermés.
- Aspect ratioUne boîte qui garde sa forme avant le chargement du média, scintille pendant le chargement, fait apparaître le média en fondu et bascule sur un repli en cas d’échec.
- CarouselDes slides à scroll-snap natif avec inertie au toucher, glisser à la souris, flèches du clavier, points, miniatures et une lecture automatique qui se met en pause au bon moment.
- CollapsibleUn panneau qui s’affiche et se masque avec un mouvement de hauteur réversible en cours de route, sans faire sauter la mise en page.
- ResizableDes panneaux que l’on peut écarter à la main, avec un séparateur discret qui s’éveille au survol, des tailles qui glissent à la réinitialisation ou au repli, et des mises en page persistantes.
- SeparatorUn trait fin qui sépare le contenu horizontalement ou verticalement, avec un libellé facultatif et un mode décoratif pour les lignes purement visuelles.