diff --git a/.changeset/use-cached-measurements.md b/.changeset/use-cached-measurements.md
new file mode 100644
index 00000000..8eef1f39
--- /dev/null
+++ b/.changeset/use-cached-measurements.md
@@ -0,0 +1,5 @@
+---
+'@tanstack/virtual-core': minor
+---
+
+Add `useCachedMeasurements` option to skip DOM measurement when the list is hidden (e.g. `display: none`). When enabled, the default `measureElement` returns the cached size or `estimateSize` fallback instead of reading the DOM, preventing ResizeObserver from resetting measurements to zero.
diff --git a/docs/api/virtualizer.md b/docs/api/virtualizer.md
index d884804b..0c7c549f 100644
--- a/docs/api/virtualizer.md
+++ b/docs/api/virtualizer.md
@@ -346,6 +346,22 @@ When enabled, defers ResizeObserver measurement processing to the next animation
Only enable this option if you have a specific reason and have measured that it improves your use case.
+### `useCachedMeasurements`
+
+```tsx
+useCachedMeasurements?: boolean
+```
+
+**Default:** `false`
+
+When enabled, the default `measureElement` implementation skips DOM measurement and returns the previously cached size for each item (falling back to `estimateSize` if no cached size exists).
+
+This is useful when the virtualized list is temporarily hidden (e.g. via `display: none` on a parent element). Without this option, the ResizeObserver fires with size `0` for all items when hidden, resetting all measurements. When the list becomes visible again, items may need to be re-measured, which can cause layout shifts.
+
+**Usage:** Toggle this option to `true` before hiding the list and back to `false` when showing it. The ResizeObserver remains attached, so real measurements resume automatically when the flag is turned off and elements become visible again.
+
+> ⚠️ This option only affects the default `measureElement`. If you provide a custom `measureElement`, you are responsible for handling this case yourself.
+
## Virtualizer Instance
The following properties and methods are available on the virtualizer instance:
diff --git a/packages/react-virtual/e2e/app/cached-measurements/index.html b/packages/react-virtual/e2e/app/cached-measurements/index.html
new file mode 100644
index 00000000..56f418f6
--- /dev/null
+++ b/packages/react-virtual/e2e/app/cached-measurements/index.html
@@ -0,0 +1,10 @@
+
+
+