/ 우리는 이렇게 합니다 / View Transitions
개발 · 숨은 노하우

이제 라이브러리 없이, 화면이 부드럽게 바뀝니다.

불과 얼마 전까지 화면 전환 한 번을 만들려면 무거운 JS 애니메이션 라이브러리를 깔아야 했습니다. 지금은 브라우저가 표준으로 해 줍니다. document.startViewTransition() 한 번 감싸면 끝이죠. 그래서 이 글은 읽는 글이 아니라 눌러보는 글입니다. 아래 위젯, 진짜로 동작합니다.

한 줄 직답

예전에 라이브러리로 만들던 화면 전환을, 이제 브라우저 표준 document.startViewTransition()로 라이브러리 없이 만듭니다. 미지원 브라우저에서는 효과 없이 그대로 동작하는 안전한 폴백을 두고, prefers-reduced-motion 사용자에게는 애니메이션을 꺼서 누구도 어지럽지 않게 합니다.

요약

  • DOM을 바꾸는 코드를 document.startViewTransition()으로 감싸면 브라우저가 알아서 부드럽게 전환한다 — 외부 라이브러리 0.
  • 같은 문서 전환은 Chrome 111+·Edge 111+·Safari 18+·Firefox 144+에서 동작하며 현재 Baseline이다(2026 기준).
  • 미지원 시 효과만 빠지고 기능은 그대로 — if(!document.startViewTransition) 한 줄 폴백이면 안전하다.
  • prefers-reduced-motion을 존중해 움직임 민감 사용자에게는 즉시 전환으로 바꾼다.

제가 일을 시작했을 무렵, “페이지가 스르륵 바뀌는” 효과 하나를 넣으려면 결심이 필요했습니다. 애니메이션 라이브러리를 추가하면 번들이 수십 KB 늘고, 버전 올릴 때마다 깨지지 않나 신경 써야 했으니까요. 효과 하나의 대가가 너무 컸죠. 그런데 지금은 그 효과가 브라우저에 표준으로 들어왔습니다. 라이브러리 없이, 코드 몇 줄로요.

그래서, 라이브러리 없이 뭐가 달라지나요?

핵심은 document.startViewTransition()입니다. 화면을 바꾸는 코드(목록을 갈아끼우거나 카드를 펼치거나)를 이 함수로 감싸면, 브라우저가 바뀌기 직전 화면을 ‘사진’으로 찍어두고 바뀐 뒤 화면과 부드럽게 크로스페이드해 줍니다. 우리가 프레임을 일일이 그리지 않아도 됩니다. 백 마디 설명보다 빠릅니다 — 아래 버튼을 눌러보세요.

Live · View Transitions API

버튼을 눌러 부드럽게 전환

예전엔 라이브러리가 필요했던 화면 전환을, 이제 브라우저 표준 API로.

검색에 발견

// document.startViewTransition() — 미지원 시 즉시 전환 폴백

방금 그 부드러운 변화, 우리가 만든 애니메이션이 아니라 브라우저가 만들어 준 겁니다. 코드로 보면 이렇게 간단합니다.

const btn = document.querySelector('.vt-btn');
btn.addEventListener('click', () => {
  // 1) 지원 안 하면 그냥 바로 바꾸고 끝(폴백)
  if (!document.startViewTransition) { swap(); return; }
  // 2) 지원하면 전환으로 감싸기
  document.startViewTransition(() => swap());
});

지원 안 하는 브라우저는 어떻게 하죠?

이게 가장 자주 듣는 걱정인데, 답은 “알아서 안전하다”입니다. document.startViewTransition이 없는 브라우저에서는 위 코드의 if에 걸려 swap()만 즉시 실행됩니다. 효과만 빠지고 기능은 그대로죠. 그래서 저는 전환을 ‘반드시 있어야 하는 것’이 아니라 점진적 향상(progressive enhancement)으로 다룹니다. 있으면 더 좋고, 없어도 멀쩡한.

2026년 기준으로 같은 문서 안에서의 전환은 Chrome 111+, Edge 111+, Safari 18+, 그리고 Firefox 144+(2025년 10월 안정화)에서 동작하며 이제 Baseline 단계입니다. 즉 대부분의 사용자는 효과를 보고, 나머지는 폴백으로 멀쩡히 씁니다. 어느 쪽도 손해 보지 않습니다.

그럼 멀미 나는 사람은요? (reduced-motion)

부드러운 전환이 누군가에게는 어지럼입니다. 전정기관이 예민한 사용자, 멀미가 잦은 사용자는 운영체제에 “동작 줄이기”를 켜둡니다. 그 신호가 바로 prefers-reduced-motion: reduce예요. 저는 이걸 무조건 존중합니다. CSS 한 블록이면 됩니다.

@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*),
  ::view-transition-old(*),
  ::view-transition-new(*) { animation: none !important; }
}

이렇게 두면 동작 줄이기를 켠 사용자는 전환 없이 즉시 화면이 바뀝니다. 기능은 똑같이 쓰되 어지럽지 않게요. 멋과 배려는 같이 가야 합니다 — 위 라이브 위젯도 이 규칙을 그대로 따릅니다.

한 페이지 안에서만? 페이지 이동도 됩니다

지금까지는 같은 문서 안에서 DOM을 바꾸는 전환(startViewTransition())이었습니다. 그런데 ‘목록 페이지 → 상세 페이지’처럼 다른 페이지로 넘어갈 때도 전환을 걸 수 있습니다. 이게 cross-document(MPA) 전환이고, 놀랍게도 자바스크립트가 한 줄도 필요 없습니다.

/* 두 페이지의 CSS에 똑같이 넣어두면 끝 */
@view-transition { navigation: auto; }

2026년 기준 cross-document 전환은 Chrome 126+와 Safari 18.2+에서 동작하고, Firefox는 아직 정식 지원 전이라 여기서도 점진적 향상으로 다룹니다. 지원 안 되면? 그냥 평범한 페이지 이동이 됩니다. 역시 깨지지 않죠.

그래서 실무에서 어디에 쓰나요?

저는 ‘맥락이 이어지는 변화’에 씁니다. 목록의 썸네일을 누르면 그 이미지가 그대로 상세 페이지의 큰 이미지로 자라나는 연출(view-transition-name으로 두 요소를 이어줍니다), 탭을 바꿀 때 콘텐츠가 슬쩍 교차되는 전환, 다크/라이트 모드를 토글할 때 부드럽게 번지는 전환. 공통점은 ‘사용자의 시선이 끊기지 않게’입니다. 화려함이 목적이 아니라, 지금 일어난 변화를 사용자가 따라오게 만드는 게 목적이에요. 그 ‘썸네일이 상세 이미지로 자라는’ 연출이 실은 CSS 한 줄 + JS 한 덩어리입니다.

CSS+JS · 공유 요소 모프
/* 목록과 상세, 양쪽의 같은 이미지에 동일한 이름을 붙인다 */
.card-thumb   { view-transition-name: hero-photo; }
.detail-photo { view-transition-name: hero-photo; }
/* 이름이 같으면 브라우저가 두 요소를 '같은 것'으로 보고 이어 움직인다 */

// 상세로 넘어가기 직전, DOM 교체를 전환으로 감싼다
function openDetail(id) {
  if (!document.startViewTransition) { render(id); return; } // 폴백
  document.startViewTransition(() => render(id));
}

그리고 배포 전에는 지원 브라우저와 미지원 폴백이 둘 다 멀쩡한지 한 번씩 직접 확인합니다.

검증 — 예시
$ 지원 점검: 'startViewTransition' in document
$ ✓ Chrome 111+/Safari 18+/Firefox 144+ → 크로스페이드 전환 동작
$ ✓ 미지원 브라우저 → swap()만 즉시 실행(기능 그대로, 효과만 생략)
$ ✓ prefers-reduced-motion: reduce → animation:none 적용 확인
항목라이브러리로 전환표준 API로 전환
번들 용량패키지 수십 KB 추가추가 0 — 브라우저 내장
유지보수버전 업·호환성 관리 필요표준이라 깨질 일이 적음
성능JS가 매 프레임 계산브라우저 합성 단계 처리
미지원 대응직접 분기 처리if 한 줄로 안전 폴백

전환 하나를 이렇게 보는 사람이, 사이트 전체를 만듭니다

화면 전환은 사용자가 ‘방금 무슨 일이 일어났는지’를 이해하는 결정적인 0.3초입니다. 그 0.3초를 라이브러리에 떠넘기지 않고 표준으로, 가볍게, 누구도 어지럽지 않게 만드는 태도 — Findable에서는 이게 기본값입니다. 당신의 사이트, 어떤 전환을 만들어 드릴까요?

View Transitions API는 라이브러리 없이 정말 쓸 수 있나요?
네. document.startViewTransition()은 브라우저에 내장된 표준 API라 별도 패키지가 필요 없습니다. DOM을 바꾸는 코드를 이 함수로 감싸기만 하면 바뀌기 전·후 화면을 브라우저가 알아서 부드럽게 전환합니다. 같은 문서 안의 전환은 Chrome 111+, Edge 111+, Safari 18+, Firefox 144+에서 동작하며 현재 Baseline 단계입니다.
지원하지 않는 브라우저에서는 어떻게 되나요?
화면이 깨지지 않습니다. document.startViewTransition이 없으면 콜백 안의 DOM 변경만 그대로 즉시 실행돼 전환 효과 없이 평소처럼 동작합니다. 그래서 ‘if (!document.startViewTransition) { update(); return; }’ 한 줄로 안전하게 폴백을 둡니다. 전환은 있으면 좋은 보너스(점진적 향상)로 다룹니다.
멀미를 느끼는 사용자에게는 어떻게 배려하나요?
prefers-reduced-motion: reduce가 켜진 사용자에게는 전환 애니메이션을 끕니다. CSS에서 해당 미디어 쿼리로 ::view-transition 가속 애니메이션을 none 처리하거나 view-transition-name을 비워 즉시 전환되게 합니다. 움직임에 민감한 사용자도 같은 기능을 어지럼 없이 쓸 수 있어야 합니다.
페이지를 이동할 때(여러 페이지)도 전환이 되나요?
됩니다. 같은 사이트의 다른 페이지로 넘어갈 때 적용되는 cross-document(MPA) 전환은 CSS의 @view-transition { navigation: auto } 한 줄로 켜며, JS 없이도 동작합니다. 2026년 기준 Chrome 126+, Safari 18.2+에서 지원되고 Firefox는 아직 정식 지원 전이라 점진적 향상으로 다룹니다.
SEO나 성능에 나쁜 영향은 없나요?
외부 애니메이션 라이브러리를 걷어내면 자바스크립트 용량이 줄어 로딩과 상호작용이 가벼워집니다. 전환 자체도 브라우저가 합성(compositor) 단계에서 처리해 레이아웃을 다시 계산하지 않으므로 부드럽습니다. 콘텐츠는 전환과 무관하게 그대로 렌더되므로 검색 노출에도 불리하지 않습니다.

이런 디테일로 사이트를 만듭니다

전환 하나까지 표준으로·가볍게·배려해서 만드는 팀이 당신의 홈페이지를 만들면 어떨까요. 무료 진단으로 시작하세요.

무료 진단 받기

이 글의 위젯은 이 페이지에서 실제로 동작하는 코드입니다(외부 라이브러리 0, 미지원 시 즉시 전환 폴백, reduced-motion 존중). 브라우저 지원 현황(Chrome 111+/126+, Safari 18+/18.2+, Firefox 144+ 등)은 시점에 따라 변동될 수 있으므로 항상 폴백을 두는 것을 권장합니다. 날조된 사례·수치는 사용하지 않았습니다.