Compositing layers

합성 레이어

Previously painted layers can be moved and combined into a final frame.

···
html
<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>
css
.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}}
js
document.querySelector(".layers").addEventListener("pointerdown",()=>{const m=document.querySelector(".moving");m.style.animationPlayState=m.style.animationPlayState==="paused"?"running":"paused"})

Browsers may place selected elements on separate layers and adjust their position or overlap in compositing. Transform and opacity animations can be handled there without repeating layout and paint.

The demo moves a translucent layer over a painted grid. Promoting everything to a layer costs memory, so use this approach where motion benefits from it.

When to use

When motion stutters, inspect whether layout, paint, or compositing repeats.

Open as page ↗