First Contentful Paint

첫 콘텐츠 표시 시간

FCP marks the first rendered text, image, or other content after a blank page.

···
html
<div class="atlas"><div class="head"><b>FCP · first visible pixel</b><span class="pulse"></span></div><div class="stage"><div class="fcp-window box"><div class="fcp-chrome"><i></i><i></i><i></i></div><div class="fcp-title" id="fcp-title">Welcome back</div><div class="fcp-card" id="fcp-card"><i></i><i></i></div></div><div class="fcp-status mono" id="fcp-status">blank frame</div></div></div>
css
.atlas{width:min(94vw,720px);height:min(88vh,320px);border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:clamp(10px,2.5vmin,18px);display:flex;flex-direction:column;gap:clamp(7px,2vmin,12px);font:500 clamp(12px,3.2vmin,16px)/1.25 var(--font-sans),sans-serif;color:var(--fg);box-shadow:0 8px 28px rgba(0,0,0,.06)}.head{display:flex;align-items:center;justify-content:space-between;color:var(--accent);letter-spacing:.03em}.pulse{width:8px;height:8px;border-radius:50%;background:var(--accent);animation:blink 1.3s infinite}@keyframes blink{50%{opacity:.2}}.stage{flex:1;min-height:0;position:relative;overflow:hidden}.mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.muted{color:var(--muted)}.accent{color:var(--accent)}.box{border:1px solid var(--line);border-radius:8px;background:var(--bg)}.fcp-window{height:80%;overflow:hidden}.fcp-chrome{height:22px;display:flex;gap:4px;align-items:center;padding-left:8px;border-bottom:1px solid var(--line)}.fcp-chrome i{height:5px;width:5px;background:var(--muted);border-radius:50%}.fcp-title{padding:10px 12px 4px;font-weight:700;opacity:0}.fcp-card{margin:4px 12px;height:40%;border-radius:5px;background:color-mix(in srgb,var(--accent) 15%,var(--bg));padding:8px;opacity:0}.fcp-card i{display:block;height:6px;width:70%;margin:6px;background:var(--line);border-radius:4px}.fcp-card i+ i{width:45%}.fcp-title.on,.fcp-card.on{opacity:1;transition:opacity .3s}.fcp-status{text-align:right;color:var(--accent);margin-top:5px}
js
let phase=0;function tick(){document.getElementById('fcp-title').classList.toggle('on',phase>=1);document.getElementById('fcp-card').classList.toggle('on',phase>=2);document.getElementById('fcp-status').textContent=['blank frame','FCP: text appears','larger content follows'][phase];phase=(phase+1)%3}tick();setInterval(tick,850)

FCP marks the first moment users can see real page content. It does not mean the main content has finished rendering.

The demo highlights the first heading appearing on a blank page, then fills a larger card. Compare FCP with LCP to see the gap between first feedback and main content.

When to use

Inspect it with LCP when the initial blank screen feels long.

Open as page ↗