Svelte Virtual List logo

Get started with Svelte Virtual List

Svelte Virtual List is a high-performance virtual list component for Svelte 5 applications that efficiently renders large datasets with minimal memory usage.

Features

  • Dynamic item height handling - no fixed height required
  • Bi-directional scrolling - support for top-to-bottom and bottom-to-top modes
  • Automatic resize handling for dynamic content
  • TypeScript support with full type safety
  • SSR compatible with hydration support
  • Svelte 5 runes and snippets support
  • Programmatic scrolling with the scroll method
  • Infinite scroll support with onLoadMore
  • Memory-optimized for 10k+ items

Installation

# Using npm
npm install @humanspeak/svelte-virtual-list

# Using pnpm (recommended)
pnpm add @humanspeak/svelte-virtual-list

# Using yarn
yarn add @humanspeak/svelte-virtual-list
# Using npm
npm install @humanspeak/svelte-virtual-list

# Using pnpm (recommended)
pnpm add @humanspeak/svelte-virtual-list

# Using yarn
yarn add @humanspeak/svelte-virtual-list

Basic Usage

The simplest way to use Svelte Virtual List is to pass an array of items and a render snippet:

<script lang="ts">
    import VirtualList from '@humanspeak/svelte-virtual-list'

    const items = Array.from({ length: 10000 }, (_, i) => ({
        id: i,
        text: `Item ${i}`
    }))
</script>

<VirtualList {items}>
    {#snippet renderItem(item)}
        <div class="item">{item.text}</div>
    {/snippet}
</VirtualList>
<script lang="ts">
    import VirtualList from '@humanspeak/svelte-virtual-list'

    const items = Array.from({ length: 10000 }, (_, i) => ({
        id: i,
        text: `Item ${i}`
    }))
</script>

<VirtualList {items}>
    {#snippet renderItem(item)}
        <div class="item">{item.text}</div>
    {/snippet}
</VirtualList>
Item 0
Item 1
Item 2
Item 3
Item 4
Item 5
Item 6
Item 7
Item 8
Item 9
Item 10
Item 11
Item 12
Item 13
Item 14
Item 15
Item 16
Item 17
Item 18
Item 19
Item 20

The component only renders items that are visible in the viewport, plus a configurable buffer. This means you can render lists with thousands of items without performance issues.

Variable Heights

One of the key features is automatic handling of variable item heights. Items are measured after rendering and the list automatically adjusts:

Chat-Style Lists (Bottom to Top)

For chat applications and similar interfaces, use mode="bottomToTop" to anchor the list at the bottom:

<VirtualList items={messages} mode="bottomToTop">
    {#snippet renderItem(message)}
        <div class="message">{message.text}</div>
    {/snippet}
</VirtualList>
<VirtualList items={messages} mode="bottomToTop">
    {#snippet renderItem(message)}
        <div class="message">{message.text}</div>
    {/snippet}
</VirtualList>

Message 50: Short message

5:14:00 AM

Message 49: Short message

5:13:00 AM

Message 48: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

5:12:00 AM

Message 47: Short message

5:11:00 AM

Message 46: Short message

5:10:00 AM

Message 45: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

5:09:00 AM

Message 44: Short message

5:08:00 AM

Message 43: Short message

5:07:00 AM

Message 42: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

5:06:00 AM

Message 41: Short message

5:05:00 AM

Message 40: Short message

5:04:00 AM

Message 39: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

5:03:00 AM

Message 38: Short message

5:02:00 AM

Message 37: Short message

5:01:00 AM

Message 36: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

5:00:00 AM

Message 35: Short message

4:59:00 AM

Message 34: Short message

4:58:00 AM

Message 33: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:57:00 AM

Message 32: Short message

4:56:00 AM

Message 31: Short message

4:55:00 AM

Message 30: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:54:00 AM

Message 29: Short message

4:53:00 AM

Message 28: Short message

4:52:00 AM

Message 27: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:51:00 AM

Message 26: Short message

4:50:00 AM

Message 25: Short message

4:49:00 AM

Message 24: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:48:00 AM

Message 23: Short message

4:47:00 AM

Message 22: Short message

4:46:00 AM

Message 21: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:45:00 AM

Message 20: Short message

4:44:00 AM

Message 19: Short message

4:43:00 AM

Message 18: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:42:00 AM

Message 17: Short message

4:41:00 AM

Message 16: Short message

4:40:00 AM

Message 15: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:39:00 AM

Message 14: Short message

4:38:00 AM

Message 13: Short message

4:37:00 AM

Message 12: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:36:00 AM

Message 11: Short message

4:35:00 AM

Message 10: Short message

4:34:00 AM

Message 9: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:33:00 AM

Message 8: Short message

4:32:00 AM

Message 7: Short message

4:31:00 AM

Message 6: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:30:00 AM

Message 5: Short message

4:29:00 AM

Message 4: Short message

4:28:00 AM

Message 3: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:27:00 AM

Message 2: Short message

4:26:00 AM

Message 1: Short message

4:25:00 AM

Message 0: This is a longer message that spans multiple lines to demonstrate variable height support in the virtual list component.

4:24:00 AM

Props Reference

PropTypeDefaultDescription
itemsT[]RequiredArray of items to render
defaultEstimatedItemHeightnumber40Initial height estimate used until items are measured
mode'topToBottom' \| 'bottomToTop''topToBottom'Scroll direction and anchoring behavior
bufferSizenumber20Number of items rendered outside the viewport
debugbooleanfalseEnable debug logging and visualizations
containerClassstring''Class for outer container
viewportClassstring''Class for scrollable viewport
contentClassstring''Class for content wrapper
itemsClassstring''Class for items container
onLoadMore() => void \| Promise<void>-Callback for infinite scroll
loadMoreThresholdnumber20Items from end to trigger onLoadMore
hasMorebooleantrueSet to false when all data has been loaded

Learn More