브라우저는 일부 요소를 별도 레이어로 다루고 GPU 합성 단계에서 위치와 겹침을 조정할 수 있습니다. 변형과 불투명도 애니메이션은 레이아웃과 페인트를 반복하지 않고 합성 단계에서 처리될 수 있습니다.
데모에서 반투명 레이어는 배경 격자 위를 움직입니다. 모든 요소를 레이어로 승격하면 메모리 비용이 생기므로 필요한 애니메이션에만 판단해서 사용합니다.
언제 쓰나
움직임이 끊길 때 레이아웃·페인트·합성 중 어느 단계가 반복되는지 확인합니다.
이미 그린 레이어를 이동하거나 겹쳐 최종 프레임을 합성합니다.
<div class="v"><header>COMPOSITOR <span>paint once · move many</span></header><div class="stage layers"><div class="grid"><i></i><i></i><i></i><i></i><i></i><i></i></div><div class="moving">layer B</div></div><div class="muted">transform → composite</div></div>.v{width:min(94vw,760px);height:min(88vh,320px);padding:clamp(9px,2.4vmin,18px);border:1px solid var(--line);border-radius:12px;background:var(--surface);font:500 clamp(12px,2.4vmin,16px)/1.3 var(--font-sans,system-ui,sans-serif);display:flex;flex-direction:column;gap:clamp(5px,1.4vmin,10px);overflow:hidden}.v header{display:flex;align-items:center;justify-content:space-between;gap:8px;color:var(--accent);font-weight:700}.v header span{color:var(--muted);font-weight:500}.v .stage{flex:1;min-height:0;position:relative}.v .muted{color:var(--muted)}.v .active{background:color-mix(in srgb,var(--accent) 18%,var(--surface));border-color:var(--accent)!important;color:var(--fg)}.v button{font:inherit;color:var(--fg);background:var(--bg);border:1px solid var(--line);border-radius:7px;padding:5px 8px;cursor:pointer}.layers{display:grid;place-items:center;perspective:500px}.grid{width:65%;height:72%;display:grid;grid-template-columns:repeat(3,1fr);gap:5px;transform:rotateX(10deg);border:1px solid var(--line);padding:8px;border-radius:8px}.grid i{background:color-mix(in srgb,var(--accent-2) 18%,var(--surface));border-radius:3px}.moving{position:absolute;left:32%;top:24%;width:38%;height:40%;display:grid;place-items:center;color:var(--fg);background:color-mix(in srgb,var(--accent) 70%,transparent);border:2px solid var(--accent);border-radius:8px;box-shadow:0 12px 25px #0002;animation:slide 2.5s ease-in-out infinite alternate}@keyframes slide{to{transform:translateX(28%) rotate(-7deg);opacity:.65}}document.querySelector(".layers").addEventListener("pointerdown",()=>{const m=document.querySelector(".moving");m.style.animationPlayState=m.style.animationPlayState==="paused"?"running":"paused"})브라우저는 일부 요소를 별도 레이어로 다루고 GPU 합성 단계에서 위치와 겹침을 조정할 수 있습니다. 변형과 불투명도 애니메이션은 레이아웃과 페인트를 반복하지 않고 합성 단계에서 처리될 수 있습니다.
데모에서 반투명 레이어는 배경 격자 위를 움직입니다. 모든 요소를 레이어로 승격하면 메모리 비용이 생기므로 필요한 애니메이션에만 판단해서 사용합니다.
움직임이 끊길 때 레이아웃·페인트·합성 중 어느 단계가 반복되는지 확인합니다.