React 전환 타입

React transition types

같은 화면 변경에도 이동 원인에 따라 다른 전환 애니메이션을 적용합니다.

···
html
<div class="scene"><div class="heading">TRANSITION TYPE <b id="type">next</b></div><div class="viewport"><div class="slide" id="slide"><small>PAGE</small><strong id="page">02</strong></div><div class="track"><i id="marker"></i></div></div><div class="controls"><button id="previous" type="button">PREVIOUS</button><span id="direction">slides left</span><button id="next" type="button">NEXT</button></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}.heading,.controls{display:flex;align-items:center;justify-content:space-between;gap:6px;font:700 clamp(12px,3.3vmin,16px) ui-monospace,monospace}.heading b{color:var(--accent)}.viewport{position:relative;flex:1;min-height:70px;display:grid;place-items:center;overflow:hidden}.slide{width:clamp(76px,30vmin,170px);height:68%;min-height:62px;border:2px solid var(--accent);border-radius:10px;background:color-mix(in srgb,var(--accent) 15%,var(--surface));display:flex;align-items:center;justify-content:center;gap:8px;transition:transform .5s,opacity .5s}.slide strong{font-size:clamp(25px,8vmin,42px);color:var(--accent)}.slide.out-left{transform:translateX(-145%);opacity:0}.slide.out-right{transform:translateX(145%);opacity:0}.track{position:absolute;bottom:4px;width:40%;height:4px;background:var(--line);border-radius:4px}.track i{display:block;width:33%;height:100%;background:var(--accent);border-radius:4px;transition:transform .45s}.controls button{font:inherit;font-size:clamp(12px,2.9vmin,14px);color:var(--fg);background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:.3em .45em;cursor:pointer}.controls span{font-family:var(--font-sans);font-size:clamp(12px,3vmin,15px);color:var(--muted)}
js
const slide=document.getElementById("slide"),marker=document.getElementById("marker");let page=1,forward=true;function move(next){forward=next;slide.className="slide "+(next?"out-left":"out-right");document.getElementById("type").textContent=next?"next":"previous";document.getElementById("direction").textContent=next?"slides left":"slides right";setTimeout(()=>{page=(page+(next?1:2))%3;document.getElementById("page").textContent=String(page+1).padStart(2,"0");marker.style.transform="translateX("+(page*100)+"%)";slide.style.transition="none";slide.style.transform="translateX("+(next?"145%":"-145%")+")";slide.style.opacity="0";requestAnimationFrame(()=>requestAnimationFrame(()=>{slide.style.transition="transform .5s,opacity .5s";slide.className="slide";slide.style.transform="";slide.style.opacity=""}))},470)}document.getElementById("previous").onclick=()=>move(false);document.getElementById("next").onclick=()=>move(true);setTimeout(()=>move(true),300);setInterval(()=>move(!forward),1900)

React 19.3의 addTransitionType은 startTransition 안에서 업데이트의 방향 같은 의미를 표시합니다. ViewTransition의 enter·exit 설정은 그 타입에 맞는 CSS 전환 클래스를 선택할 수 있습니다.

데모는 앞으로 이동할 때 왼쪽, 뒤로 이동할 때 오른쪽으로 카드가 움직이는 모습을 보여줍니다. 전환 타입은 전역 페이지 상태가 아니라 해당 전환에 속하므로 일반 상태 업데이트와 구분해 사용합니다.

언제 쓰나

캐러셀이나 이전·다음 탐색에서 방향에 맞는 애니메이션을 보여줄 때 사용합니다.

페이지로 열기 ↗