홀리 그레일 레이아웃

Holy grail layout

헤더·좌측 내비·본문·우측 사이드바·푸터로 이루어진, 웹의 가장 고전적인 5단 페이지 구조.

다른 이름: Header-nav-main-aside-footer
···
html
<div class="grail" id="grail">
  <header>header</header>
  <nav>nav</nav>
  <main>main</main>
  <aside>aside</aside>
  <footer>footer</footer>
</div>
css
.grail{width:min(94%,540px);height:min(92%,260px);display:grid;gap:6px;
  grid-template-areas:"h h h" "n m a" "f f f";
  grid-template-rows:16% 1fr 16%;grid-template-columns:22% 1fr 22%}
.grail>*{display:grid;place-items:center;border-radius:8px;background:var(--surface);border:1px solid var(--line);
  color:var(--muted);font-size:clamp(9px,1.6vmin,12px);letter-spacing:.08em;text-transform:uppercase;
  transition:box-shadow .3s,color .3s,border-color .3s}
header{grid-area:h}nav{grid-area:n}main{grid-area:m}aside{grid-area:a}footer{grid-area:f}
.grail>*.active{color:var(--bg);border-color:transparent;background:var(--accent);
  box-shadow:0 6px 18px color-mix(in oklab,var(--accent) 45%,transparent)}
js
const grail = document.getElementById('grail');
const parts = grail.querySelectorAll('*');
let i = 0;
setInterval(() => {
  parts.forEach((p) => p.classList.remove('active'));
  parts[i % parts.length].classList.add('active');
  i++;
}, 1000);

"찾기 어려운 성배(holy grail)"라는 별명은 예전에 테이블·float으로 이 구조를 만들 때 본문 높이에 맞춰 좌우 칼럼 높이를 맞추는 게 유독 까다로웠기 때문에 붙었습니다. Flexbox와 CSS Grid가 나오면서 지금은 몇 줄이면 끝나는 문제가 됐습니다.

Grid로는 `grid-template-areas`에 "header header header" / "nav main aside" / "footer footer footer"를 적어주는 게 가장 직관적입니다. 각 영역의 순서를 소스 순서와 다르게 배치할 수 있어서, 모바일에서는 nav를 main 아래로 보내는 식의 재배치도 쉽습니다.

지금은 "이 구조 자체"보다 이 문제를 Grid 한 줄로 푸는 방법을 보여주는 교육적 예시로 더 많이 언급됩니다. 실제 서비스에서는 사이드바가 없거나 내비가 상단에만 있는 변형이 더 흔합니다.

언제 쓰나

문서형 사이트(위키, 관리자 페이지)처럼 내비·본문·보조 정보가 뚜렷이 나뉠 때. 콘텐츠 중심 서비스는 사이드바 없는 단순 구조가 더 잘 맞는 경우가 많습니다.