공부공부

스크롤 하면 섹션에 따라 nav 메뉴가 활성화 되도록

avocadooooo 2022. 1. 19. 00:12
const boxes = document.querySelectorAll('.box');
      const options = {
        root: document.querySelector('.container'),
        rootMargin: '0px',
        threshold: 0.2
      }

      const callback = (entries, observer) => {
        entries.forEach(entry => {
          if(entry.isIntersecting){
            entry.target.classList.add('active');
          }else{
            entry.target.classList.remove('active');
          }
        })
      };

      const observer = new IntersectionObserver(callback, options);
      boxes.forEach(box => observer.observe(box));

 

1. 모든 섹션 요소들과 메뉴 아이템들을 가져온다.

** 배열을 돌면서 각각의 아이디를 섹션 돔 요소로 변환하는 것 : map

   -> sectionIds 배열을 만들고 이걸 map을 통해 돔요소로 복사하여 만든다.

   -> 그럼 화면을 움직이면서 section을 찾을 때, navItems에서 동일한 것을 찾으면 된다.

const sectionIds = [
    '#home',
    '#about',
    '#skills',
    '#work',
    '#contact'
];    

const sections = sectionIds.map(id => document.querySelector(id));
const navItems = sectionIds.map(id => document.querySelector(`[data-link="${id}"]`));

const observerOptions = {
    root: null,
    rootMargin: '0px',
    threshold: 0.3,
}

const observerCallback = (entries, observer) => {
    entries.forEach(entry => {
        if(!entry.isIntersecting){
            const index = sectionIds.indexOf(`#${entry.target.id}`);
            
            
        }else{
            console.error(entry.target.id);
        }
    })
};

 

2. IntersectionObserver를 이용해서 모든 섹션들을 관찰한다.

3. 보여지는 섹션에 해당하는 메뉴 아이템을 활성화 시킨다.

   -> 화면을 처음 띄웠을 때 work가 활성화되는 이유?

       콘솔창에 entry를 출력하면 일부 섹션의 콜백함수가 호출된 것을 확인할 수 있다.

       그걸 다시 뜯어보면 intersectionRatio가 0인 상태로 나온다.

       -> 페이지를 띄우자 마자 해당 섹션들은 화면 밖으로 나가 있어서 볼 수 없다.

        MDN 사이트에서 정의한 intersectionRatio

The degree of intersection between the target element and its root is the intersection ratio
. This is a representation of the percentage of the target element which is visible as a value between 0.0 and 1.0.

 

** window.addEventListener('scroll', () =

scroll은 모든 스크롤 액트에 해당하는 것

-> 자동으로 스크롤 이동하는 경우에도 observer가 콜백함수를 호출하는 현상이 발생함

 

** window.addEventListener('wheel', () =

-> 반면에 wheel은 사용자가 직접 스크롤을 내리는 경우만 해당한다.