logo

Bottom to Top Mode

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

Message 50: Short message

1:22:36 PM

Message 49: Short message

1:21:36 PM

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

1:20:36 PM

Message 47: Short message

1:19:36 PM

Message 46: Short message

1:18:36 PM

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

1:17:36 PM

Message 44: Short message

1:16:36 PM

Message 43: Short message

1:15:36 PM

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

1:14:36 PM

Message 41: Short message

1:13:36 PM

Message 40: Short message

1:12:36 PM

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

1:11:36 PM

Message 38: Short message

1:10:36 PM

Message 37: Short message

1:09:36 PM

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

1:08:36 PM

Message 35: Short message

1:07:36 PM

Message 34: Short message

1:06:36 PM

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

1:05:36 PM

Message 32: Short message

1:04:36 PM

Message 31: Short message

1:03:36 PM

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

1:02:36 PM

Message 29: Short message

1:01:36 PM

Message 28: Short message

1:00:36 PM

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

12:59:36 PM

Message 26: Short message

12:58:36 PM

Message 25: Short message

12:57:36 PM

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

12:56:36 PM

Message 23: Short message

12:55:36 PM

Message 22: Short message

12:54:36 PM

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

12:53:36 PM

Message 20: Short message

12:52:36 PM

Message 19: Short message

12:51:36 PM

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

12:50:36 PM

Message 17: Short message

12:49:36 PM

Message 16: Short message

12:48:36 PM

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

12:47:36 PM

Message 14: Short message

12:46:36 PM

Message 13: Short message

12:45:36 PM

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

12:44:36 PM

Message 11: Short message

12:43:36 PM

Message 10: Short message

12:42:36 PM

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

12:41:36 PM

Message 8: Short message

12:40:36 PM

Message 7: Short message

12:39:36 PM

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

12:38:36 PM

Message 5: Short message

12:37:36 PM

Message 4: Short message

12:36:36 PM

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

12:35:36 PM

Message 2: Short message

12:34:36 PM

Message 1: Short message

12:33:36 PM

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

12:32:36 PM

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