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

7:45:26 AM

Message 49: Short message

7:44:26 AM

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

7:43:26 AM

Message 47: Short message

7:42:26 AM

Message 46: Short message

7:41:26 AM

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

7:40:26 AM

Message 44: Short message

7:39:26 AM

Message 43: Short message

7:38:26 AM

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

7:37:26 AM

Message 41: Short message

7:36:26 AM

Message 40: Short message

7:35:26 AM

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

7:34:26 AM

Message 38: Short message

7:33:26 AM

Message 37: Short message

7:32:26 AM

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

7:31:26 AM

Message 35: Short message

7:30:26 AM

Message 34: Short message

7:29:26 AM

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

7:28:26 AM

Message 32: Short message

7:27:26 AM

Message 31: Short message

7:26:26 AM

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

7:25:26 AM

Message 29: Short message

7:24:26 AM

Message 28: Short message

7:23:26 AM

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

7:22:26 AM

Message 26: Short message

7:21:26 AM

Message 25: Short message

7:20:26 AM

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

7:19:26 AM

Message 23: Short message

7:18:26 AM

Message 22: Short message

7:17:26 AM

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

7:16:26 AM

Message 20: Short message

7:15:26 AM

Message 19: Short message

7:14:26 AM

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

7:13:26 AM

Message 17: Short message

7:12:26 AM

Message 16: Short message

7:11:26 AM

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

7:10:26 AM

Message 14: Short message

7:09:26 AM

Message 13: Short message

7:08:26 AM

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

7:07:26 AM

Message 11: Short message

7:06:26 AM

Message 10: Short message

7:05:26 AM

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

7:04:26 AM

Message 8: Short message

7:03:26 AM

Message 7: Short message

7:02:26 AM

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

7:01:26 AM

Message 5: Short message

7:00:26 AM

Message 4: Short message

6:59:26 AM

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

6:58:26 AM

Message 2: Short message

6:57:26 AM

Message 1: Short message

6:56:26 AM

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

6:55:26 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