Svelte Virtual List logo

Bottom to Top Mode

Perfect for chat interfaces and messaging apps where new content appears at the bottom.

Message 50: Short message

5:15:13 AM

Message 49: Short message

5:14:13 AM

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

5:13:13 AM

Message 47: Short message

5:12:13 AM

Message 46: Short message

5:11:13 AM

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

5:10:13 AM

Message 44: Short message

5:09:13 AM

Message 43: Short message

5:08:13 AM

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

5:07:13 AM

Message 41: Short message

5:06:13 AM

Message 40: Short message

5:05:13 AM

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

5:04:13 AM

Message 38: Short message

5:03:13 AM

Message 37: Short message

5:02:13 AM

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

5:01:13 AM

Message 35: Short message

5:00:13 AM

Message 34: Short message

4:59:13 AM

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

4:58:13 AM

Message 32: Short message

4:57:13 AM

Message 31: Short message

4:56:13 AM

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

4:55:13 AM

Message 29: Short message

4:54:13 AM

Message 28: Short message

4:53:13 AM

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

4:52:13 AM

Message 26: Short message

4:51:13 AM

Message 25: Short message

4:50:13 AM

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

4:49:13 AM

Message 23: Short message

4:48:13 AM

Message 22: Short message

4:47:13 AM

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

4:46:13 AM

Message 20: Short message

4:45:13 AM

Message 19: Short message

4:44:13 AM

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

4:43:13 AM

Message 17: Short message

4:42:13 AM

Message 16: Short message

4:41:13 AM

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

4:40:13 AM

Message 14: Short message

4:39:13 AM

Message 13: Short message

4:38:13 AM

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

4:37:13 AM

Message 11: Short message

4:36:13 AM

Message 10: Short message

4:35:13 AM

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

4:34:13 AM

Message 8: Short message

4:33:13 AM

Message 7: Short message

4:32:13 AM

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

4:31:13 AM

Message 5: Short message

4:30:13 AM

Message 4: Short message

4:29:13 AM

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

4:28:13 AM

Message 2: Short message

4:27:13 AM

Message 1: Short message

4:26:13 AM

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

4:25:13 AM

Usage

Set mode="bottomToTop" to enable chat-style scrolling:

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

    const messages = [
        { id: 1, text: 'Hello!', sender: 'them' },
        { id: 2, text: 'Hi there!', sender: 'me' },
        { id: 3, text: 'How are you?', sender: 'them' }
    ]
</script>

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

    const messages = [
        { id: 1, text: 'Hello!', sender: 'them' },
        { id: 2, text: 'Hi there!', sender: 'me' },
        { id: 3, text: 'How are you?', sender: 'them' }
    ]
</script>

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

Behavior

  • List starts scrolled to the bottom (most recent content visible)
  • New items added to the end appear at the bottom
  • Scroll position is maintained when new items arrive
  • Works seamlessly with infinite scroll for loading older messages

Best Practices

  1. Keep newest at the end: Append new messages to the end of your array
  2. Load older on scroll up: Use onLoadMore to load historical messages
  3. Maintain scroll position: The component handles this automatically when items are added