diff --git a/packages/block-editor/src/components/block-popover/use-popover-scroll.js b/packages/block-editor/src/components/block-popover/use-popover-scroll.js index 5dfa74005a4081..2d3158e57d0ba7 100644 --- a/packages/block-editor/src/components/block-popover/use-popover-scroll.js +++ b/packages/block-editor/src/components/block-popover/use-popover-scroll.js @@ -17,14 +17,22 @@ function usePopoverScroll( contentRef ) { const effect = useRefEffect( ( node ) => { function onWheel( event ) { - const { deltaX, deltaY } = event; + const { deltaX, deltaY, target } = event; const contentEl = contentRef.current; let scrollContainer = scrollContainerCache.get( contentEl ); if ( ! scrollContainer ) { scrollContainer = getScrollContainer( contentEl ); scrollContainerCache.set( contentEl, scrollContainer ); } - scrollContainer.scrollBy( deltaX, deltaY ); + // Finds a scrollable ancestor of the event’s target. It's not cached because the + // it may not remain scrollable due to popover position changes. The cache is also + // less likely to be utilized because the target may be different every event. + const eventScrollContainer = getScrollContainer( target ); + // Scrolls “through” the popover only if another contained scrollable area isn’t + // in front of it. This is to avoid scrolling both containers simultaneously. + if ( ! node.contains( eventScrollContainer ) ) { + scrollContainer.scrollBy( deltaX, deltaY ); + } } // Tell the browser that we do not call event.preventDefault // See https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners