posts

scroll

Oct 1, 2025 updated Oct 1, 2025 adminux

// 스크롤 감지 후 메뉴 선택 이펙트
useEffect(() => {
		// offset: 고정 헤더 높이 등, 스크롤 위치 계산 시 보정값 (예: 헤더 높이 80px)
		const offset = 80;

		const handleScroll = () => {
				// window.scrollY: 문서 상단부터 현재 스크롤 위치(뷰포트 상단)의 픽셀 수
				// currentPosition: 헤더 높이(offset)만큼 보정한 후, 약간의 여유(1px)를 더하여 계산한 위치
				// 즉, 화면 상단의 헤더 하단 위치를 기준으로 함
				const currentPosition = window.scrollY + offset + 1;

				// sectionIds: 스크롤 감지할 섹션들의 ID 목록
				const sectionIds = [
						SCROLL_ID.KEY_VISUAL,
						SCROLL_ID.OUTLINE,
						SCROLL_ID.ADVANTAGES,
						SCROLL_ID.FEATURES,
						SCROLL_ID.APPLICABLE_TARGETS,
						SCROLL_ID.RESOURCE,
						SCROLL_ID.CONTACT_BANNER,
				];

				for (const id of sectionIds) {
						const el = document.getElementById(id);
						if (el) {
								// top: 문서 상단부터 해당 섹션 요소의 상단까지의 거리 (픽셀 단위)
								// 즉, 섹션의 시작 지점
								const top = el.offsetTop;
								// bottom: 섹션 상단(top)에 섹션의 높이(offsetHeight)를 더한 값
								// 즉, 문서 상단부터 해당 섹션 요소의 하단까지의 거리
								const bottom = top + el.offsetHeight;

								// 조건: currentPosition이 섹션의 상단(top) 이상이고, 섹션의 하단(bottom) 미만일 때
								// -> 화면 상단(헤더 아래) 기준으로 currentPosition이 섹션 내에 들어왔다는 의미
								if (currentPosition >= top && currentPosition < bottom) {
										setActiveMenu(id);
										break;
								}
						}
				}
		};

		window.addEventListener("scroll", handleScroll);
		return () => window.removeEventListener("scroll", handleScroll);
}, []);

감지 조건 및 화면에서의 역할 • currentPosition 이 값은 window.scrollY + offset + 1로 계산되며, 이는 뷰포트 상단에서 offset(예를 들어 헤더 높이 80px)을 더한 위치입니다. 즉, 화면 상단에 고정된 헤더 아래 부분(약 81px 위치)을 기준으로 현재 스크롤 위치를 판단합니다. • top 각 섹션의 상단 위치로, 문서의 맨 위에서 해당 섹션의 시작점까지의 거리를 의미합니다. • bottom 섹션의 시작점(top)에서 섹션 높이(offsetHeight)를 더한 값으로, 해당 섹션의 끝나는 지점을 의미합니다.

감지 기준

현재 코드에서는 currentPosition이 섹션의 top 이상, bottom 미만일 때 그 섹션을 활성화합니다. 즉, 헤더 아래 고정 영역(예: 81px 지점)이 어느 섹션의 시작(top)과 끝(bottom) 사이에 위치하면 그 섹션이 선택됩니다.

예를 들어, 만약 한 섹션의 상단이 200px, 높이가 300px라면: • 섹션의 top: 200px • 섹션의 bottom: 500px • currentPosition이 200px 이상 500px 미만이면 해당 섹션이 활성화됩니다.

따라서, 화면에서 보이는 영역은 브라우저의 현재 스크롤 위치에 따라 달라지지만, 헤더 아래 위치(여기서는 81px 지점 기준)가 섹션의 내부에 들어왔을 때 감지가 이루어집니다.

이 설명과 주석이 현재 코드의 동작과 감지 기준에 대해 충분히 상세하게 설명해줄 것입니다.