Scroll area
Rolagem nativa com uma barra de rolagem mínima, bordas que esmaecem apenas onde há mais a ver e um peek opcional que corta o último item ao meio.
pnpm dlx shadcn@latest add https://hextaui.com/r/scroll-area.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/scroll-area.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Dê à scroll area uma altura ou largura fixa. O conteúdo além dela rola com o comportamento nativo, e uma barra de rolagem fina aparece enquanto você passa o mouse ou rola.
Peek
As duas listas têm a mesma altura. Com peek, à direita, a caixa se ajusta para que o último item visível fique cortado pela metade, mostrando que há mais para rolar antes de alguém tentar. Nunca reduz a caixa abaixo de metade da altura.
Texto
As bordas só esmaecem onde há mais conteúdo para rolar. No topo, só a parte de baixo esmaece, e o esmaecimento aumenta conforme você se afasta de uma borda.
Começar pelo final
viewportRef dá a você o elemento que rola. Defina seu scrollTop para iniciar um chat na mensagem mais recente, de modo que só a borda superior esmaeça.
Horizontal
Defina scrollbars="horizontal" e dê ao conteúdo w-max para que ele possa crescer além da caixa.
Ambos os eixos
scrollbars="both" mostra as duas barras de rolagem e um canto onde se encontram, e esmaece as quatro bordas.
Conteúdo dinâmico
O peek e os esmaecimentos se atualizam conforme itens são adicionados ou removidos. Com poucos itens para rolar, a caixa mantém a altura e nada esmaece.
Sobre uma superfície colorida
O esmaecimento é uma máscara sobre o conteúdo, não uma cor de sobreposição, então funciona sobre qualquer fundo.
Dentro de uma sheet
Dentro de uma coluna flex, envolva-a em um elemento com min-h-0 flex-1 e dê à scroll area h-full para preencher o espaço restante.
Sem fade
Desative o esmaecimento das bordas com fade={false}.
Da direita para a esquerda
O conteúdo começa na borda direita, a barra de rolagem e os esmaecimentos seguem a direção de leitura, e a direção é obtida da página.
O viewport só entra na ordem de tabulação quando tem algo para rolar. Com foco, rola com as teclas nativas do navegador.
| Tecla | Ação |
|---|---|
| Tab | Foca o viewport quando seu conteúdo transborda. |
| ↑↓ | Rola na vertical. |
| ←→ | Rola na horizontal. |
| Page UpPage DownSpace | Rola uma página. |
| HomeEnd | Salta para o início ou o fim. |
- Dê à scroll area um
aria-labelquando seu propósito não for claro pelo conteúdo ao redor, como o rótulo “Messages” no exemplo de chat. - O anel de foco é desenhado na própria scroll area, então continua visível acima das bordas esmaecidas.
Construído sobre o scroll area do Base UI. ScrollArea renderiza juntos a raiz, o viewport, o conteúdo e as barras de rolagem.
| Prop | Tipo | Padrão |
|---|---|---|
scrollbars | "vertical" | "horizontal" | "both" | "vertical" |
fadeEsmaece as bordas que têm mais conteúdo. | boolean | true |
peekAjuste a altura para que o último item visível fique cortado pela metade. Marque os itens com data-scroll-area-item para escolher quais elementos contam. | boolean | false |
viewportRefO elemento que rola. | Ref<HTMLDivElement> | – |
overflowEdgeThresholdPixels a rolar antes de uma borda contar como transbordando. | number | { xStart, xEnd, yStart, yEnd } | 0 |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="scroll-area" | A raiz. |
data-slot="scroll-area-viewport" | O elemento que rola. |
data-slot="scroll-area-content" | Envolve seu conteúdo dentro do viewport. |
data-peek | Presente quando peek está ativado. |
data-peeking | Presente enquanto o peek ajusta a altura. |
data-scrolling | Presente enquanto o usuário rola. |
data-has-overflow-x | Presente quando o conteúdo é mais largo que o viewport. |
data-has-overflow-y | Presente quando o conteúdo é mais alto que o viewport. |
data-overflow-y-start | Presente quando há mais conteúdo acima. Existem atributos equivalentes -y-end, -x-start e -x-end para as outras bordas. |
--scroll-area-fade | Tamanho do esmaecimento das bordas. O padrão é 2.5rem. |
--scroll-area-overflow-y-start | Distância da borda superior em pixels. Existem variáveis equivalentes -y-end, -x-start e -x-end. |
Renderizado para você pelo ScrollArea. Exporte só se você compuser as partes do Base UI por conta própria.
| Prop | Tipo | Padrão |
|---|---|---|
orientation | "vertical" | "horizontal" | "vertical" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="scroll-area-scrollbar" | A trilha da barra de rolagem. |
data-slot="scroll-area-thumb" | O thumb arrastável. |
data-orientation | vertical ou horizontal. |
data-hovering | Presente enquanto o ponteiro está sobre a área. |
data-scrolling | Presente enquanto o usuário rola. |
--scroll-area-thumb-height | A altura do thumb. |
--scroll-area-thumb-width | A largura do thumb. |
- AccordionTítulos empilhados que revelam cada um um painel, com movimento de altura que você pode reverter no meio e painéis que continuam pesquisáveis enquanto fechados.
- Aspect ratioUma caixa que mantém sua forma antes de a mídia carregar, exibe um shimmer durante o carregamento, faz a mídia aparecer com fade e usa um fallback quando ela falha.
- CarouselSlides nativos com scroll-snap, com inércia no toque, arrastar com o mouse, setas do teclado, pontos, miniaturas e um autoplay que pausa quando deve.
- CollapsibleUm painel que aparece e desaparece com um movimento de altura que você pode reverter no meio, sem fazer o layout pular.
- ResizablePainéis que você pode separar arrastando, com um divisor discreto que desperta no hover, tamanhos que deslizam ao redefinir ou recolher e layouts que persistem.
- SeparatorUma linha fina que divide o conteúdo na horizontal ou na vertical, com rótulo opcional e um modo decorativo para linhas puramente visuais.