스크롤 기반 애니메이션 성능에 관한 우수사례

Yuriko Hirota
Yuriko Hirota

스크롤 기반 애니메이션의 새로운 기능

스크롤 기반 애니메이션은 사용자의 스크롤 위치에 의해 트리거되는 방식으로 웹사이트 또는 웹 애플리케이션에 상호작용과 시각적 흥미를 더하는 방법입니다. 이를 통해 사용자의 참여를 유도하고 웹사이트의 시각적 매력을 높일 수 있습니다.

이전에는 스크롤 기반 애니메이션을 만드는 유일한 방법이 기본 스레드에서 스크롤 이벤트에 응답하는 것이었습니다. 이로 인해 두 가지 주요 문제가 발생했습니다.

따라서 스크롤과 동기화된 성능이 우수한 스크롤 기반 애니메이션을 만들기가 불가능하거나 매우 어렵습니다.

이제 CSS 또는 JavaScript에서 사용할 수 있는 스크롤 기반 애니메이션을 지원하는 새 API 세트가 도입됩니다. 이 API는 기본 스레드 리소스를 최대한 적게 사용하므로 스크롤 기반 애니메이션을 훨씬 쉽게 구현할 수 있으며 훨씬 더 부드럽습니다. 스크롤 기반 애니메이션 API는 현재 다음 브라우저에서 지원됩니다.

Browser Support

  • Chrome: 115.
  • Edge: 115.
  • Firefox Technology Preview: supported.
  • Safari: 26.

Source

이 도움말에서는 새로운 접근 방식과 기존 JavaScript 기법을 비교하여 새로운 API를 사용하면 스크롤 기반 애니메이션이 얼마나 쉽고 부드러워질 수 있는지 보여줍니다.

스크롤 기반 애니메이션 CSS API와 기존 JavaScript 비교

다음 예시 진행률 표시줄은 클래스 JavaScript 기법을 사용하여 빌드됩니다.

문서는 scroll 이벤트가 발생할 때마다 사용자가 스크롤한 scrollHeight의 비율을 계산합니다.

document.addEventListener("scroll&q>uot;, () = {
  var winScroll = document.body.scrollTop || document.documentElement.scrollTop;
  var height = document.documentElement.scrollHeight - document.documentElement.clientHeight;
  var scrolled = (winScroll / height) * 100; 
  document.getElementById("progress").style.width = scrolled + "%";
})

다음 데모에서는 CSS와 함께 새 API를 사용하여 동일한 진행률 표시줄을 보여줍니다.

@keyframes grow-progress {
  from {
    transform: scaleX(0);
  }
  to {
    transform: scaleX(1);
  }
}

#progress {
  animation: grow-progress auto linear forwards;
  animation-timeline: scroll(block root);
}

새로운 animation-timeline CSS 기능은 스크롤 범위의 위치를 진행률(%)로 자동 변환하므로 모든 작업을 처리합니다.

이제 흥미로운 부분을 살펴보겠습니다. 두 버전의 웹사이트에 메인 스레드 리소스의 대부분을 차지하는 매우 무거운 계산을 구현했다고 가정해 보겠습니다.

function someHeavyJS(){
  let time = 0;
  window.setInterval(function () {
    time++;
    for (var i = 0; i < 1e9; i++) {
      result = i;
    }
    console.log(time)
  }, 100);
}

예상하셨겠지만 기본 스레드 리소스 접합으로 인해 기존 JavaScript 버전이 불안정해지고 느려집니다. 반면 CSS 버전은 무거운 JavaScript 작업의 영향을 전혀 받지 않으며 사용자의 스크롤 상호작용에 응답할 수 있습니다.

다음 스크린샷과 같이 DevTools의 CPU 사용량은 완전히 다릅니다.

기본 스레드 비교

다음 데모는 CyberAgent에서 만든 스크롤 기반 애니메이션의 애플리케이션을 보여줍니다. 스크롤하면 사진이 서서히 나타나는 것을 확인할 수 있습니다.

새 스크롤 기반 애니메이션 JavaScript API와 기존 JavaScript 비교

새 API의 이점은 CSS에만 국한되지 않습니다. JavaScript를 사용하여 부드러운 스크롤 기반 애니메이션을 만들 수도 있습니다. 다음 예를 참고하세요.

const progressbar = document.querySelector('#progress');
progressbar.style.transformOrigin = '0% 50%';
progressbar.animate(
  {
    transform: ['scaleX(0)', 'scaleX(1)'],
  },
  {
    fill: 'forwards',
    timeline: new ScrollTimeline({
      source: document.documentElement,
    }),
  }
);

이렇게 하면 JavaScript만 사용하여 이전 CSS 데모에 표시된 것과 동일한 진행률 표시줄 애니메이션을 만들 수 있습니다. 기본 기술은 CSS 버전과 동일합니다. 이 API는 기본 스레드 리소스를 최대한 적게 사용하므로 기존 JavaScript 접근 방식에 비해 애니메이션이 훨씬 더 부드럽습니다.

또한 이 새로운 API는 기존 Web Animations API (WAAPI) 및 CSS Animations API와 함께 작동하여 선언적 스크롤 기반 애니메이션을 지원합니다.

추가 데모 및 리소스

이 데모 사이트를 통해 스크롤 기반 애니메이션의 다양한 구현을 확인할 수 있습니다. 여기에서 CSS 및 JavaScript의 이러한 새 API를 사용하는 데모를 비교할 수 있습니다.

새로운 스크롤 기반 애니메이션에 대해 자세히 알아보려면 이 도움말과 I/O 2023 강연을 확인하세요.