import getScrollBarSize from './getScrollBarSize'; import setStyle from './setStyle'; function isBodyOverflowing() { return ( document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight) && window.innerWidth > document.body.offsetWidth ); } let cacheStyle = {}; export default (close?: boolean) => { if (!isBodyOverflowing() && !close) { return; } // https://github.com/ant-design/ant-design/issues/19729 const scrollingEffectClassName = 'ant-scrolling-effect'; const scrollingEffectClassNameReg = new RegExp(`${scrollingEffectClassName}`, 'g'); const bodyClassName = document.body.className; if (close) { if (!scrollingEffectClassNameReg.test(bodyClassName)) return; setStyle(cacheStyle); cacheStyle = {}; document.body.className = bodyClassName.replace(scrollingEffectClassNameReg, '').trim(); return; } const scrollBarSize = getScrollBarSize(); if (scrollBarSize) { cacheStyle = setStyle({ position: 'relative', width: `calc(100% - ${scrollBarSize}px)`, }); if (!scrollingEffectClassNameReg.test(bodyClassName)) { const addClassName = `${bodyClassName} ${scrollingEffectClassName}`; document.body.className = addClassName.trim(); } } };