React
[javascript, React] 스크롤 비활성화 하기
joy_lee
2022. 5. 9. 17:45
Modal을 만들었는데, Modal이 떠있을 땐 뒷쪽 화면이 스크롤 되지 않도록 설정하고 싶었다.
스크롤을 막는 방법 몇 가지가 있었다.
1. class를 통해 스크롤 방지하기
1
2
3
4
|
.stop-scrolling {
height: 100%;
overflow: hidden;
}
|
cs |
1
2
3
|
body.classList.add("stop-scrolling")
// body.classList.remove("stop-scrolling")
|
cs |
stop-scrolling이라는 class를 추가해 스크롤을 막고, modal이 사라질 때 class를 제거하는 방법으로 스크롤을 막을 수 있다.
이 경우, Modal을 띄우는 스크롤 위치가 맨 위일 땐 원하는대로 작동한다. 하지만 스크롤을 내린 후에는 아래로는 움직이지 않지만 위로는 움직일 수 있게 된다.
2. javascript를 통해 스크롤 방지하기
window.addEventListener를 통해 스크롤 이벤트가 일어날 때 막는 코드를 작성한다.
데스크탑, 모바일 상황 모두 사용가능한 상황이라면 경우의 수를 따져 모두 작성해주어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
// left: 37, up: 38, right: 39, down: 40,
// spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36
var keys = {37: 1, 38: 1, 39: 1, 40: 1};
function preventDefault(e) {
e.preventDefault();
}
function preventDefaultForScrollKeys(e) {
if (keys[e.keyCode]) {
preventDefault(e);
return false;
}
}
// modern Chrome requires { passive: false } when adding event
var supportsPassive = false;
try {
window.addEventListener("test", null, Object.defineProperty({}, 'passive', {
get: function () { supportsPassive = true; }
}));
} catch(e) {}
var wheelOpt = supportsPassive ? { passive: false } : false;
var wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel';
// call this to Disable
function disableScroll() {
window.addEventListener('DOMMouseScroll', preventDefault, false); // older FF
window.addEventListener(wheelEvent, preventDefault, wheelOpt); // modern desktop
window.addEventListener('touchmove', preventDefault, wheelOpt); // mobile
window.addEventListener('keydown', preventDefaultForScrollKeys, false);
}
// call this to Enable
function enableScroll() {
window.removeEventListener('DOMMouseScroll', preventDefault, false);
window.removeEventListener(wheelEvent, preventDefault, wheelOpt);
window.removeEventListener('touchmove', preventDefault, wheelOpt);
window.removeEventListener('keydown', preventDefaultForScrollKeys, false);
}
|
cs |
React에서 사용할 경우
React에서 Modal component를 만들고 component가 생성될 때 disableScroll을 실행하고, 제거될 때 enableScroll을 실행해 다시 스크롤 가능하도록 한다.
1
2
3
4
5
6
7
|
useEffect(() => {
// modal이 떠 있을 땐 스크롤 막음
disableScroll();
// modal 닫히면 다시 스크롤 가능하도록 함
return () => enableScroll();
}, []);
|
cs |
참고한 사이트