본문 바로가기
공부 정리/jsChallenge

js Challenge day 13

by 경적필패. 2023. 2. 8.
반응형

scroll event

 

Code

  <script>
    const debounce = (func, wait = 20, immediate = true) => {
      let timeout;
      return (e) => {
        let context = e.target, args = [func, wait, immediate];
        let later = () => {
          timeout = null;
          if (!immediate) func.apply(context, args);
        };
        let callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
      }
    }
    const sliderImages = document.querySelectorAll('.slide-in');

    const checkSlide = () => {
      sliderImages.forEach(sliderImage => {
        // console.log(window.scrollY, window.innerHeight, sliderImage.height);
        const slideInAt = (window.scrollY + window.innerHeight) - sliderImage.height / 2;

        const imageBottom = sliderImage.offsetTop + sliderImage.height;
        const isHalfShown = slideInAt > sliderImage.offsetTop;
        const isNotScrolledPast = window.scrollY < imageBottom;
        console.log(window.scrollY, imageBottom)
        if (isHalfShown && isNotScrolledPast) {
          sliderImage.classList.add('active');
        } else {
          sliderImage.classList.remove('active');
        }
      })
    }
    window.addEventListener('scroll', debounce(checkSlide));

  </script>

 

배운 점 & 느낀 점

 

과제자체는 간단했지만 배울 것이 많았습니다.

scrollY, innerHight, offsetTop같은 속성들을 평소에 잘 안써서 까먹었는데, 이번에 다시 정리했습니다.

scollY = 스크롤 얼마 내렸는지

innerHight = 브라우저 안 화면 높이

offsetTop = 최상단에서 컨텐츠 위까지 높이

 

또한, debounce 코드를 분석하며 debounce 원리에 대해 다시한번 복습했습니다.

위 코드에서는 debounce함수를 실행하고, 20ms의 시간을 준다음 추가 함수가 생기면 시간을 더해주고, 아니라면 0의 시간을 줘서 콜백함수를 실행시킵니다.

여기서 새로알게 된것은, setTimeout이 호출된만큼 수를 리턴한다는 것을 알게되었습니다.

 

반응형

'공부 정리 > jsChallenge' 카테고리의 다른 글

js challenge day 15  (0) 2023.02.11
js challenge day 14  (0) 2023.02.10
js challenge day 12  (0) 2023.02.07
js challenge day 11  (0) 2023.02.06
js challenge day10  (0) 2023.02.03

댓글