-
-
Notifications
You must be signed in to change notification settings - Fork 426
Expand file tree
/
Copy pathGridVirtualizerDynamic.svelte
More file actions
57 lines (52 loc) · 1.64 KB
/
GridVirtualizerDynamic.svelte
File metadata and controls
57 lines (52 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<script lang="ts">
import { createVirtualizer } from '@tanstack/svelte-virtual'
let virtualListEl = $state<HTMLDivElement | null>(null)
let makeGetScrollElement = (scrollElement: HTMLDivElement | null) => () =>
scrollElement
let rowVirtualizer = $derived(
createVirtualizer<HTMLDivElement, HTMLDivElement>({
count: 10000,
getScrollElement: makeGetScrollElement(virtualListEl),
estimateSize: () => 35,
overscan: 5,
}),
)
let columnVirtualizer = $derived(
createVirtualizer<HTMLDivElement, HTMLDivElement>({
horizontal: true,
count: 10000,
getScrollElement: makeGetScrollElement(virtualListEl),
estimateSize: () => 100,
overscan: 5,
}),
)
</script>
<div class="list scroll-container" bind:this={virtualListEl}>
<div
style="position: relative; height: {$rowVirtualizer.getTotalSize()}px; width: {$columnVirtualizer.getTotalSize()}px;"
>
{#each $rowVirtualizer.getVirtualItems() as row (row.index)}
{#each $columnVirtualizer.getVirtualItems() as col (col.index)}
<div
class={col.index % 2
? row.index % 2 === 0
? 'list-item-odd'
: 'list-item-even'
: row.index % 2
? 'list-item-odd'
: 'list-item-even'}
style="position: absolute; top: 0; left: 0; width: {col.size}px; height: {row.size}px; transform: translateX({col.start}px) translateY({row.start}px);"
>
Cell {row.index}, {col.index}
</div>
{/each}
{/each}
</div>
</div>
<style>
.scroll-container {
height: 500px;
width: 500px;
overflow: auto;
}
</style>