Skip to content

Commit cad1f52

Browse files
authored
fix: cherry pick of fixing sticky issue (#1232)
* fix: sticky event loop * chore: adjust script
1 parent 489e40f commit cad1f52

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"prettier": "prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"",
4343
"test": "vitest --watch false",
4444
"coverage": "vitest run --coverage",
45-
"prepublishOnly": "npm run compile && np --no-cleanup --yolo --no-publish",
45+
"prepublishOnly": "npm run compile && np --no-cleanup --yolo --no-publish --any-branch",
4646
"lint": "eslint src/ --ext .tsx,.ts",
4747
"tsc": "tsc -p tsconfig.json --noEmit",
4848
"now-build": "npm run docs:build",

src/stickyScrollBar.tsx

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ const StickyScrollBar: React.ForwardRefRenderFunction<unknown, StickyScrollBarPr
9292
};
9393

9494
const checkScrollBarVisible = () => {
95+
raf.cancel(rafRef.current);
96+
9597
rafRef.current = raf(() => {
9698
if (!scrollBodyRef.current) {
9799
return;
@@ -144,13 +146,27 @@ const StickyScrollBar: React.ForwardRefRenderFunction<unknown, StickyScrollBarPr
144146
};
145147
}, [scrollBarWidth, isActive]);
146148

149+
// Loop for scroll event check
147150
React.useEffect(() => {
148-
const onScrollListener = addEventListener(container, 'scroll', checkScrollBarVisible, false);
149-
const onResizeListener = addEventListener(window, 'resize', checkScrollBarVisible, false);
151+
if (!scrollBodyRef.current) return;
152+
153+
const scrollParents: HTMLElement[] = [];
154+
let parent: HTMLElement = scrollBodyRef.current;
155+
while (parent) {
156+
scrollParents.push(parent);
157+
parent = parent.parentElement;
158+
}
159+
160+
scrollParents.forEach(p => p.addEventListener('scroll', checkScrollBarVisible, false));
161+
window.addEventListener('resize', checkScrollBarVisible, false);
162+
window.addEventListener('scroll', checkScrollBarVisible, false);
163+
container.addEventListener('scroll', checkScrollBarVisible, false);
150164

151165
return () => {
152-
onScrollListener.remove();
153-
onResizeListener.remove();
166+
scrollParents.forEach(p => p.removeEventListener('scroll', checkScrollBarVisible));
167+
window.removeEventListener('resize', checkScrollBarVisible);
168+
window.removeEventListener('scroll', checkScrollBarVisible);
169+
container.removeEventListener('scroll', checkScrollBarVisible);
154170
};
155171
}, [container]);
156172

0 commit comments

Comments
 (0)