Front-end/애니메이션

스크롤 내리면 애니메이션 실행하기 적용 방법 [html + JavaScript]

mooyou 2025. 5. 25. 22:45
728x90
300x250
SMALL

 

웹사이트에서 스크롤을 내릴 때 요소가 자연스럽게 등장하는 효과 이 기능은 단순한 css와 javaScript만으로도 쉽게 구현할 수 있습니다. IntersectionObserver API를 활용하여 스크롤 애니메이션 효과를 만들어보겠습니다.


 

구현 목표

  • 스크롤을 아래로 내리면 특정 박스가 페이드 인(Fade In) + 위로 올라오는 애니메이션을 실행
  • 애니메이션은 한 번만 실행

전체코드

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>스크롤 애니메이션 예제</title>
  <style>
    body {
      margin: 0;
      font-family: sans-serif;
    }

    .spacer {
      height: 100vh;
      background: #f0f0f0;
    }

    .box {
      opacity: 0;
      transform: translateY(50px);
      transition: all 0.6s ease;
      width: 200px;
      margin: 100px auto;
      padding: 50px;
      background: #4caf50;
      color: white;
      text-align: center;
      border-radius: 10px;
      font-size: 20px;
    }

    .box.active {
      opacity: 1;
      transform: translateY(0);
    }
  </style>
</head>
<body>

  <div class="spacer">스크롤 다운 ↓</div>

  <div class="box" id="target">애니메이션 실행!</div>

  <div class="spacer"></div>

  <script>
    const target = document.querySelector('#target');

    const observer = new IntersectionObserver((entries, observer) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          entry.target.classList.add('active');
          observer.unobserve(entry.target); // 한 번만 실행되도록 감시 해제
        }
      });
    }, {
      threshold: 0.3 // 요소가 30% 이상 화면에 들어오면 실행
    });

    observer.observe(target);
  </script>
</body>
</html>

 

 


코드 설명

 

css설명

.box {
  opacity: 0;
  transform: translateY(50px);
  transition: all 0.6s ease;
}
.box.active {
  opacity: 1;
  transform: translateY(0);
}
  • box는 처음에는 opacity:0 즉 보이지 않고 Y축으로 50px 아래에 위치
  • .active클래스가 붙으면 0.6초 동안 opacity:1로 천천히 나타나면서 제자리로 올라옴

JavaScript 설명

const observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('active');
      observer.unobserve(entry.target);
    }
  });
}, {
  threshold: 0.3
});
  • IntersectionObserver는 특정 요소가 뷰포트에 30% 이상 보이는지 감지
  • 감지되면 .active클래스를 추가해서 애니메이션을 실행
  • oberserver.unobserve()로 해당 요소는 더 이상 갑지하지 않도로고 설정 -> 애니메이션은 한 번만 실행됨

 

확장 팁

  • 여러 개 .box 요소에 적용하려면 querySelectorAll로 여러 요소를 선택한 후 반복(forEach)하면 된다.
  • threshold를 0.1이나 1.0으로 조절해 보여지는 비율을 조정할 수 있다.
  • 애니메이션 스타일도 scale, rotate, fade, slide등 다양하게 응용 가능

 

 

 


스크롤 다운 ↓
애니메이션 실행!
 
728x90
반응형
LIST