예전에 작업을 하면서 스크롤 스파이는 플러그인을 사용했었는데
그때 생각했던게 나중에는 직접 구현을 해봐야지! 라고 생각했어서
이번에는 직접 구현을 해보았다😎
Javascript 코드
// 윈도우 스크롤 이벤트 (스크롤을 했을 때 발생)
window.addEventListener("scroll", () => {
// 1. 섹션들을 querySelectorAll을 통해 변수에 담는다.
const sections = document.querySelectorAll("section");
// 2. Gnb 메뉴들을 querySelectorAll을 통해 변수에 담는다.
const gnbItems = document.querySelectorAll(".gnb__item");
// 3. forEach 문을 통해 섹션들을 한번씩 순회한다.
// 이때 index도 같이 가져온다.
sections.forEach((section, index) => {
const top = window.scrollY; //현재 Y값
const sectionTop = section.offsetTop - 40; // 섹션 상단의 Y값 - Gnb메뉴 높이 값
const sectionHeight = section.offsetHeight; // 섹션 높이
// 4. forEach 문을 통해 Gnb 메뉴들을 한번씩 순회한다.
gnbItems.forEach((gnbItem) => {
// 5. 스크롤 위치가 섹션 상단 스크롤 위치보다 크고 && 섹션높이값보다 작을 경우
if (top >= sectionTop && top < sectionTop + sectionHeight) {
// 6. Gnb 메뉴들의 active 클래스를 전부 지운다.
gnbItem.classList.remove("active");
// 7. 해당 index에 해당하는 Gnb 메뉴의 클래스에만 active 클래스명을 추가한다.
gnbItems[index].classList.add("active");
}
});
});
});
결과물
See the Pen Untitled by Happy Hee (@8happyhee) on CodePen.
혹시나 더 좋은 코드가 있다면 추후 수정해야지.
- 끝 -
'Javascript' 카테고리의 다른 글
[Javascript] 함수 선언식 & 함수 표현식 & 화살표 함수 (0) | 2023.06.17 |
---|---|
[Javascript] 호이스팅(hoisting) (0) | 2023.06.15 |
[Javascript] 메뉴 클릭시 네비게이션 높이만큼 띄우고 섹션으로 이동하기 (0) | 2023.02.10 |
[Javascript] 내 사이트에 구글 지도 사용하기 (Google map API) 🗺️ (0) | 2023.02.09 |
[Javascript] 스크롤 방향 감지하기 (위/아래 방향 알아내기) ↕️ (0) | 2023.02.06 |