스크롤 이벤트 오류(namespace)

J-silver·2025년 1월 3일

특정영역일때 헤더가 사라졌다가 나타나게하기
열심히 검색해서 겨우 구현했는데 반응형시에 위치를 엉뚱하게 잡아 맨위로 올라갈때 헤더가 아예 안나옴...

그래서 비활성화했더니 화면 줄어들고 늘어날때 다른 스크롤 이벤트인 btn이 아예 안먹음...하...

ScrollTrigger.matchMedia({
    "(max-width:1023px)":function(){
      // 비활성화
      $(window).off("scroll");
    },
    "(min-width:1024px)": function(){
  
      let lastScroll = 0;
      let isInProjectArea = false; // project-area에 들어갔는지 여부를 추적
   
      $(window).scroll(function () {
        const curr = $(this).scrollTop(); // 현재 스크롤 위치
        const projectAreaOffset = $(".project-area").offset().top; // .project-area의 상단 위치
        const projectAreaHeight = $(".project-area").outerHeight(); // .project-area의 높이
        const projectAreaEnd = projectAreaOffset + projectAreaHeight; // .project-area의 하단 위치

        // .project-area에 진입하면 헤더를 항상 숨김
        if (curr >= projectAreaOffset && curr <= projectAreaEnd) {
          if (!isInProjectArea) {
            // .project-area에 처음 진입한 경우
            $(".header").fadeOut();
            isInProjectArea = true; // .project-area 내부로 상태 갱신
          }
        } else {
          // .project-area를 벗어나면 헤더를 다시 표시
          if (isInProjectArea) {
            $(".header").fadeIn();
            isInProjectArea = false; // .project-area 외부로 상태 갱신
          }
        }

        // 마지막 스크롤 위치 업데이트
        lastScroll = curr;
      });
    }
  })

✅ 네임스페이스(namespace)를 이용해서 헤더만 콕 찝어서 스크롤 안주면 된다!

ScrollTrigger.matchMedia({
  "(max-width:1023px)": function () {
    // 헤더 관련 스크롤 이벤트 제거
    $(window).off("scroll.headerFade");
  },
  "(min-width:1024px)": function () {
    let isInProjectArea = false;

    // 헤더 페이드 처리 이벤트 등록
    $(window).on("scroll.headerFade", function () {
      const curr = $(this).scrollTop();
      const projectAreaOffset = $(".project-area").offset().top;
      const projectAreaHeight = $(".project-area").outerHeight();
      const projectAreaEnd = projectAreaOffset + projectAreaHeight;

      if (curr >= projectAreaOffset && curr <= projectAreaEnd) {
        if (!isInProjectArea) {
          $(".header").fadeOut();
          isInProjectArea = true;
        }
      } else {
        if (isInProjectArea) {
          $(".header").fadeIn();
          isInProjectArea = false;
        }
      }
    });
  }
})

네임스페이스(namespace)는 고유한 이름 공간을 제공해 충돌을 막준다. 쉽게말해, 나중에 이 이벤트만 골라서 삭제하거나 관리하기 위해서입니다.

.headerFade는 이벤트의 네임스페이스(namespace)를 의미
네임스페이스는 특정 이벤트를 그룹화하거나, 해당 그룹의 이벤트만 선택적으로 제거(off)하거나 추가(on)할 수 있도록 해주는 기능

profile
달리는 거북이

0개의 댓글