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 = {371381391401};
 
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"nullObject.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

 

 

참고한 사이트

http://daplus.net/javascript-%EC%9D%BC%EC%8B%9C%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%8A%A4%ED%81%AC%EB%A1%A4%EC%9D%84-%EB%B9%84%ED%99%9C%EC%84%B1%ED%99%94%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80-%EB%AC%B4%EC%97%87/

 

[javascript] 일시적으로 스크롤을 비활성화하는 방법은 무엇입니까? - 리뷰나라

scrollTo jQuery 플러그인을 사용하고 있으며 Javascript를 통해 window 요소에서 일시적으로 스크롤을 비활성화 할 수 있는지 알고 싶습니다. 스크롤을 사용하지 않으려는 이유는 scrollTo가 애니메이션을

daplus.net

https://velog.io/@jeonghoheo/React-Hooks%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%9B%85%EC%8A%A4%EC%9D%98-%EA%B8%B0%EB%B3%B8-Part-1-2jjxpaobgg

 

React Hooks(리액트 훅스!)의 기본 Part 2

React hooks image Part1에서는 Hook을 통해 Class가 아닌 function(함수)만으로 state를 생성하고 갱신하는 방법을 알아보았습니다. 그러나 우리는 그것을 넘어서 state의 라이프 사이클을 다루고 싶습니다.

velog.io