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

Yuriko Hirota
Yuriko Hirota

스크롤 기반 애니메이션에는 어떤 새로운 기능이 있나요?

스크롤 기반 애니메이션은 사용자의 스크롤 위치에 의해 트리거되는 웹사이트 또는 웹 애플리케이션에 상호작용과 시각적 관심을 추가하는 방법입니다. 이는 사용자의 참여를 유도하고 시각적으로 매력적인 웹사이트를 만들 수 있는 좋은 방법입니다.

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

따라서 스크롤과 동기화되어 성능이 뛰어난 스크롤 기반 애니메이션을 만들 수 없거나 매우 어렵습니다.

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

브라우저 지원

  • 115
  • 115
  • x

소스

이 문서에서는 새로운 접근 방식을 기존 JavaScript 기법과 비교하여 새 API에서 얼마나 쉽고 부드러운 스크롤 기반 애니메이션을 만들 수 있는지 보여줍니다.

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

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

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

document.addEventListener("scroll", () => {
  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 버전은 과도한 자바스크립트 작업의 영향을 전혀 받지 않으며 사용자의 스크롤 상호작용에 응답할 수 있습니다.

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

기본 스레드 비교

다음 데모는 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 대담을 확인하세요.