본문 바로가기
Front-end/애니메이션

스크롤에 따른 반응형 인터랙션 만들기

by mooyou 2025. 3. 21.
728x90
300x250
SMALL

스크롤 이벤트를 이용하여 사용자가 페이지를 스크롤할 때마다 화면에 변화가 생기는 반은형 애니메이션을 만들ㅇ보자

 

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>스크롤 반응형 애니메이션</title>
  <style>
    .section {
      height: 100vh;
      background-color: #f0f0f0;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 2em;
      opacity: 0;
      transition: opacity 1s ease-in-out;
    }
    .section.visible {
      opacity: 1;
    }
  </style>
</head>
<body>
  <div class="section">Section 1</div>
  <div class="section">Section 2</div>
  <div class="section">Section 3</div>

  <script>
    window.addEventListener('scroll', () => {
      const sections = document.querySelectorAll('.section');
      sections.forEach(section => {
        const rect = section.getBoundingClientRect();
        if (rect.top >= 0 && rect.top <= window.innerHeight) {
          section.classList.add('visible');
        } else {
          section.classList.remove('visible');
        }
      });
    });
  </script>
</body>
</html>

 

코드 설명

  • 스크롤 시 각 섹션이 화면에 보일 때마다 서서히 나타나는 효과를 구현
  • addEventListener는 이벤트 리스너를 추가하는 메서드로 이 메서드를 사용하면 브라우저가 특정 이벤트(예: 클릭, 스크롤 등)를 감지할 때마다 실행될 함수를 지정할 수 있다. 여기서는 scroll이벤트를 감지해서 페이지를 스크롤할 때마다 해당 함수가 실행되도록 설정
  • getBoundingClientRect()는 요소의 위치와 크기를 반환하는 메서드로 요소의 상대적인 위치와 현재 뷰포트에 대한 크기를 알려준다. 이 메서드를 사용하여 각 섹션의위치를 파악하고, 화면에 들어왔을 때 visible 클래스를 추가하여 opacity를 변경한다.
  • getBoundingClientRect() 반환 값은 top, right, bottom, left, width, height 등의 속성을 포함한다.
  • 이 코드에서 react.top을 사용하여 각 섹션의 상단에 얼마나 가까운지 확인하고 있다.
  • window.innerHeights는 브라우저 창의 보이는 영역의 높이를 나타낸다. 즉, 사용자가 볼 수 있는 화면의 크기를 말한다.

 

전체 동작 과정

  1. 페이지가 스크롤될 때마다 scroll 이벤트가 발생, 그때마다 addEventListener로 등록된 함수가 실행됨
  2. querySelectorAll('.section')으로 모든 .section 클래스를 가진 요소를 선택한다.
  3. 각 .section요소의 getBoundingClientRect()를 호출하여 해당 요소가 현재 화면에서 어디에 위치하는지 파악한다.
  4. rect.top 값이 화면 안쪽(window.innerHeight)에 들어오면, 해당 섹션에 visible클래스를 추가하여 애니메이션을 실행하도록 하고, 화면 밖에 있으면 클래스를 제거한다.

 

 

 

 

Section 1
Section 2
Section 3

 

728x90
반응형
LIST

댓글