브라우저 렌더링 파이프라인

Browser rendering pipeline

HTML과 CSS를 해석한 뒤 레이아웃과 페인트를 거쳐 화면의 픽셀을 만듭니다.

···
html
<div class="demo"><div class="head"><strong>PIXEL PIPELINE</strong><span id="stage">parse</span></div><div class="scene"><div class="pipeline"><span class="chip" id="a">DOM</span><span class="arrow">+</span><span class="chip" id="b">CSSOM</span><span class="arrow">→</span><span class="chip" id="c">layout</span><span class="arrow">→</span><span class="chip" id="d">paint</span></div><div class="preview" id="preview"><i></i><i></i><i></i></div></div><div class="foot"><span>structure → geometry → pixels</span><span>tap to step</span></div></div>
css
.demo{width:min(92vw,660px);height:min(86vh,310px);border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:clamp(10px,2.5vmin,20px);display:flex;flex-direction:column;gap:clamp(6px,1.7vmin,12px);box-shadow:0 10px 35px rgba(0,0,0,.07);font:500 clamp(10px,2.8vmin,15px)/1.35 ui-monospace,SFMono-Regular,Consolas,monospace}
.head,.foot{display:flex;align-items:center;justify-content:space-between;gap:8px}.head strong{color:var(--accent);font-size:1.05em}.foot{color:var(--muted);font-size:.85em;min-height:1.4em}.scene{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center;gap:clamp(5px,1.5vmin,12px)}.chip{border:1px solid var(--line);background:var(--bg);border-radius:7px;padding:.4em .6em;text-align:center}.on{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 12%,var(--surface))!important;color:var(--accent)!important}.dim{opacity:.42}.arrow{color:var(--muted)}
.scene{flex-direction:column}.pipeline{display:flex;align-items:center;justify-content:center;gap:4px;width:100%;flex-wrap:wrap}.pipeline .chip{padding:.3em}.preview{width:40%;height:50%;border:1px solid var(--line);border-radius:5px;display:flex;flex-direction:column;gap:5px;padding:7px;opacity:.5;transition:opacity .3s}.preview i{height:20%;border-radius:3px;background:var(--accent)}.preview i:nth-child(2){width:70%}.preview i:nth-child(3){width:85%;background:var(--line)}
js
let step=0;const ids=["a","b","c","d"],labels=["parse HTML","parse CSS","layout","paint"];function advance(){ids.forEach((id,i)=>document.getElementById(id).classList.toggle("on",i<=step));document.getElementById("stage").textContent=labels[step];document.getElementById("preview").style.opacity=step===3?"1":".5";step=(step+1)%4}advance();const timer=setInterval(advance,700);document.querySelector(".demo").addEventListener("pointerdown",()=>{clearInterval(timer);advance()})

브라우저는 HTML에서 DOM을, CSS에서 CSSOM을 만듭니다. 이를 바탕으로 그릴 대상을 정하고, 레이아웃에서 크기와 위치를 계산한 뒤 페인트합니다.

데모는 각 단계가 완료될 때까지 미리보기 화면을 채우지 않습니다. DOM 구조가 바뀌거나 크기에 영향을 주는 CSS가 바뀌면 뒤 단계 작업을 다시 해야 할 수 있습니다.

언제 쓰나

레이아웃 변경이나 페인트 비용을 분석할 때 이 순서를 기준으로 병목을 찾습니다.

페이지로 열기 ↗