Virtual Scroll Comparison

@pdanpdan/virtual-scroll vs. other main Vue 3 virtualization libraries. Versions, publish dates and bundle sizes were checked on August 30, 2026.

Virtual scrolling looks like a solved problem until you need grid mode, window scrolling, or keyboard navigation and find out the library you picked only does one axis with fixed heights. Most comparisons online are either marketing or written for React, so this page sticks to Vue 3 and to what each package ships today, not what its README promised three years ago.

Six libraries made the cut: this one, the veteran vue-virtual-scroller, the headless @tanstack/vue-virtual, the small and fast virtua, vueuc (a utility collection that happens to include a virtual list), and vue-virtual-scroll-list, which is here mostly to show what an unmaintained package looks like.

The Contenders

PackageLatestPublishedGitHub starsMin / gzipAPI style
@pdanpdan/virtual-scroll0.11.22026-08-301256.1 / 17.4 kBComponent + composables + extensions
vue-virtual-scroller3.0.52026-08-1210,80055.4 / 16.6 kBComponents (Scroller, RecycleScroller, DynamicScroller, TableScroller)
@tanstack/vue-virtual3.13.362026-08-187,100 (monorepo)23.0 / 7.0 kBHeadless composable (useVirtualizer)
virtua0.50.62026-08-273,70014.3 / 6.1 kBComponents (VList, VGrid) + handle
vueuc0.4.662026-08-19313n/a (utility collection)Component (VVirtualList)
vue-virtual-scroll-list2.3.52023-05-294,50014.3 / 4.6 kBComponent

Bundle sizes: min+gzip of the package's own code (regular dependencies bundled, Vue external), measured from the npm tarballs with esbuild; vue-virtual-scroller via bundlephobia. @tanstack/vue-virtual is split into two packages, so the number covers both: the Vue adapter is ~0.5 kB gzip, @tanstack/virtual-core (3.17.8, the version it depends on) is ~6.7 kB gzip — together 7.0 kB, which is what lands in your bundle. The whole virtua package covers React, Vue, Solid, Svelte and Angular — the Vue entry alone is roughly 3 kB, per its README.

Feature Matrix

Feature@pdanpdan
/virtual-scroll
vue-virtual-
scroller
@tanstack
/vue-virtual
virtuavueucvue-virtual-
scroll-list
Vertical list
Horizontal list
Two-dimensional grid🟠🟠
Window (page) scrolling
Fixed item sizes
Measured dynamic item sizes🟠
RTL🟠
Sticky elements / headers
Keyboard navigation
Scroll snapping🟠
Custom / virtual scrollbars🟠
Infinite loading🟠🟠🟠
Scroll restoration (prepend)🟠
Smooth programmatic scroll
SSR support
Beyond browser max element height
Table virtualization🟠🟠
TypeScript

✅ built-in  •  🟠 partial, limited, or requires custom code  •  ❌ not supported

Notes on the Orange Cells

🟠
@tanstack/vue-virtual

Headless by design — you own the markup, so everything not listed as ✅ is work you do yourself. Grid means composing two virtualizers, RTL is an isRtl flag that its own ecosystem describes as partial, and there is no scrollbar or snap logic to borrow. In exchange you get the smallest footprint of the serious options and total control.

🟠
virtua

The grid is literally named experimental_VGrid, and its own README still lists sticky and keyboard navigation as things it is “aiming” to support. What is shipped is fast and the window-scroll story is good. One codebase for five frameworks — impressive, but issues get filed against the shared core.

🟠
vue-virtual-scroll-list

Sized via an estimate cache (estimate-size), never measured, so scrollbar accuracy is approximate. The last release is from May 2023, the README still reads like Vue 2, and there are no TypeScript types. Its 4,500 stars are historical.

🟠
vue-virtual-scroller

Infinite loading means wiring your own scroll listener. It renders its own scroll container, so page scrolling needs a wrapper that reports to it. Solid components, and v3.0 is still actively released, but the feature set has stayed roughly the same since the Vue 2 days.

🟠
vueuc

VVirtualList powers Naive UI's large lists and it works, but vueuc is an internal utility collection — the author's README says: “I'm too lazy to write them since I'm the only one that uses the library.” Adopting it means depending on Naive UI's private parts.

Where Each One Wins

  • @pdanpdan/virtual-scroll — the only option that covers grid + window scrolling + RTL + sticky + keyboard navigation out of the box, and the only one that virtualizes past the browser's max element height. It is also the largest, and at 12 stars it has no community to fall back on.
  • vue-virtual-scroller — the safe, boring choice. Ten years of production use, active releases, every layout problem already answered on GitHub. You give up window scrolling, RTL and anything 2D.
  • @tanstack/vue-virtual — when the list is just a list and you want the smallest dependency with the most control. You will write the rest yourself, which is fine for one axis of fixed or measured items.
  • virtua — the current speed champion with the best cross-framework story. Window scrolling and measured sizes just work; everything beyond a plain list is still maturing.
  • vueuc — only makes sense if you are already on Naive UI.
  • vue-virtual-scroll-list — don't start new projects with it.

Bottom Line

If your list is vertical and your items have known sizes, every current library works — pick by bundle size or familiarity. The differences only show up when you need the second axis, the page as the scroll container, sticky headers, keyboard support, or lists that outgrow the browser's height limit. That is exactly where @pdanpdan/virtual-scroll is positioned, and the trade-off is a bigger bundle and a young project. The demos on this site — grid, blog, spreadsheet, tree, masonry — are each a feature the competitors cannot do without custom code, so this page doubles as the pitch.

Sources: npm registry, GitHub API and project READMEs, checked on 2026-08-30. vue-virtual-scroller  •  @tanstack/vue-virtual  •  virtua  •  vueuc  •  vue-virtual-scroll-list