본문 바로가기

웹퍼블리싱

CSS와 JavaScript로 스크롤 애니메이션 구현하기

스크롤 애니메이션은 웹사이트를 동적이고 생동감 있게 만들어 사용자 경험(UX)을 향상시키는 중요한 요소입니다. CSS와 JavaScript를 조합하면 간단한 전환 효과부터 복잡한 애니메이션까지 다양한 스크롤 애니메이션을 구현할 수 있습니다. 이 글에서는 CSS와 JavaScript를 활용해 스크롤 애니메이션을 단계별로 구현하는 방법과 활용 사례를 소개합니다.

웹퍼블리싱


1. CSS를 활용한 기본 스크롤 애니메이션

CSS만으로 간단한 스크롤 애니메이션을 구현할 수 있습니다. CSS Scroll SnapTransition을 사용하면 최소한의 코드로 스크롤 효과를 추가할 수 있습니다.

  1. Scroll Snap으로 부드러운 스크롤 구현
    • CSS Scroll Snap은 요소가 뷰포트에 맞게 스크롤되도록 고정하는 기술입니다.
       
      <style>
          .scroll-container {
              display: flex;
              overflow-x: scroll;
              scroll-snap-type: x mandatory;
          }

          .scroll-item {
              flex: 0 0 100%;
              height: 100vh;
              scroll-snap-align: start;
          }
      </style>

      <div class="scroll-container">
          <div class="scroll-item" style="background: lightcoral;"></div>
          <div class="scroll-item" style="background: lightblue;"></div>
          <div class="scroll-item" style="background: lightgreen;"></div>
      </div>
  2. CSS Transition으로 간단한 효과 추가
    • CSS Transition을 사용해 스크롤 시 부드러운 애니메이션 효과를 구현합니다.
      <style>
          .box {
              width: 100px;
              height: 100px;
              background-color: lightblue;
              transition: transform 0.5s ease;
          }

          .box:hover {
              transform: scale(1.2);
          }
      </style>

      <div class="box"></div>
  3. CSS Keyframes를 사용한 애니메이션 효과
    • Keyframes와 position: sticky를 조합해 애니메이션을 트리거합니다.
      <style>
          .sticky-box {
              position: sticky;
              top: 0;
              animation: fadeIn 1s ease-in-out;
          }

          @keyframes fadeIn {
              from {
                  opacity: 0;
                  transform: translateY(20px);
              }
              to {
                  opacity: 1;
                  transform: translateY(0);
              }
          }
      </style>

      <div class="sticky-box">스크롤 시 보이는 박스</div>

2. JavaScript로 고급 스크롤 애니메이션 구현하기

JavaScript는 스크롤 위치에 따라 동적으로 애니메이션을 제어할 수 있는 강력한 기능을 제공합니다.

  1. Scroll Event로 요소 애니메이션 트리거
    • JavaScript의 scroll 이벤트를 활용하여 스크롤 위치에 따라 애니메이션을 트리거합니다.
      const boxes = document.querySelectorAll('.box');

      window.addEventListener('scroll', () => {
          boxes.forEach(box => {
              const boxTop = box.getBoundingClientRect().top;
              const windowHeight = window.innerHeight;
              if (boxTop < windowHeight) {
                  box.classList.add('visible');
              }
          });
      });
      <style>
          .box {
              opacity: 0;
              transform: translateY(20px);
              transition: opacity 0.5s ease, transform 0.5s ease;
          }

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

      <div class="box">스크롤 애니메이션 요소</div>


       
  2. Intersection Observer API 활용
    • Intersection Observer를 사용하면 성능을 최적화하면서 스크롤 애니메이션을 구현할 수 있습니다.
      const options = {
          root: null,
          threshold: 0.1,
      };

      const observer = new IntersectionObserver((entries, observer) => {
          entries.forEach(entry => {
              if (entry.isIntersecting) {
                  entry.target.classList.add('visible');
                  observer.unobserve(entry.target);
              }
          });
      }, options);

      const targets = document.querySelectorAll('.box');
      targets.forEach(target => observer.observe(target));
  3. Parallax Effect 구현
    • JavaScript로 배경이나 요소의 움직임을 제어하여 시각적인 깊이감을 줍니다.
      window.addEventListener('scroll', () => {
          const parallax = document.querySelector('.parallax');
          const scrollPosition = window.scrollY;
          parallax.style.transform = `translateY(${scrollPosition * 0.5}px)`;
      });

      <style>
          .parallax {
              background-image: url('image.jpg');
              background-size: cover;
              height: 500px;
              position: relative;
              transform: translateY(0);
              transition: transform 0.2s ease;
          }
      </style>

      <div class="parallax"></div>


3. 스크롤 애니메이션 플러그인 활용하기

복잡한 스크롤 애니메이션은 플러그인을 사용하여 구현할 수 있습니다.

  1. GSAP(ScrollTrigger)
  2. AOS(Animate On Scroll)

스크롤 애니메이션 구현 시 유의사항

  1. 성능 최적화
    • JavaScript의 scroll 이벤트를 사용하더라도 성능 저하를 방지하기 위해 debounce 또는 throttle를 적용하세요.
      const throttle = (func, limit) => {
          let inThrottle;
          return function () {
              const args = arguments;
              const context = this;
              if (!inThrottle) {
                  func.apply(context, args);
                  inThrottle = true;
                  setTimeout(() => (inThrottle = false), limit);
              }
          };
      };

      window.addEventListener('scroll', throttle(() => {
          console.log('스크롤 이벤트 발생!');
      }, 100));
  2. 접근성 고려
    • 스크롤 애니메이션은 시각적으로 유익하지만, 시각장애인을 위해 중요한 콘텐츠는 ARIA 속성을 활용해 제공하세요.

결론

CSS와 JavaScript를 조합한 스크롤 애니메이션은 웹사이트를 동적이고 흥미롭게 만드는 데 필수적인 기술입니다. CSS Transition과 Keyframes를 통해 간단한 효과를 구현하고, JavaScript와 Intersection Observer로 고급 애니메이션을 추가하며, GSAP나 AOS 같은 플러그인으로 더욱 복잡한 동작을 손쉽게 처리할 수 있습니다. 성능 최적화와 접근성을 고려하며 스크롤 애니메이션을 구현하면 사용자 경험을 극대화할 수 있습니다.