Skip to content

Commit 1146171

Browse files
committed
fix(VOverlay): trigger scrollStrategy when target is a point
1 parent 2798cbc commit 1146171

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

packages/vuetify/src/components/VOverlay/VOverlay.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ export const VOverlay = genericComponent<OverlaySlots>()({
184184
root,
185185
contentEl,
186186
targetEl,
187+
target,
187188
isActive,
188189
updateLocation,
189190
})

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export interface ScrollStrategyData {
1010
root: Ref<HTMLElement | undefined>
1111
contentEl: Ref<HTMLElement | undefined>
1212
targetEl: Ref<HTMLElement | undefined>
13+
target: Ref<HTMLElement | [x: number, y: number] | undefined>
1314
isActive: Ref<boolean>
1415
updateLocation: Ref<((e: Event) => void) | undefined>
1516
}
@@ -69,13 +70,16 @@ function closeScrollStrategy (data: ScrollStrategyData) {
6970
data.isActive.value = false
7071
}
7172

72-
bindScroll(data.targetEl.value ?? data.contentEl.value, onScroll)
73+
bindScroll(data.target.value ?? data.contentEl.value, onScroll)
7374
}
7475

7576
function blockScrollStrategy (data: ScrollStrategyData, props: StrategyProps) {
7677
const offsetParent = data.root.value?.offsetParent
78+
const target = Array.isArray(data.target.value)
79+
? document.elementFromPoint(...data.target.value)
80+
: data.target.value
7781
const scrollElements = [...new Set([
78-
...getScrollParents(data.targetEl.value, props.contained ? offsetParent : undefined),
82+
...getScrollParents(target, props.contained ? offsetParent : undefined),
7983
...getScrollParents(data.contentEl.value, props.contained ? offsetParent : undefined),
8084
])].filter(el => !el.classList.contains('v-overlay-scroll-blocked'))
8185
const scrollbarWidth = window.innerWidth - document.documentElement.offsetWidth
@@ -136,7 +140,7 @@ function repositionScrollStrategy (data: ScrollStrategyData, props: StrategyProp
136140

137141
ric = (typeof requestIdleCallback === 'undefined' ? (cb: Function) => cb() : requestIdleCallback)(() => {
138142
scope.run(() => {
139-
bindScroll(data.targetEl.value ?? data.contentEl.value, e => {
143+
bindScroll(data.target.value ?? data.contentEl.value, e => {
140144
if (slow) {
141145
// If the position calculation is slow,
142146
// defer updates until scrolling is finished.
@@ -162,7 +166,8 @@ function repositionScrollStrategy (data: ScrollStrategyData, props: StrategyProp
162166
}
163167

164168
/** @private */
165-
function bindScroll (el: HTMLElement | undefined, onScroll: (e: Event) => void) {
169+
function bindScroll (target: HTMLElement | [x: number, y: number] | undefined, onScroll: (e: Event) => void) {
170+
const el = Array.isArray(target) ? document.elementFromPoint(...target) : target
166171
const scrollElements = [document, ...getScrollParents(el)]
167172
scrollElements.forEach(el => {
168173
el.addEventListener('scroll', onScroll, { passive: true })

0 commit comments

Comments
 (0)