diff --git a/docs/app/experiments/scroll-lock.tsx b/docs/app/experiments/scroll-lock.tsx index 1c0d62f3c..a608806ca 100644 --- a/docs/app/experiments/scroll-lock.tsx +++ b/docs/app/experiments/scroll-lock.tsx @@ -11,7 +11,7 @@ export default function ScrollLock() { useScrollLock(enabled); React.useEffect(() => { - document.body.style.overflowY = bodyScrollY ? 'auto' : ''; + document.body.style.overflowY = bodyScrollY ? 'scroll' : ''; }, [bodyScrollY]); return ( @@ -59,8 +59,8 @@ export default function ScrollLock() { - {[...Array(longContent ? 100 : 10)].map(() => ( -

Scroll locking text content

+ {[...Array(longContent ? 100 : 10)].map((_, i) => ( +

Scroll locking text content

))} ); diff --git a/packages/mui-base/src/utils/useScrollLock.ts b/packages/mui-base/src/utils/useScrollLock.ts index e45641a1d..f41b1bfaf 100644 --- a/packages/mui-base/src/utils/useScrollLock.ts +++ b/packages/mui-base/src/utils/useScrollLock.ts @@ -1,8 +1,8 @@ import { isIOS } from './detectBrowser'; import { useEnhancedEffect } from './useEnhancedEffect'; -let originalStyles = {}; - +let originalRootStyles = {}; +let originalBodyStyles = {}; let preventScrollCount = 0; let restore: () => void = () => {}; @@ -13,7 +13,9 @@ function preventScrollIOS() { function preventScrollStandard() { const html = document.documentElement; + const body = document.body; const rootStyle = html.style; + const bodyStyle = body.style; let resizeRaf: number; let scrollX: number; @@ -28,7 +30,7 @@ function preventScrollStandard() { scrollX = rootStyle.left ? parseFloat(rootStyle.left) : window.scrollX; scrollY = rootStyle.top ? parseFloat(rootStyle.top) : window.scrollY; - originalStyles = { + originalRootStyles = { position: rootStyle.position, top: rootStyle.top, left: rootStyle.left, @@ -36,6 +38,9 @@ function preventScrollStandard() { overflowX: rootStyle.overflowX, overflowY: rootStyle.overflowY, }; + originalBodyStyles = { + overflow: bodyStyle.overflow, + }; Object.assign(rootStyle, { // Handle `scrollbar-gutter` in Chrome when there is no scrollable content. @@ -48,11 +53,16 @@ function preventScrollStandard() { overflowX: html.scrollWidth > html.clientWidth || hasConstantOverflowX ? 'scroll' : 'hidden', }); + // Ensure two scrollbars can't appear since `` now has a forced scrollbar, but the + // `` may have one too. + bodyStyle.overflow = 'hidden'; + return undefined; } function cleanup() { - Object.assign(rootStyle, originalStyles); + Object.assign(rootStyle, originalRootStyles); + Object.assign(bodyStyle, originalBodyStyles); if (window.scrollTo.toString().includes('[native code]')) { window.scrollTo(scrollX, scrollY);