Svelte VirtualScrollList

Demo

API


export let data = []
export let size = 0
export let scrollTop = 0

/**
 * @param {number} scrollTop
 * @param {boolean} [animation]
 */
export async function scrollToWithListScrollTop(scrollTop, animation)

/**
 * @param {number} offset
 * @param {boolean} animation
 */
export async function scrollListOffset(offset, animation)

/**
 * @param {number} percent 0-1
 * @param {boolean} [animation]
 */
export async function scrollToPercent(percent, animation)

/**
 * @param {number} index
 * @param {boolean} [animation]
 */
export async function scrollToPosition(index, animation)

export async function reset()

usage

<script>
  import VirtualScrollList from "@yuanliwei/svelte-virtual-list";
  import { getName } from "./data.js";

  let datas = Array.from({ length: 1000000 }).map((_, i) => ({
    id: i + 1,
    text: getName(i),
  }));

  let showList1 = true;
  let showList2 = true;
  let scrollTop1 = 0;
  let scrollTop2 = 0;
  /** @type{VirtualScrollList} */
  let list1 = null;
  /** @type{VirtualScrollList} */
  let list2 = null;

  let list1Position = 0;
  let list2Position = 0;

  $: list1?.scrollToPosition(list1Position);
  $: list2?.scrollToPosition(list2Position);
</script>

<main>
  <section>
    <p>虚拟列表,100万条数据</p>
    <div class="content">
      {#if showList1}
        <VirtualScrollList
          data={datas}
          bind:scrollTop={scrollTop1}
          sticky={10} 
          let:item
          let:index
          bind:this={list1}
        >
          <div class="item">{index} : {item.text}</div>
        </VirtualScrollList>
      {/if}
    </div>

    <button on:click={() => { showList1 = !showList1; }} > toggle </button>
    <button on:click={() => { list1.scrollToPercent(0.7, true); }} > scrollToPercent(0.7, true) </button>
    <button on:click={() => { list1.scrollToPosition(34, true); }} > scrollToPosition(34, true) </button>
    <button on:click={() => { list1.scrollListOffset(390, true); }} > scrollListOffset(390, true) </button>
    <input type="number" placeholder="seek to" bind:value={list1Position} />
  </section>
  <section>
    <p>虚拟列表+虚拟数据,1万亿条数据</p>
    <div class="content">
      {#if showList2}
        <VirtualScrollList
          size={100000000000}
          bind:scrollTop={scrollTop2}
          let:index
          bind:this={list2}
        >
          <div class="item">{index} : {getName(index)}</div>
        </VirtualScrollList>
      {/if}
    </div>

    <button on:click={() => { showList2 = !showList2; }} > toggle </button>
    <button on:click={() => { list2.scrollToPercent(0.7, true); }} > scrollToPercent(0.7, true) </button>
    <button on:click={() => { list2.scrollToPosition(34, true); }} > scrollToPosition(34, true) </button>
    <button on:click={() => { list2.scrollListOffset(390, true); }} > scrollListOffset(390, true) </button>
    <button on:click={() => { list2.reset(); }} > reset() </button>
    <input type="number" placeholder="move to" bind:value={list2Position} />
  </section>
</main>

<style>
  main {
    display: flex;
  }
  section {
    padding: 1em;
  }
  .content {
    background-color: aliceblue;
    height: 400px;
    margin-top: 1em;
    box-sizing: border-box;
  }
  .item {
    line-height: 3em;
    padding-left: 1em;
    box-sizing: border-box;
    border-bottom: blue 1px solid;
    overflow: hidden;
    width: 100%;
  }
</style>

Top categories

svelte logo

Want a Svelte site built?

Hire a Svelte developer
Loading Svelte Themes