Skip to content

Commit 9740885

Browse files
committed
fix: don't calculate position until displayed
1 parent 8f26001 commit 9740885

File tree

2 files changed

+35
-32
lines changed

2 files changed

+35
-32
lines changed

src/lib/Popdown.svelte

+8-4
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,18 @@
1313
export let calcTop: null | CalcPosition = null;
1414
export let zIndex: null | number = null;
1515
16-
let trigger: Writable<HTMLElement> = writable();
17-
let windowSize: Writable<number[]> = writable();
18-
let content: Writable<HTMLElement> = writable();
16+
const trigger: Writable<HTMLElement> = writable();
17+
const windowSize: Writable<number[]> = writable();
18+
const content: Writable<HTMLElement> = writable();
19+
const displayContent: Writable<boolean> = writable(showContent);
20+
21+
$: displayContent.set(showContent);
1922
2023
const bindTrigger = (el: HTMLElement) => {
2124
$trigger = el.firstChild instanceof HTMLElement ? el.firstChild : el;
2225
};
2326
24-
let targetElement: Writable<HTMLElement> = writable();
27+
const targetElement: Writable<HTMLElement> = writable();
2528
2629
const updateTargetElement = (target: string | HTMLElement): void => {
2730
if (isBrowser && typeof target === 'string') {
@@ -38,6 +41,7 @@
3841
$: updateTargetElement(target);
3942
4043
const contentTransformStyle = createContentTransformStyleStore(
44+
displayContent,
4145
windowSize,
4246
targetElement,
4347
trigger,

src/lib/stores/popdown.ts

+27-28
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { calcTranslateX, calcTranslateY } from '../util/popdown-translate';
44
export type CalcPosition = (triggerPosition: number) => number;
55

66
export const createContentTransformStyleStore = (
7+
showContent: Readable<boolean>,
78
windowSize: Readable<number[]>,
89
scrollParent: Readable<HTMLElement>,
910
trigger: Writable<HTMLElement>,
@@ -42,41 +43,39 @@ export const createContentTransformStyleStore = (
4243
);
4344

4445
return derived(
45-
[windowSize, trigger, ancestorOffset],
46+
[showContent, windowSize, trigger, ancestorOffset],
4647
// eslint-disable-next-line @typescript-eslint/no-unused-vars
47-
([_windowSize, $trigger, $ancestorOffset]) => {
48+
([$showContent, _windowSize, $trigger, $ancestorOffset]) => {
49+
if (!$trigger || !$showContent) return '';
4850
let translateX = '';
4951
let translateY = '';
50-
if ($trigger) {
51-
const {
52-
left: triggerLeft,
53-
right: triggerRight,
54-
top: triggerTop,
55-
bottom: triggerBottom,
56-
width: triggerWidth,
57-
height: triggerHeight,
58-
} = $trigger.getBoundingClientRect();
52+
const {
53+
left: triggerLeft,
54+
right: triggerRight,
55+
top: triggerTop,
56+
bottom: triggerBottom,
57+
width: triggerWidth,
58+
height: triggerHeight,
59+
} = $trigger.getBoundingClientRect();
5960

60-
const { left: offsetLeft, top: offsetTop } = $ancestorOffset || {
61-
left: 0,
62-
top: 0,
63-
};
64-
65-
if (calcLeft) {
66-
translateX = String(calcLeft(triggerLeft));
67-
} else {
68-
translateX = calcTranslateX(position, triggerRight, triggerLeft, offsetLeft, triggerWidth);
69-
}
61+
const { left: offsetLeft, top: offsetTop } = $ancestorOffset || {
62+
left: 0,
63+
top: 0,
64+
};
7065

71-
if (calcTop) {
72-
translateY = String(calcTop(triggerLeft));
73-
} else {
74-
translateY = calcTranslateY(position, triggerTop, offsetTop, triggerBottom, triggerHeight);
75-
}
66+
if (calcLeft) {
67+
translateX = String(calcLeft(triggerLeft));
68+
} else {
69+
translateX = calcTranslateX(position, triggerRight, triggerLeft, offsetLeft, triggerWidth);
70+
}
7671

77-
return `translate(${translateX}, ${translateY})`;
72+
if (calcTop) {
73+
translateY = String(calcTop(triggerLeft));
74+
} else {
75+
translateY = calcTranslateY(position, triggerTop, offsetTop, triggerBottom, triggerHeight);
7876
}
79-
return '';
77+
78+
return `translate(${translateX}, ${translateY})`;
8079
},
8180
);
8281
};

0 commit comments

Comments
 (0)