최근 랜딩 페이지를 만들고 있는데, 이런 유형의 홈페이지를 많이 만들어보지 못해서 2~3일 간 뻘짓하다 시간을 날렸다. 개인적으로 GSAP(GreenSock Animation Platform)라는 라이브러리가 애니메이션 관련 작업하기에 최고라고 생각해서 바로 프로젝트에 적용하다가, 사용법 미숙으로 인해 삽질만 하다가 하루가 증발했다.

무엇이 문제인가

랜딩 페이지에서 각 section별로 스크롤 시 배경 화면 색깔이 달라지게 구현을 하고 싶었다. 무작정 만들어본 구현 코드는 다음과 같다.

let currentGradient = "linear-gradient(120deg, #4facfe 0%, #00f2fe 100%)";
function registerBackground(id: string, gradient: string) {
  gsap.to("#background", {
    backgroundImage: gradient,
    scrollTrigger: {
      trigger: id,
      start: "top bottom",
      end: 'top top',
      scrub: true
    },
  });
  currentGradient = gradient;
}

여기서 registerBackground 함수를 다음과 같이 호출하면…

registerBackground('#intro', "linear-gradient(120deg, #f093fb 0%, #f5576c 100%)");
registerBackground('#second', "linear-gradient(120deg, #c1dfc4 0%, #deecdd 100%)")

이렇게 각 부분별로 배경색을 다르게 지정할 수 있게 된다.

실제로 스크롤을 해 보면 첫 번째로 호출한 함수까지는 예상대로 작동을 한다.
그런데! 두 번째 영역(second)로 스크롤을 해보면 배경색이 초기값으로 바뀌어버리는 문제가 발생한다.
예를 들어, 검정 -> 빨강 -> 파랑 순으로 바뀌어야 정상인데 검정 -> 빨강 -> 검정 -> 파랑 순으로 색이 변경된다.

해결 방법

해결 방법은 간단하다.

gsap.set("#background", {
  backgroundImage: currentGradient,
});

먼저 gsap.set 메소드를 통해 초기값을 설정해줘야 한다.

마지막으로 gsap.to 부분에 immediateRender: false 옵션도 추가가 필요하다.

gsap.to("#bgsap.to("#background", {
  backgroundImage: gradient,
  immediateRender: false,
  scrollTrigger: {
    trigger: id,
    start: "top bottom",
    end: 'top top',
    scrub: true
  },
});

오늘 배운 것

설명서(공식 문서)를 잘 읽자.