뷰 트랜지션(View Transition)

뷰 트랜지션(View Transition)은 페이지 전환 시 애니메이션 효과를 부여하여 더 부드럽고 직관적인 사용자 경험을 제공하는 기술입니다. 브라우저에서 기본적으로 지원하는 View Transition API를 활용하여 페이지 전환 시 상태를 애니메이션으로 연결할 수 있습니다. 이번 설명에서는 코드를 기반으로 뷰 트랜지션의 원리사용 방법을 단계적으로 다루겠습니다.

뷰 트랜지션의 동작 원리

View Transition API

CSS 애니메이션

실습

CSS에서 Pseudo-element 활용

/* Section10/10-01-view-transition: 페이지이동 애니메이션 */
@keyframes 이동하기_이전페이지애니메이션 {
  from {
    transform: translateX(0%);
  }
  to {
    transform: translateX(-100%);
  }
}

@keyframes 이동하기_다음페이지애니메이션 {
  from {
    transform: translateX(100%);
  }
  to {
    transform: translateX(0%);
  }
}

html::view-transition-old(root) {
  animation-name: 이동하기_이전페이지애니메이션;
  animation-duration: 1s;
}

html::view-transition-new(root) {
  animation-name: 이동하기_다음페이지애니메이션;
  animation-duration: 0.5s;
}

/* Section10/10-01-view-transition: 페이지이동(뒤로가기) 애니메이션 */
@keyframes 뒤로가기_이전페이지애니메이션 {
  from {
    transform: translateX(0%);
  }
  to {
    transform: translateX(100%);
  }
}

@keyframes 뒤로가기_다음페이지애니메이션 {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

html.뒤로가기::view-transition-old(root) {
  animation-name: 뒤로가기_이전페이지애니메이션;
  animation-duration: 0.5s;
}

html.뒤로가기::view-transition-new(root) {
  animation-name: 뒤로가기_다음페이지애니메이션;
  animation-duration: 1s;
}

JS에서 라우팅에 트랜지션 연결

  1. 뒤로가기 이벤트 처리

    useRoutingSettingBackExitViewTransition 훅을 통해 뒤로가기 이벤트를 처리합니다.

    const onRoutingBack = () => {
      // 1. 종료되어야하는 페이지라면? => 종료요청
      const isExitPage = 종료되어야하는페이지들.includes(pathname);
      if (isExitPage) return fetchApp({ query: "exitDeviceRoutingForBackSet" });
    
      // 2. 뒤로가야하는 페이지라면? => 뒤로가기
      // return router.back();
    
      // 3. 뒤로가는 애니메이션 추가
      document.documentElement.classList.add("뒤로가기");
      return document
        .startViewTransition(() => {
          router.back();
        })
        .finished.finally(() => {
          document.documentElement.classList.remove("뒤로가기");
        });
    };
    
  2. 일반 링크 클릭 이벤트 처리

    RoutingSettingBackExitViewTransition 컴포넌트에서는 클릭 이벤트를 감지하여 페이지 이동 시 애니메이션을 적용합니다.

    window.addEventListener("click", (event) => {
      const isAnchor = event.target.closest("a");
      if (isAnchor) document.startViewTransition();
    });