Skip to content

Commit 06c4c91

Browse files
committed
fix(VOverlay): don't use content element as scroll parent
1 parent 22d5dd5 commit 06c4c91

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

packages/vuetify/src/components/VOverlay/scrollStrategies.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,12 @@ function closeScrollStrategy (data: ScrollStrategyData) {
7070
data.isActive.value = false
7171
}
7272

73-
bindScroll(data.target.value ?? data.contentEl.value, onScroll)
73+
bindScroll(getTargetEl(data.target.value, data.contentEl.value), onScroll)
7474
}
7575

7676
function blockScrollStrategy (data: ScrollStrategyData, props: StrategyProps) {
7777
const offsetParent = data.root.value?.offsetParent
78-
const target = Array.isArray(data.target.value)
79-
? document.elementFromPoint(...data.target.value)
80-
: data.target.value
78+
const target = getTargetEl(data.target.value, data.contentEl.value)
8179
const scrollElements = [...new Set([
8280
...getScrollParents(target, props.contained ? offsetParent : undefined),
8381
...getScrollParents(data.contentEl.value, props.contained ? offsetParent : undefined),
@@ -140,7 +138,7 @@ function repositionScrollStrategy (data: ScrollStrategyData, props: StrategyProp
140138

141139
ric = (typeof requestIdleCallback === 'undefined' ? (cb: Function) => cb() : requestIdleCallback)(() => {
142140
scope.run(() => {
143-
bindScroll(data.target.value ?? data.contentEl.value, e => {
141+
bindScroll(getTargetEl(data.target.value, data.contentEl.value), e => {
144142
if (slow) {
145143
// If the position calculation is slow,
146144
// defer updates until scrolling is finished.
@@ -165,9 +163,16 @@ function repositionScrollStrategy (data: ScrollStrategyData, props: StrategyProp
165163
})
166164
}
167165

168-
/** @private */
169-
function bindScroll (target: HTMLElement | [x: number, y: number] | undefined, onScroll: (e: Event) => void) {
170-
const el = Array.isArray(target) ? document.elementFromPoint(...target) : target
166+
function getTargetEl (
167+
target: HTMLElement | [x: number, y: number] | undefined,
168+
contentEl: HTMLElement | undefined,
169+
) {
170+
return Array.isArray(target)
171+
? document.elementsFromPoint(...target).find(el => !contentEl?.contains(el))
172+
: target ?? contentEl
173+
}
174+
175+
function bindScroll (el: Element | undefined, onScroll: (e: Event) => void) {
171176
const scrollElements = [document, ...getScrollParents(el)]
172177
scrollElements.forEach(el => {
173178
el.addEventListener('scroll', onScroll, { passive: true })

0 commit comments

Comments
 (0)