"매 60 FPS 의 transform + opacity". 매 layout property 의 animate = 매 jank. 매 GPU compositor layer 의 ride. 매 modern: 매 prefers-reduced-motion + 매 View Transitions API. 매 functional > decorative.
📖 핵심
매 rendering pipeline
Style → 매 CSS apply.
Layout (Reflow) → 매 width / height / position 변경.
Paint (Repaint) → 매 color / shadow.
Composite → 매 GPU layer.
→ 매 transform + opacity 만 의 composite (skip layout, paint).
/* ❌ Bad — 매 reflow */.bad{transition:left300ms;}.bad:hover{left:100px;}/* ✅ Good — 매 composite only */.good{transition:transform300ms;}.good:hover{transform:translateX(100px);}
Reduced motion (accessibility)
.fancy-animation{animation:bounce2seaseinfinite;}@media(prefers-reduced-motion:reduce){.fancy-animation{animation:none;}/* 매 essential 의 keep, fancy 만 의 remove */*{animation-duration:0.01ms!important;animation-iteration-count:1!important;transition-duration:0.01ms!important;}}
View Transitions API
/* Browser-side */@view-transition{navigation:auto;/* 매 same-document SPA */}::view-transition-old(root),::view-transition-new(root){animation-duration:250ms;}
// 매 imperative
asyncfunctionnavigate(){if(!document.startViewTransition){updateDOM();return;}document.startViewTransition(()=>updateDOM());}