On this page
Overview
TanStack Virtual calculates positions for rendering only the visible portion of long lists and grids plus a small buffer. Its headless design lets React, Vue, Svelte, and other interfaces retain their own markup and styling.
Features and best fit
Hands-on tested within the scope below · Content checked:
Key features
Best fit
Before adoption
3.17.11 / macOS, Node.js 26.7.0, isolated temporary npm project
Executed the pinned @tanstack/virtual-core API example and verified 9,10,11,12,13; no browser or external service was used.
Official sources
- [1]TanStack/virtual README at 78371e851e90(2026-10-05)
- [2]Virtual official documentation(2026-10-05)
- [3]@tanstack/virtual-core 3.17.11 package source(2026-10-05)
- [4]TanStack/virtual LICENSE at 78371e851e90(2026-10-05)
- [5]TanStack/virtual GitHub metadata(2026-10-05)
Supplemental curator note
It is useful when a long list must render fewer elements without surrendering its design. Start by passing known viewport and offset values to the core API and checking the overscanned range.
Try it in 3 steps
- 1
Prepare the pinned core package
Requires Node.js and npm. Create a temporary project pinned to virtual-core 3.17.11.
demo=$(mktemp -d "${TMPDIR:-/tmp}/tanstack-virtual.XXXXXX") && cd "$demo" && npm init -y >/dev/null && npm install --save-exact @tanstack/virtual-core@3.17.11 - 2
Provide virtual-list measurements
Model 100 thirty-pixel items in a 90-pixel viewport at offset 300, with one overscan item on each side.
printf '%s\n' 'import {Virtualizer} from '\''@tanstack/virtual-core'\''' 'let setRect,setOffset' 'const v=new Virtualizer({count:100,getScrollElement:()=>({}),estimateSize:()=>30,overscan:1,observeElementRect:(_,cb)=>{setRect=cb;return()=>{}},observeElementOffset:(_,cb)=>{setOffset=cb;return()=>{}},scrollToFn(){}})' 'v._didMount();v._willUpdate()' 'setRect({width:300,height:90});setOffset(300,false)' 'console.log(v.getVirtualItems().map(item=>item.index).join('\'','\''))' > demo.mjs - 3
Verify the render range
Require indices 9 through 13: visible items 10–12 plus one overscan item on either side.
test "$(node demo.mjs)" = "9,10,11,12,13"
Growth
Growth trends · Last 30 days
7,128 Stars
Trend data is still being collected.
Development activity
Last 90 days · weekly
- Commits (last 30 days)
- 15
- Open PRs
- 38
Development activity is still being collected.
Built with
Categories and tags
Categories
GitHub data
GitHub dataView detailed GitHub data
GitHub Topics
- react
- reactjs
- virtualization
- virtualized
- javascript
- scrolling
- performance
- solid
- solidjs
- svelte
- vue
- Stars
- 7,128
- Forks
- 472
- Watchers
- 34
- Open issues
- 82
- Contributors
- 152
- Owner type
- Organization
- Primary language
- TypeScript
- License
- MIT
- Repository last updated
- Sep 21, 2026
Related information
Write a related articleShare a guide or use case for this OSS in Markdown. Articles are published after administrator approval.
Explore next
- Table28,474 Stars
5 shared tag(s) · 1 shared category(s) · Same language
A headless library for composing table sorting, filtering, and pagination without prescribing markup
TypeScript - TanStack Query50,394 Stars
3 shared tag(s) · 1 shared category(s) · Same language
Manage fetching, caching, refetching, and mutations for remote server state outside local UI-state code
TypeScript - Onsen UI8,854 Stars
3 shared tag(s) · 1 shared category(s)
build iOS- and Android-style interfaces from shared HTML and JavaScript with Web Components
JavaScript - Storybook91,200 Stars
3 shared tag(s) · Same language
capture UI states once and reuse them across docs, interaction tests, and agent tooling
TypeScript - Router15,152 Stars
3 shared tag(s) · Same language
A type-safe React router that connects routes, search parameters, and navigation through one inferred type model
TypeScript - Builder.io SDKs8,863 Stars
3 shared tag(s) · Same language
Connect a hosted visual-development platform to existing React, Vue, Svelte, and other frontends through open SDKs
TypeScript
Report incorrect information
Tell us if any listing information is incorrect or outdated.