커버 레이아웃

Cover layout

header·footer가 있든 없든 가운데 요소를 화면 안에서 항상 수직 중앙에 두는 레이아웃. `margin-block: auto` 트릭 하나로 동작합니다.

다른 이름: Every Layout Cover
···
html
<div class="frame">
  <div class="cover" id="cover">
    <header id="chdr">Header</header>
    <div class="centered">Centered</div>
    <footer id="cftr">Footer</footer>
  </div>
</div>
css
.frame{width:min(58%,200px);height:min(92%,290px);border:1px solid var(--line);border-radius:12px;overflow:hidden;
  box-shadow:0 8px 24px rgba(0,0,0,.12);background:var(--bg)}
.cover{display:flex;flex-direction:column;min-height:100%;padding:10px;gap:0}
.cover header,.cover footer{background:var(--surface);border:1px solid var(--line);border-radius:6px;
  padding:8px;text-align:center;font-size:10px;font-weight:700;color:var(--muted);flex-shrink:0;transition:opacity .4s}
.centered{margin-block:auto;background:var(--accent);color:#fff;border-radius:8px;padding:14px;text-align:center;
  font-size:12px;font-weight:800}
js
const chdr = document.getElementById('chdr');
const cftr = document.getElementById('cftr');
const states = [
  [true, true],
  [false, true],
  [true, false],
  [false, false],
];
let i = 0;
function apply() {
  const [h, f] = states[i % states.length];
  chdr.style.display = h ? 'block' : 'none';
  cftr.style.display = f ? 'block' : 'none';
  i++;
}
apply();
setInterval(apply, 1700);

`display: flex; flex-direction: column; min-height: 100%`인 컨테이너 안에서, 가운데에 두고 싶은 요소에 `margin-block: auto`(위아래 마진 모두 `auto`)를 줍니다. Flexbox에서 `auto` 마진은 그 방향의 남는 공간을 전부 빨아들이는 성질이 있으므로, 위 여백과 아래 여백이 같은 크기로 늘어나며 요소를 정확히 중앙에 위치시킵니다.

이 방식의 특별한 점은 header·footer가 있어도 없어도 같은 코드가 그대로 작동한다는 것입니다. header가 있으면 `margin-block: auto`는 "header 아래부터 footer 위까지"의 남은 공간을 기준으로 중앙을 계산하고, header가 사라지면 그만큼 계산 기준이 자동으로 넓어질 뿐 코드를 바꿀 필요가 없습니다. `position: absolute` + `transform: translateY(-50%)`로 중앙 정렬을 하면 이런 유연함이 없습니다 — 부모의 실제 높이를 무시하고 항상 정중앙에 못박히기 때문입니다.

히어로 섹션의 "화면 전체 높이를 쓰되 안에 로고나 안내문 한 줄이 얹혀야 하는" 상황에 정확히 들어맞는 패턴입니다.

언제 쓰나

풀스크린 히어로, 로그인 화면, 404 페이지처럼 "화면 전체를 차지하되 안의 콘텐츠는 가운데 있어야 하는" 화면에 씁니다.