O componente ScrollArea cria containers roláveis com virtualização opcional para listas grandes.
Use a prop items como um array e renderize cada item usando o slot padrão:
items para renderizar conteúdo rolável personalizado diretamente.Use a prop orientation para alterar a direção da rolagem. O padrão é vertical.
Use a prop virtualize para renderizar apenas os itens que estão em exibição no momento, melhorando significativamente o desempenho ao trabalhar com grandes conjuntos de dados.
virtualize, como gap, paddingStart e paddingEnd. Caso contrário, use a prop ui para aplicar classes como gap p-4 no slot viewport.skipMeasurement como true na prop virtualize para pular a medição de DOM por item e usar o estimateSize. Isso melhora significativamente o desempenho em listas grandes e uniformes.Use a prop shadow para exibir sombras de esmaecimento nas bordas roláveis, indicando que há mais conteúdo disponível na direção da rolagem. O esmaecimento acompanha automaticamente a orientation e só aparece quando o conteúdo transborda.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pulvinar risus non risus hendrerit venenatis. Pellentesque sit amet hendrerit risus, sed porttitor quam. Morbi accumsan cursus enim, sed ultricies sapien.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pulvinar risus non risus hendrerit venenatis. Pellentesque sit amet hendrerit risus, sed porttitor quam. Morbi accumsan cursus enim, sed ultricies sapien.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pulvinar risus non risus hendrerit venenatis. Pellentesque sit amet hendrerit risus, sed porttitor quam. Morbi accumsan cursus enim, sed ultricies sapien.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pulvinar risus non risus hendrerit venenatis. Pellentesque sit amet hendrerit risus, sed porttitor quam. Morbi accumsan cursus enim, sed ultricies sapien.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pulvinar risus non risus hendrerit venenatis. Pellentesque sit amet hendrerit risus, sed porttitor quam. Morbi accumsan cursus enim, sed ultricies sapien.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pulvinar risus non risus hendrerit venenatis. Pellentesque sit amet hendrerit risus, sed porttitor quam. Morbi accumsan cursus enim, sed ultricies sapien.
shadow para configurar o tamanho do esmaecimento, ex.: :shadow="{ size: 48 }".Use a prop virtualize com as opções lanes, gap e estimateSize para criar layouts masonry no estilo Pinterest com itens de altura variável.
estimateSize próximo da altura média dos seus itens. Aumentar o overscan melhora a suavidade da rolagem, mas renderiza mais itens fora da tela.Você pode usar os composables useWindowSize (baseado na viewport) ou useElementSize (baseado no container) para tornar as lanes reativas.
Passe uma função getScrollElement na prop virtualize para virtualizar em relação a um container de rolagem ancestral em vez da própria viewport do componente. Defina scrollMargin como o deslocamento da lista em relação ao início do elemento de rolagem (ex.: a altura do conteúdo acima dela).
This header scrolls away with the cards, sharing one scrollbar.
container.scrollTo.shadow não tem efeito nesse modo, já que o root não controla mais a rolagem. Em vez disso, aplique o seu próprio esmaecimento ao container de rolagem.Você pode usar o virtualizer exposto para controlar a posição de rolagem programaticamente.
Você pode usar o composable useInfiniteScroll para carregar mais dados conforme o usuário rola.
useLazyFetch com server: false para buscar os dados no cliente sem bloquear a renderização inicial. O estado de carregamento verifica os status pending e idle para exibir um indicador de carregamento antes e durante a busca. Páginas adicionais são carregadas conforme o usuário rola.Você pode usar o slot padrão sem a prop items para renderizar conteúdo rolável personalizado diretamente.
| Prop | Default | Type |
|---|---|---|
as | 'div' | anyThe element or component this component should render as. |
orientation | 'vertical' | "vertical" | "horizontal"The scroll direction. |
items | T[]Array of items to render. | |
virtualize | false | boolean | ScrollAreaVirtualizeOptions Enable virtualization for large lists. |
shadow | false | boolean | { size?: number ; } | undefinedDisplay fade shadows on the scrollable edges to indicate more content. Pass an object to configure the shadow size (in px). |
ui | { root?: SlotClass; viewport?: SlotClass; item?: SlotClass; } |
| Slot | Type |
|---|---|
default | { item: T; index: number; virtualItem?: VirtualItem | undefined; } | { item: T; index: 0; } |
| Event | Type |
|---|---|
scroll | [isScrolling: boolean] |
Você pode acessar a instância tipada do componente usando useTemplateRef.
<script setup lang="ts">
const scrollArea = useTemplateRef('scrollArea')
// Scroll to a specific item
function scrollToItem(index: number) {
scrollArea.value?.virtualizer?.scrollToIndex(index, { align: 'center' })
}
</script>
<template>
<NScrollArea ref="scrollArea" :items="items" virtualize />
</template>
Isso dará a você acesso ao seguinte:
| Name | Type | Description |
|---|---|---|
$el | HTMLElement | The root element of the component. |
virtualizer | Ref<Virtualizer> | undefined | The TanStack Virtual virtualizer instance (undefined if virtualization is disabled). |
export default defineAppConfig({
ui: {
scrollArea: {
slots: {
root: 'relative outline-accent/25 focus-visible:outline-3',
viewport: 'relative flex',
item: ''
},
variants: {
orientation: {
vertical: {
root: 'overflow-y-auto overflow-x-hidden',
viewport: 'flex-col',
item: ''
},
horizontal: {
root: 'overflow-x-auto overflow-y-hidden',
viewport: 'flex-row',
item: ''
}
},
externalScroll: {
true: {
root: 'overflow-visible'
}
}
}
}
}
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nitro/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
scrollArea: {
slots: {
root: 'relative outline-accent/25 focus-visible:outline-3',
viewport: 'relative flex',
item: ''
},
variants: {
orientation: {
vertical: {
root: 'overflow-y-auto overflow-x-hidden',
viewport: 'flex-col',
item: ''
},
horizontal: {
root: 'overflow-x-auto overflow-y-hidden',
viewport: 'flex-row',
item: ''
}
},
externalScroll: {
true: {
root: 'overflow-visible'
}
}
}
}
}
})
]
})