본문 바로가기
Javascript

페이지 스크롤 진행률을 표시해보자 - 상단 progress-bar 만들기

by 즐코딩 2023. 2. 11.
반응형

페이지 스크롤 진행률을 표시해 보자 - 상단 progress-bar 만들기


이전 2개의 포스팅에서 이벤트 리스너를 달고, scroll을 감지하는 내용을 배우고 정리해 보았습니다. 이런 것들은 배우고 익혀서 대체 어디에 써먹을 수 있을까요?

웹사이트를 서핑하다 보면, 이렇게 페이지 상단에 프로그래스 바를 만들어 두고 본문을 얼마큼 읽었는지 표시해 주는 UI를 만나는 경우가 있습니다. 왠지, 스크롤 전체 높이를 알고, 현재 스크롤한 값을 알 수만 있다면 Javascript로 구현을 할 수 있겠다는 생각이 들지 않은가요?

웹페이지-상단에서-스크롤-진행-상태를-표시해주는-바를-만들어봅시다
웹페이지 상단에서 스크롤 진행 상태를 표시해주는 바를 만들어봅시다


scroll 이벤트를 배웠으니, 당장 써먹어 보도록 합니다.

세로 높이가 긴 문서 준비


예제로 활용할 HTML 문서는 다음과 같이 만들어봤습니다.
VSCode에서 lorem * 500 정도 주고 tab 키를 누르면 더미 TEXT를 만들 수 있습니다.

lorem*500(붙여-써주고)--Tab키를-쳐줍니다.
lorem*500(붙여 써주고)  Tab키를 쳐줍니다.


대충 요정도 코드로 만든 html 문서를 활용해보록 해보겠습니다.

<style>
  .container {
    position: fixed;
    top: 10px;
    height: 50px;
    width: 100%;
  }

  .progress-bar {
    width: 0;
    height: 10px;
    background-color: blue;
  }
  #veryLongText {
    padding-top: 50px; 
  }
</style>

<body>
    <div class="container">
      <div class="progress-bar"></div>
    </div>
    <div id="veryLongText">
      lorem*500  <!-- 500 뒤에서 tab 키를 눌러서 더미 TEXT를 만들어주세요 -->
    </div>
</body>
긴-더미-Text가-만들어졌습니다
긴 더미 Text가 만들어졌습니다


스크롤 이벤트 감지하기


스크롤 이벤트를 감지하기 위해서는 addEventListener를 달아줘야겠죠? 어디에 다는 게 좋을까요?
문서 전체를 스크롤할 거니까, 더미 text가 있는 div 보다는 window에 달아주는 게 낫겠죠?

<script>
  window.addEventListener("scroll", function () {
    const scrollTop = document.querySelector("html").scrollTop;
    const scrollHeight = document.querySelector("html").scrollHeight;
    const clientHeight = document.querySelector("html").clientHeight;

    console.log("scrollTop: ", scrollTop);
    console.log("clientHeight: ", clientHeight);
    console.log("scrollHeight: ", scrollHeight);
  });
</script>


본문 위에서 마우스로 휠버튼을 돌려 스크롤을 해보면, html 태그를 기준으로 scrollTop, clientHeight, scrollHeight가 잘 찍히는 것을 확인할 수 있습니다.

console.log를-이용해서-scrollTop,-scrollHeight,-clientHeight를-찍어봅니다.
console.log를 이용해서 scrollTop, scrollHeight, clientHeight를 찍어봅니다.


아래 내용은 이전 포스팅에서 정리했었습니다,

scrollTop의 최댓값 + clientHeight = scrollHeight



JS로 CSS 조작하기


위에서 확보한 scroll 관련한 값들을 계산을 해준 이후에, 아래 CSS에 적용을 해주면 되지 않을까요?

.progress-bar {
  width: 0;      // 현재 가로폭이 0% 니까, 세로 스크롤이 50%라면 이 숫자를 50%로 바꿔주면?
  height: 10px;
  background-color: blue;
}


JS 코드를 다음과 같이 작성해 봅니다.

<script>
  window.addEventListener("scroll", function () {
    const scrollTop = document.querySelector("html").scrollTop;
    const scrollHeight = document.querySelector("html").scrollHeight;
    const clientHeight = document.querySelector("html").clientHeight;

    console.log("scrollTop: ", scrollTop);
    console.log("clientHeight: ", clientHeight);
    console.log("scrollHeight: ", scrollHeight);

    // 아래 수식은 전체 세로폭 중 현재까지 스크롤한 값을 백분률 환산
    // 브라우저 최하단까지 스크롤을 내리면 100%가 됩니다.
    const progress = ((scrollTop + clientHeight) / scrollHeight) * 100;
    
    // 위에서 얻은 progress 값을 div.progress-bar의 width에 써줍니다.
    document.querySelector(".progress-bar").style.width = progress + "%";
  });
</script>


백분율 환산식은 초등학교 산수.
현재 진행범위를 전체 범위로 나눠서 x100 했습니다.(때마침 width는 % 단위를 쓰고 있으니까요.)

브라우저에서 실행해 보면, 요렇게 최초 실행이 됩니다.

완성된-코드를-처음-실행했을-때의-모습
완성된 코드를 처음 실행했을 때의 모습


본문 위에 마우스를 두고 스크롤 다운을 해보면,

스크롤을-해보면,-상단-progress-bar가-채워져-나갑니다
스크롤을 해보면, 상단 progress bar가 채워져 나갑니다


이런 모습으로 상단에서 progress-bar가 스크롤할 때마다 실시간으로 우측으로 채워져 나갑니다.

문서 최하단까지 스크롤되어, 100%로 채워진 모습입니다.

progress-bar가-꽉-채워진-모습(-width:-100%까지)
progress-bar가 꽉 채워진 모습( width: 100%까지)


마우스 휠을 위로 올려서 스크롤 업을 해보면, progress-bar는 다시 비율대로 줄어듭니다.
스크롤 높이에 반응하는 프로그레스 바를 간단하게 구현해 보았습니다.

마치며


저 또한 지금까지는 마우스 휠 이벤트를 사용할 일이 크게 없었더래서 눈대중으로 대충 동작원리만 파악하고 있었던 영역이었는데요, 이전 2개의 포스팅에서 scroll 이벤트들을 이해하면서 정리하고 났더니, 직접 코드를 작성하는 데 10분도 걸리지 않았습니다.

구글링을 해서 다른 사람이 작성한 코드를 가져다가 사용하는 것도 좋지만, 간단한 것들은 후다닥 스스로 만들어서 사용하는 것도 좋겠습니다. 만들 줄 알면, 다른 사람의 코드들을 가져다 사용하는 것도 매우 손쉬울 것이겠구요.

이렇게 scroll 이벤트를 활용하기 시작하면, Front-end에서는 하고 싶은 것들을 정말 많이 할 수 있는 것 같습니다. 전통적인 웹 제작방식에 있어서, Back-end 개발자들이 크게 관심을 두고 있지 않은 영역이기도 하구요.

조금 복잡한 느낌이 들어도, 이전에 작성한 포스팅들을 참고하시고 꼭 한번 scroll 이벤트를 내 것으로 만들어 두시기 바랍니다. 코딩 활용 근육이 한층 더 성장하게 되는 순간을 만나게 될 것입니다.

오늘도 즐거운 코딩 하세요~


즐거운 코딩생활, 즐코딩.
KINcoding.

반응형

댓글