Skip to content

Commit 83ec5e5

Browse files
authored
Disable scroll when menu has been opened (#177)
1 parent 8dd045e commit 83ec5e5

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-accessible-dropdown-menu-hook",
3-
"version": "2.1.0",
3+
"version": "2.1.1",
44
"description": "A simple Hook for creating fully accessible dropdown menus in React",
55
"main": "dist/use-dropdown-menu.js",
66
"types": "dist/use-dropdown-menu.d.ts",

src/use-dropdown-menu.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,19 @@ export default function useDropdownMenu(itemCount: number) {
8686
return () => document.removeEventListener('click', handleEveryClick);
8787
}, [isOpen]);
8888

89+
// Disable scroll when the menu is opened, and revert back when the menu is closed
90+
useEffect(() => {
91+
const disableArrowScroll = (event: KeyboardEvent) => {
92+
if (isOpen && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {
93+
event.preventDefault();
94+
}
95+
};
96+
97+
document.addEventListener('keydown', disableArrowScroll);
98+
99+
return () => document.removeEventListener('keydown', disableArrowScroll);
100+
}, [isOpen]);
101+
89102
// Create a handler function for the button's clicks and keyboard events
90103
const buttonListener = (e: React.KeyboardEvent | React.MouseEvent) => {
91104
// Detect if event was a keyboard event or a mouse event

test/puppeteer/demo.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,33 @@ it('focuses on the menu button after pressing escape', async () => {
4848
expect(await currentFocusID()).toBe('menu-button');
4949
});
5050

51+
it('disables scroll by arrow key when menu is open', async () => {
52+
await page.setViewport({
53+
width: 1000,
54+
height: 500,
55+
});
56+
57+
await page.click('#menu-button');
58+
await menuOpen();
59+
60+
const currentScrollY = await page.evaluate(() => window.scrollY);
61+
await page.keyboard.down('ArrowDown');
62+
await sleep(1000); // Give page time to scroll
63+
expect(await page.evaluate(() => window.scrollY)).toBe(currentScrollY);
64+
});
65+
66+
it('does not disable scroll by arrow key when menu is closed', async () => {
67+
await page.setViewport({
68+
width: 1000,
69+
height: 500,
70+
});
71+
72+
const currentScrollY = await page.evaluate(() => window.scrollY);
73+
await page.keyboard.press('ArrowDown');
74+
await sleep(1000); // Give page time to scroll
75+
expect(await page.evaluate(() => window.scrollY)).toBeGreaterThan(currentScrollY);
76+
});
77+
5178
it('focuses on the next item in the tab order after pressing tab', async () => {
5279
await page.focus('#menu-button');
5380
await page.keyboard.down('Enter');

0 commit comments

Comments
 (0)