랜드마크

Landmarks

header·nav·main·aside·footer 같은 시맨틱 태그로 페이지를 구역화해, 스크린 리더 사용자가 영역 단위로 건너뛸 수 있게 하는 것.

다른 이름: ARIA landmarksPage regions
···
html
<div class="stage">
  <div class="pane">
    <div class="tag">div soup</div>
    <div class="mini">
      <div class="b"></div>
      <div class="b"></div>
      <div class="b tall"></div>
      <div class="b"></div>
    </div>
    <div class="list empty">landmarks: (none)</div>
  </div>
  <div class="pane">
    <div class="tag">semantic tags</div>
    <div class="mini">
      <div class="b l" id="r0"></div>
      <div class="b l" id="r1"></div>
      <div class="b l tall" id="r2"></div>
      <div class="b l" id="r3"></div>
    </div>
    <div class="list" id="rotor">banner</div>
  </div>
</div>
css
.stage{width:94%;height:88%;display:flex;gap:4%}
.pane{position:relative;flex:1;border-radius:14px;border:1px solid var(--line);background:var(--surface);display:flex;flex-direction:column;padding:10px 8% 8px;gap:6%;overflow:hidden}
.tag{flex:none;font:700 10px/1 ui-monospace,monospace;color:var(--muted)}
.mini{flex:1;min-height:0;display:flex;flex-direction:column;gap:6%}
.b{border-radius:6px;background:var(--muted);opacity:.25;flex:1;min-height:0}
.tall{flex:2}
.l{opacity:.4;transition:opacity .3s ease,outline-color .3s ease;outline:2px solid transparent;outline-offset:-2px}
.l.hit{opacity:1;outline-color:var(--accent)}
.list{flex:none;font:700 10px/1 ui-monospace,monospace;color:var(--accent-3);text-align:center}
.list.empty{color:var(--muted);opacity:.5}
js
const rows = [
  { el: document.getElementById('r0'), name: 'banner' },
  { el: document.getElementById('r1'), name: 'navigation' },
  { el: document.getElementById('r2'), name: 'main' },
  { el: document.getElementById('r3'), name: 'contentinfo' },
];
const rotor = document.getElementById('rotor');
let i = 0;
function tick() {
  rows.forEach(function (r) { r.el.classList.remove('hit'); });
  const cur = rows[i % rows.length];
  cur.el.classList.add('hit');
  rotor.textContent = cur.name;
  i++;
}
tick();
setInterval(tick, 1000);

스크린 리더에는 랜드마크 목록을 불러오는 단축키가 있습니다(VoiceOver의 로터, NVDA의 랜드마크 목록 등). `<div>`로만 이루어진 페이지는 이 목록이 텅 비어서, 사용자가 콘텐츠 시작 지점을 찾으려면 처음부터 한 줄씩 읽어 내려가야 합니다. `<header>`(banner), `<nav>`(navigation), `<main>`, `<aside>`(complementary), `<footer>`(contentinfo)를 쓰면 각 태그가 암묵적으로 해당 ARIA 역할을 갖게 되어 이 목록에 자동으로 나타납니다.

`<main>`은 페이지당 하나만 써야 하고, `<nav>`가 여러 개면 `aria-label`로 서로 구별해줘야 합니다("주 메뉴" vs "페이지 하단 메뉴"). `role="main"` 같은 ARIA 역할을 직접 줘도 같은 효과를 내지만, 가능하면 네이티브 태그를 먼저 씁니다.

데모는 같은 레이아웃을 두 가지로 보여줍니다 — 전부 `<div>`인 페이지(랜드마크 목록이 비어 있음)와 시맨틱 태그로 구역화한 페이지(목록이 배너 → 내비게이션 → 메인 → 콘텐츠 정보 순으로 항목을 훑습니다).

언제 쓰나

새 페이지를 짤 때 레이아웃 뼈대를 시맨틱 태그로 시작하세요 — 스타일링과 무관하게 무료로 얻는 접근성입니다. nav가 두 개 이상이면 aria-label을 꼭 붙이세요.