fix(ui): prevent virtual items mounting offscreen
This commit is contained in:
@@ -334,7 +334,31 @@ export default function VirtualItem(props: VirtualItemProps) {
|
|||||||
// Ignore measurement failures; IntersectionObserver will correct us.
|
// Ignore measurement failures; IntersectionObserver will correct us.
|
||||||
}
|
}
|
||||||
|
|
||||||
intersectionCleanup = subscribeToSharedObserver(wrapperRef, targetRoot, margin, (entry) => {
|
const wrapperEl = wrapperRef
|
||||||
|
intersectionCleanup = subscribeToSharedObserver(wrapperEl, targetRoot, margin, (entry) => {
|
||||||
|
// IntersectionObserver can produce transient false-positives during pane
|
||||||
|
// activation/layout transitions (e.g. `isIntersecting: true` for items far
|
||||||
|
// outside the scroll root). For element roots, prefer explicit rect math.
|
||||||
|
if (targetRoot && !(targetRoot instanceof Document)) {
|
||||||
|
// When rootBounds is null we cannot trust the entry; treat as hidden.
|
||||||
|
if (entry.rootBounds === null) {
|
||||||
|
queueVisibility(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const rootRect = (targetRoot as Element).getBoundingClientRect()
|
||||||
|
const visible = shouldRenderByRects({
|
||||||
|
wrapperRect: wrapperEl.getBoundingClientRect(),
|
||||||
|
rootRect: { top: rootRect.top, bottom: rootRect.bottom },
|
||||||
|
margin,
|
||||||
|
})
|
||||||
|
queueVisibility(visible)
|
||||||
|
return
|
||||||
|
} catch {
|
||||||
|
// Fall through to the entry-based heuristic.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const nextVisible = shouldRenderEntry(entry)
|
const nextVisible = shouldRenderEntry(entry)
|
||||||
queueVisibility(nextVisible)
|
queueVisibility(nextVisible)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user