useLayoutEffect() with an empty array as the second argument to execute the provided callback only once when the component is mounted.Window.getComputedStyle() to get the overflow value of the body element and store it in a variable.overflow value of the body element with 'hidden' and restore it to its original value when unmounting.const useBodyScrollLock = () => {
React.useLayoutEffect(() => {
const originalStyle = window.getComputedStyle(document.body).overflow;
document.body.style.overflow = 'hidden';
return () => (document.body.style.overflow = originalStyle);
}, []);
};
const Modal = ({ onClose }) => { useBodyScrollLock(); return ( <div style={{ zIndex: 100, background: 'rgba(0,0,0,0.25)', display: 'flex', justifyContent: 'center', alignItems: 'center' }} > <p style={{ padding: 8, borderRadius: 8, background: '#fff' }} onClick={onClose} > Scroll locked! <br /> Click me to unlock </p> </div> ); }; const MyApp = () => { const [modalOpen, setModalOpen] = React.useState(false); return ( <div style={{ height: '400vh', textAlign: 'center', paddingTop: 100, background: 'linear-gradient(to bottom, #1fa2ff, #12d8fa, #a6ffcb)' }} > <button onClick={() => setModalOpen(true)}>Open modal</button> {modalOpen && <Modal onClose={() => setModalOpen(false)} />} </div> ); }; ReactDOM.render(<MyApp />, document.getElementById('root'));
Subscribe to get resources directly to your inbox. You won't receive any spam! ✌️