logo

Bottom to Top Mode

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

Message 50: Short message

12:00:48 PM

Message 49: Short message

11:59:48 AM

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

11:58:48 AM

Message 47: Short message

11:57:48 AM

Message 46: Short message

11:56:48 AM

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

11:55:48 AM

Message 44: Short message

11:54:48 AM

Message 43: Short message

11:53:48 AM

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

11:52:48 AM

Message 41: Short message

11:51:48 AM

Message 40: Short message

11:50:48 AM

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

11:49:48 AM

Message 38: Short message

11:48:48 AM

Message 37: Short message

11:47:48 AM

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

11:46:48 AM

Message 35: Short message

11:45:48 AM

Message 34: Short message

11:44:48 AM

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

11:43:48 AM

Message 32: Short message

11:42:48 AM

Message 31: Short message

11:41:48 AM

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

11:40:48 AM

Message 29: Short message

11:39:48 AM

Message 28: Short message

11:38:48 AM

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

11:37:48 AM

Message 26: Short message

11:36:48 AM

Message 25: Short message

11:35:48 AM

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

11:34:48 AM

Message 23: Short message

11:33:48 AM

Message 22: Short message

11:32:48 AM

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

11:31:48 AM

Message 20: Short message

11:30:48 AM

Message 19: Short message

11:29:48 AM

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

11:28:48 AM

Message 17: Short message

11:27:48 AM

Message 16: Short message

11:26:48 AM

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

11:25:48 AM

Message 14: Short message

11:24:48 AM

Message 13: Short message

11:23:48 AM

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

11:22:48 AM

Message 11: Short message

11:21:48 AM

Message 10: Short message

11:20:48 AM

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

11:19:48 AM

Message 8: Short message

11:18:48 AM

Message 7: Short message

11:17:48 AM

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

11:16:48 AM

Message 5: Short message

11:15:48 AM

Message 4: Short message

11:14:48 AM

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

11:13:48 AM

Message 2: Short message

11:12:48 AM

Message 1: Short message

11:11:48 AM

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

11:10:48 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