React 뷰 전환

React View Transition

전환으로 표시한 UI 변경에서 요소의 이동·크기 변화를 애니메이션합니다.

···
html
<div class="scene"><div class="guide"><span>LIST</span><span>DETAIL</span></div><div class="slot left"></div><div class="slot right"></div><div class="card" id="card"><i></i><b>Project 01</b><small id="size">preview</small></div><div class="label">same card, new location and size</div></div>
css
.scene{width:min(94vw,800px);height:min(86vh,320px);position:relative;overflow:hidden;display:flex;flex-direction:column;justify-content:space-between;border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:clamp(9px,2.4vmin,20px);font:500 clamp(15px,4vmin,18px)/1.3 var(--font-sans,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif)}.scene b,.scene strong{font-weight:700}.label{color:var(--muted)}.code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.pill{border:1px solid var(--line);border-radius:8px;padding:.4em .65em;background:var(--bg)}.active{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 10%,var(--surface))!important}.guide{display:flex;justify-content:space-between;color:var(--muted);font:700 clamp(12px,3vmin,15px) ui-monospace,monospace}.slot{position:absolute;top:28%;height:45%;border:1px dashed var(--line);border-radius:9px}.left{left:8%;width:30%}.right{right:8%;width:48%}.card{position:absolute;top:32%;left:10%;width:26%;height:36%;background:var(--accent);color:var(--bg);border-radius:8px;padding:.5em;display:flex;flex-direction:column;justify-content:center;gap:3px;transition:all .85s cubic-bezier(.2,.7,.2,1);box-shadow:0 9px 20px #0002}.card.expanded{left:54%;top:30%;width:42%;height:41%}.card i{width:25%;height:20%;background:color-mix(in srgb,var(--bg) 30%,transparent);border-radius:3px}.card small{opacity:.8}.label{position:absolute;bottom:5%;left:0;right:0;text-align:center}
js
let open=false;function tick(){open=!open;document.getElementById("card").classList.toggle("expanded",open);document.getElementById("size").textContent=open?"detail":"preview"}tick();setInterval(tick,1500)

React 19.3에서 ViewTransition은 안정 API가 됐습니다. 자식을 감싸면 전환 업데이트에서 진입, 이탈, 변경, 공유 이동에 맞는 애니메이션을 브라우저 View Transition API로 실행합니다.

데모는 작은 목록 카드가 상세 카드 자리로 이동하며 크기를 바꾸는 장면을 반복합니다. 각 화면 상태에 고유한 이름을 붙여 공유 요소를 지정할 수 있으며, 전환 종류에 맞는 CSS도 조정할 수 있습니다.

언제 쓰나

목록에서 상세로 넘어가는 등 화면 맥락을 부드럽게 이어주고 싶을 때 사용합니다.

페이지로 열기 ↗