Skip to content
This page has been auto-translated and may contain errors.View in English

문서 구조와 아웃라인

docs.scrimba.com

페이지는 그저 요소들을 쌓아놓은 무더기가 아닙니다. 위에서 아래로 읽어보면 하나로 짜여 있어야 합니다. 제목이 있고, 그 아래 각각 자기 헤딩을 가진 섹션들이 있고, 그것들이 죽 훑어 내려가기에 자연스러운 순서로 놓여 있어야 하죠. 이 짜임을 페이지의 아웃라인이라 부르며, 두 가지가 함께 만들어냅니다. 헤딩은 각 부분에 이름을 붙이고, 시맨틱 HTML 챕터에서 다룬 랜드마크 영역인 <header>, <nav>, <main>, <aside>, <footer>는 그 부분들을 묶어 영역으로 나눕니다. 이번 챕터에서는 이 둘이 어떻게 결합해 페이지 전체를 이루는지 살펴봅니다.

헤딩과 랜드마크가 아웃라인을 만드는 방식

웹 페이지는 책의 페이지를 읽듯 위에서 아래로 읽습니다. 방문자는 맨 위에서 시작해 아래로 내려가므로, 콘텐츠를 배치한 순서가 곧 방문자가 읽는 순서입니다. 사람들이 실제로 만나고 싶어할 순서대로 내용을 배치하세요.

이 순서에 형태를 부여하는 것이 바로 헤딩입니다. 헤딩은 뒤이어 나오는 부분에 붙이는 짧은 이름표로, <h1>부터 <h6>까지의 태그로 작성합니다. <h1>은 페이지 전체의 제목입니다. 각 <h2>는 그 아래의 주요 섹션에 이름을 붙이고, <h3><h2> 안의 더 작은 부분에 이름을 붙입니다. 이것들을 쌓아 올리면 페이지의 **아웃라인**이 만들어집니다. 페이지 순서를 그대로 비추는 목차인 셈이죠.

html
<h1>초보자를 위한 사워도우</h1>
<h2>필요한 것</h2>
<h3>재료</h3>
<h3>장비</h3>
<h2>스타터 만들기</h2>

헤딩만 따로 읽어도 페이지가 무엇에 관한 것이고 어떻게 구성되어 있는지, 본문 단락 하나 읽지 않고도 알 수 있습니다.

페이지의 구조는 두 개의 층에서 나오며, 이 둘은 각기 다른 질문에 답합니다. <h1>부터 <h6>까지의 헤딩 레벨은 중첩된 계층 구조를 이룹니다. <h1>은 페이지 제목, <h2>는 최상위 섹션, <h3>은 그 <h2>의 하위 섹션이 되는 식이죠. 헤딩만 읽어도 페이지의 아웃라인, 즉 마크업에서 곧바로 뽑아낸 목차를 얻게 됩니다.

랜드마크 요소는 두 번째 층을 이룹니다. <header>, <nav>, <main>, <aside>, <footer>는 페이지를 이름 붙은 영역들로 나누어, 주제를 나열한 목록 대신 영역의 지도를 보여줍니다. 여기는 내비게이션, 여기는 본문, 여기는 하단 영역이라는 식으로요.

html
<body>
  <header>
    <nav>...</nav>
  </header>
  <main>
    <h1>초보자를 위한 사워도우</h1>
    <h2>필요한 것</h2>
    <h2>스타터 만들기</h2>
  </main>
  <footer>...</footer>
</body>

한 구조는 콘텐츠가 무엇에 관한 것인지(헤딩) 알려주고, 다른 구조는 각 종류의 콘텐츠가 어디에 있는지(랜드마크) 알려줍니다. 제대로 만든 페이지는 이 둘을 모두 갖추고 있습니다.

**아웃라인**은 페이지 구조를 계층으로 표현한 것입니다. 맨 위에 제목이 있고, 그 아래 섹션들이 있고, 그 아래 다시 하위 섹션들이 있는 식이죠. 이것을 화면에 그려주는 것은 없습니다. 아웃라인은 마크업 안에 존재하며, 주된 독자는 픽셀이 아니라 구조를 읽어내는 소프트웨어입니다.

스크린 리더(시각으로 탐색하지 않는 사람을 위해 페이지를 소리로 읽어주거나 점자 디스플레이를 구동하는 소프트웨어)는 페이지에서 두 가지 탐색 가능한 구조를 만들어냅니다. 첫 번째는 <h1>부터 <h6>까지 모든 헤딩을 레벨 정보와 함께 소스 순서대로 나열한 목록으로, 사용자가 헤딩 전체를 불러와 원하는 곳으로 바로 이동할 수 있게 해줍니다. 두 번째는 <header>, <nav>, <main>, <aside>, <footer>로 표시된 영역인 랜드마크 목록으로, 사이 내용을 다 훑지 않고 영역 단위로 바로 건너뛸 수 있게 해줍니다. 각 랜드마크 요소는 암묵적인 ARIA 역할(그 영역이 어떤 종류인지 이름 붙이는 접근성 레이블, 예를 들어 navigation이나 main)을 가지며, 스크린 리더가 안내하는 것도 바로 이 역할입니다.

이 두 구조가 실제 아웃라인입니다. 시각 사용자는 페이지를 훑어 내려가며 헤딩 텍스트를 스캔하고, 스크린 리더 사용자는 같은 헤딩과 영역들을 순서대로 밟아가며 훑습니다. 같은 구조를 두 가지 방식으로 도달하는 것이죠. 그래서 이 구조를 의도적으로 만들어야 합니다. 아웃라인은 일부 사람만 의지하는 장식이 아니라, 상당수 사람들이 페이지를 읽는 방식 자체이기 때문입니다.

Juno헤딩과 랜드마크가 아웃라인을 만드는 방식 페이지는 책처럼 위에서 아래로 읽으므로, 사람들이 원하는 순서로 내용을 배치하세요. <h1>부터 <h6>까지의 헤딩은 뼈대입니다. <h1>이 페이지 제목이고 나머지는 모두 그 안에 중첩됩니다. 헤딩만 읽어도 페이지가 어떻게 짜여 있는지 알 수 있어야 합니다.
Juno헤딩과 랜드마크가 아웃라인을 만드는 방식 페이지는 두 층으로 형태를 갖춥니다. 헤딩 레벨은 중첩된 목차를 만들고, <main><nav> 같은 랜드마크는 영역의 지도를 그립니다. 하나는 콘텐츠가 무엇에 관한 것인지 말해주고, 다른 하나는 그것이 어디에 있는지 말해줍니다. 둘 다 갖추면 페이지는 단순한 겉모습이 아니라 진짜 구조를 갖게 됩니다.
Juno헤딩과 랜드마크가 아웃라인을 만드는 방식 스크린 리더는 페이지에서 두 개의 목록을 만들어냅니다. 레벨 정보를 담은 모든 헤딩, 그리고 모든 랜드마크 영역이죠. 이 둘이 바로 아웃라인이며, 많은 사람들이 실제로 페이지를 읽는 방식입니다. 그러니 이 구조는 일부 사용자를 위한 편의가 아니라 읽기 경험 자체이며, 여러분이 선택한 태그에서 곧바로 나오는 결과입니다.

main은 하나, 헤딩 순서는 올바르게

두 가지 습관이 아웃라인을 깨끗하게 유지해줍니다. 첫째, 페이지에는 <h1>을 하나만 두세요. 그것은 페이지의 제목이고, 책 표지에 이름이 하나뿐인 것처럼 페이지도 제목이 하나입니다. 나머지는 모두 <h2> 이하입니다.

둘째, 레벨을 건너뛰지 마세요. <h2> 다음 단계는 <h3>이지, <h5>가 아닙니다. 레벨을 건너뛰면 아웃라인에 구멍이 생기는데, 이는 목차에 1장 다음 바로 4장이 나오는 것과 같습니다. 한 번에 한 레벨씩 내려가고 올라가세요.

html
<h1>평일 저녁 식단</h1>
<h2>파스타</h2>
<h3>토마토 바질</h3>
<h3>갈릭 버터</h3>
<h2>샐러드</h2>
<h3>그릭 샐러드</h3>

이 헤딩들이 담고 있는 내용은 보통 하나의 <main> 영역 안에 들어갑니다. <main>은 페이지의 핵심 콘텐츠, 즉 이 페이지에만 있고 여러 페이지가 공유하는 헤더나 내비게이션, 푸터가 아닌 부분을 표시합니다. <h1>이 하나뿐인 것처럼 <main>도 하나뿐입니다.

페이지에는 <main> 랜드마크가 정확히 하나 있어야 합니다. 이는 그 페이지만의 고유한 콘텐츠를 감싸며, 스크린 리더는 여기로 바로 이동하는 기능을 제공해서 사용자가 모든 페이지에 반복되는 헤더와 내비게이션을 건너뛸 수 있게 합니다. 한 페이지에 <main>이 두 개 있으면 이 약속이 깨지고 영역 지도가 헷갈리게 됩니다.

헤딩에 관해서는 두 가지 규칙이 아웃라인을 지탱합니다. <h1>은 하나, 그것이 페이지 제목입니다. 그리고 헤딩 레벨은 한 단계씩 내려갑니다. <h2> 다음에는 <h3>가 오지, 바로 <h4><h5>로 건너뛰지 않습니다. 헤딩 레벨은 아웃라인상의 위치에 따라 고르되, 보이는 크기 때문에 고르지는 마세요. <h1>은 보통 <main> 바로 안이나 페이지 헤더 안에 있으면서 페이지가 무엇에 관한 것인지 이름 붙입니다.

html
<main>
  <h1>평일 저녁 식단</h1>
  <h2>파스타</h2>
  <h3>토마토 바질</h3>
</main>

헤딩이 너무 크거나 너무 작아 보인다면, 그것은 스타일 문제입니다. 크기는 CSS에서 지정하고, 레벨은 원래 의미하는 대로 남겨두세요.

페이지마다 <main>은 하나입니다(마크업상 여러 개가 있어도 되는 경우는 하나만 빼고 나머지가 모두 숨겨져 있을 때뿐입니다. 예를 들어 비활성 뷰를 DOM에 유지하는 싱글 페이지 앱 같은 경우죠). <main>은 ARIA 역할 main을 가지며, 키보드와 스크린 리더 사용자가 반복되는 내비게이션을 건너뛰기 위해 의지하는 "본문으로 건너뛰기" 이동의 목적지입니다.

헤딩 레벨은 겉보기보다 훨씨 큰 무게를 지니는데, 알아둘 만한 역사가 있기 때문입니다. 오랫동안 HTML 스펙에는 섹셔닝 요소(<section>, <article>, <nav>, <aside>)로부터 구조를 계산하는 **아웃라인 알고리즘**이라는 것이 명시되어 있었습니다. 이 알고리즘에 따르면 <section> 안에 중첩된 <h1>은 자동으로 2단계 헤딩으로 강등되어야 했죠. 깔끔한 아이디어였지만, 어떤 브라우저도 이를 구현하지 않았고 어떤 스크린 리더도 이를 사용하지 않았으며, 결국 스펙에서 제거되었습니다.

실질적인 결론은 단순하고 변함없습니다. 아웃라인은 오직 여러분이 붙인 헤딩 번호로 정의됩니다. <section> 요소 세 겹 안에 중첩된 <h1>이라도 모든 브라우저와 모든 스크린 리더에게는 여전히 최상위 헤딩입니다. 중첩은 여러분 대신 번호를 다시 매겨주지 않습니다. 그러니 <h1>을 하나만 유지하고, 한 번에 한 레벨씩 내려가며, 숫자를 크기 조절 다이얼이 아니라 있는 그대로의 구조적 사실로 다루세요.

Junomain은 하나, 헤딩 순서는 올바르게 페이지마다 <h1>은 하나, 페이지에는 제목이 하나뿐이니까요. 헤딩 레벨은 한 단계씩 내려가세요, <h2> 다음 <h3>, <h5>로 건너뛰지 말고요. 그리고 페이지의 본문은 <main> 하나에 담으세요. 헤딩이 원하는 크기가 아니라면 그건 CSS가 할 일이지, 레벨을 바꿀 이유는 아닙니다.
Junomain은 하나, 헤딩 순서는 올바르게<main>은 하나, <h1>도 하나, 레벨은 한 단계씩 내려갑니다. 헤딩은 아웃라인상의 위치에 따라 고르고, 렌더링되는 크기로는 고르지 마세요. 크기는 스타일시트에 속한 문제니까요. <main>은 건너뛰기 링크의 목적지이기도 하니, 하나만 유지해야 그 바로가기가 제대로 작동합니다.
Junomain은 하나, 헤딩 순서는 올바르게 섹션 중첩에 따라 헤딩 번호를 다시 매겨주던 예전의 아웃라인 알고리즘은 구현된 적도 없이 폐기되었으니, 여러분이 붙인 헤딩 번호가 곧 아웃라인입니다. 그게 전부죠. <section> 세 겹 속에 파묻힌 <h1>도 어디서나 여전히 <h1>입니다. <h1> 하나, <main> 하나를 유지하고, 한 번에 한 레벨씩 내려가세요.

콘텐츠 묶기와 순서 정하기

관련된 콘텐츠는 묶어놓으면 더 잘 읽힙니다. 이를 위한 요소가 두 가지 있습니다. <section>은 자기 헤딩을 가진 주제별 묶음으로, 레시피의 "재료" 부분 같은 것입니다. <article>은 따로 떼어내도 그 자체로 의미가 통하는 독립된 조각으로, 블로그 글 한 편이나 고객 리뷰 하나 같은 것입니다.

html
<article>
  <h2>천천히 발효한 포카치아</h2>
  <p>거의 반죽할 필요가 없는 빵입니다.</p>
</article>

순서는 묶기만큼이나 중요합니다. 페이지는 위에서 아래로 읽히므로, 가장 중요한 콘텐츠를 위쪽에 배치하고 나머지는 독자가 원할 순서로 배치하세요. 레시피는 필요한 재료를 단계보다 먼저 나열하는데, 그것이 실제로 따라 할 때의 순서이기 때문입니다.

하나의 헤딩 아래 속하는 주제별 콘텐츠 묶음에는 <section>을 쓰고, 블로그 글, 상품 카드, 포럼 답글처럼 그 자체로 배포될 수 있는 독립된 단위에는 <article>을 쓰세요. 둘 다 헤딩을 가져야 아웃라인에 나타납니다. 묶기만 하고 이름을 붙이지 않으면 절반짜리 작업일 뿐입니다.

요소를 작성한 순서를 **소스 순서**라 부르며, 이것은 처음 보기보다 훨씬 큰 무게를 지닙니다. 소스 순서는 읽기 순서이자 탭 순서입니다. 읽기 순서는 스크린 리더가 읽어주는 순서이자 CSS 없이 페이지가 보여주는 순서입니다. 탭 순서는 Tab 키를 누를 때 키보드가 링크와 폼 컨트롤을 이동하는 순서입니다. 둘 다 기본적으로 소스를 따릅니다.

html
<main>
  <article>
    <h2>천천히 발효한 포카치아</h2>
    <h2>...</h2>
  </article>
</main>

CSS는 flexbox나 grid로 시각적으로 요소를 옮길 수 있지만, 소스 자체는 바꾸지 않습니다. 그러니 마크업은 콘텐츠가 실제로 읽히는 순서대로 작성하고, 그다음에 스타일을 입히세요. CSS로 순서를 바꿔버리면 눈에 보이는 순서와 탭 순서가 더 이상 맞지 않게 되고, 이는 키보드로 탐색하는 사람에게 혼란스러운 경험이 됩니다.

<section><article>은 콘텐츠를 묶어주지만, 둘 다 헤딩 레벨을 만들어내지는 않습니다. 이는 앞서 말한 아웃라인 알고리즘 이야기를 구체적으로 보여주는 지점입니다. <section>은 아웃라인에 계단을 하나 더해주지 않으며, 안에 헤딩이 없는 <section>은 스크린 리더가 이동할 곳을 전혀 만들어내지 못합니다. 모든 섹셔닝 요소에 헤딩을 붙이세요, 그러지 않으면 눈에는 보이지만 아웃라인에는 존재하지 않는 묶음이 됩니다.

거의 아무도 페이지를 처음부터 끝까지 읽지 않으므로, 훑어 읽기를 염두에 두고 구조를 짜세요. 시각 사용자는 헤딩을 스캔하고, 스크린 리더 사용자는 헤딩과 랜드마크 목록을 하나씩 짚어갑니다. 화면 한 컷마다 설명이 담긴 <h2>를 두고, 핵심을 먼저 말한 뒤 뒷받침하는 세부 사항을 배치하면 두 부류 모두에게 도움이 됩니다. 헤딩 없이 단락만 죽 이어지는 벽은 어느 쪽에게도 훑어 읽기가 불가능합니다.

그리고 마우스 대신 Tab 키로 페이지를 이동하는 **키보드 탐색**은 소스 순서를 따릅니다. CSS의 order, flex-direction: row-reverse, grid 배치로 콘텐츠를 시각적으로 재배열하는 순간, 시각적 순서와 소스 순서가 갈라집니다. 사용자가 Tab을 누를 때 포커스가 화면 곳곳을 예측 불가능하게 튀어 다니는데, 이는 브라우저가 여전히 소스를 따르기 때문입니다. 마우스 사용자는 눈치조차 못 채는 재배열이 키보드 사용자에게는 미로가 됩니다. 믿을 만한 규칙은 소스 순서를 의도한 읽기 순서와 일치시키고, CSS 재배열은 콘텐츠가 읽히는 방식에 영향을 주지 않는 변경에만 쓰는 것입니다.

Juno콘텐츠 묶기와 순서 정하기 헤딩을 가진 주제별 부분에는 <section>을, 하나의 글처럼 독립적으로 존재하는 조각에는 <article>을 써서 관련 콘텐츠를 묶으세요. 그다음 순서를 신경 쓰세요. 페이지는 위에서 아래로 읽히니 중요한 것은 위쪽에 두세요. 사람들이 실제로 읽고 싶어할 순서대로 작성하세요.
Juno콘텐츠 묶기와 순서 정하기<section>은 헤딩 아래 콘텐츠를 묶고, <article>은 독립된 단위를 감싸며, 둘 다 헤딩이 있어야 아웃라인에 자리를 잡습니다. 가장 중요한 것은 소스 순서가 읽기 순서이자 탭 순서라는 점입니다. 마크업은 읽히는 순서대로 작성하고 CSS로 겉모습을 처리하세요, 그러지 않으면 키보드 경로가 사람들이 보는 것과 어긋나게 됩니다.
Juno콘텐츠 묶기와 순서 정하기 헤딩이 없는 <section>은 아웃라인에서 보이지 않으므로, 모든 묶음은 헤딩을 가져야 하며 그러지 않으면 스크린 리더가 닿을 수 있는 것을 아무것도 묶지 못한 셈입니다. 그리고 소스 순서가 곧 탭 순서입니다. CSS order나 grid로 재배열하면 키보드 사용자의 포커스가 화면 곳곳을 튀어다니기 시작합니다. 소스 순서를 읽기 순서에 맞추고, CSS 재배열은 콘텐츠가 읽히는 방식을 바꾸지 않을 때만 쓰세요.

흔한 구조적 실수들

몇 가지 구조적 실수가 계속해서 반복되는데, 각각 깔끔한 해결책이 있습니다.

  • 헤딩 태그로 글자를 크게 만들기. 원하는 크기로 보이도록 <h3>을 쓰면 아웃라인이 깨집니다. 레벨은 의미에 따라 고르고, 크기는 CSS에서 지정하세요.
  • 헤딩 레벨 건너뛰기. <h2>에서 <h4>로 건너뛰면 아웃라인에 구멍이 생깁니다. 한 번에 한 레벨씩 내려가세요.
  • <h1>을 두 개 이상 쓰기. 페이지에는 제목이 하나뿐입니다. <h1> 태그가 여러 개면 목차가 헷갈립니다.
  • 헤딩을 전혀 쓰지 않기. 아무것도 끊어주지 않고 길게 이어지는 단락들은 훑어 읽기 어렵습니다. 독자가 길을 찾을 수 있도록 헤딩을 추가하세요.

이것들을 고치면 눈으로 훑어보든 소리로 들려주든 누구에게나 페이지가 명확하게 읽힙니다. 모든 방문자를 위해 페이지를 제대로 만드는 방법은 접근성 챕터에서 더 자세히 다룹니다.

흔한 실수들은 모두 구조를 겉모습이 대신하는 데서 비롯됩니다.

렌더링되는 크기 때문에 헤딩 레벨을 고르면 아웃라인이 뒤엉킵니다. 레벨은 구조적 신호이고 크기는 이미 CSS가 관리하는 영역이기 때문입니다. 레벨을 건너뛰는 것(<h2> 다음에 <h4>)은 섹션이 빠진 것처럼 읽히는 구멍을 남깁니다. <h1>을 여러 개 쓰면 페이지에 제목이 여러 개 생겨 목차가 흐려집니다. 그리고 헤딩을 흉내 내어 <p><div>를 굵고 크게 스타일링하면 겉모습만 있고 구조는 전혀 없습니다. 스크린 리더가 만드는 헤딩 목록에는 결코 나타나지 않습니다.

한 가지 더 짚을 것이 있습니다. <nav>처럼 안에 아무것도 없는 빈 랜드마크는 아무 데로도 이어지지 않는 영역을 추가하는 것입니다. 그리고 CSS로 콘텐츠 순서를 바꿔 눈에 보이는 순서가 소스와 더 이상 맞지 않게 되면, 키보드 사용자는 자신이 보는 것과 맞지 않는 순서로 페이지를 탭하며 지나가게 됩니다. 구조는 HTML에, 겉모습은 CSS에 두면 이런 문제들은 대부분 일어나지 않습니다.

구조적 실패는 대부분 같은 오류가 다른 옷을 입고 나타난 것입니다. 구조가 필요한 자리에 겉모습을 쓴 것이죠. 헤딩처럼 보이도록 스타일링한 <div>는 보조 기술에 아무것도 제공하지 못합니다. 스타일링은 아웃라인에 아무 영향을 주지 않으며, 오직 진짜 헤딩 요소만 헤딩 목록에 들어가기 때문입니다. 레벨을 건너뛰면 스크린 리더 사용자에게는 섹션이 사라진 것처럼 읽힙니다. <h1>을 여러 개 쓰면 페이지에 여러 제목을 부여해 대부분의 사용자가 의지하는 그 하나의 바로가기를 약화시킵니다.

더 미묘한 실패는 순서와 포커스에 관한 것입니다. CSS로 재배열해서 시각적 순서와 소스 순서가 갈라지면, 마우스 사용자에게는 보이지 않지만 탭으로 이동하는 사람에게는 혼란스럽습니다. 키보드 탐색은 소스를 따르기 때문입니다. 양수 tabindex 값(요소를 탭 순서에서 더 앞자리로 강제하는 속성)은 포커스를 순서 없이 이리저리 튀게 만들어 상황을 더 악화시킵니다. 이런 값은 피하고 소스 순서가 일을 하도록 두세요. 그리고 접근 가능한 콘텐츠가 없는 랜드마크, 즉 빈 <nav>나 헤딩 없는 <section>은 지도에 아무 데로도 이어지지 않는 영역을 추가할 뿐입니다.

이 모든 것 아래 깔린 규칙은 이것입니다. 구조를 HTML에서 만들어 CSS가 전혀 없어도 올바르게 서 있도록 한 다음, 그 위에 스타일을 입히세요. 스타일 없는 순수 마크업만으로도 아웃라인이 제대로 서 있는 페이지는 어떤 방식으로 읽히든 제대로 서 있습니다. 요소 자체에 관해 더 알고 싶다면, 시맨틱 HTML 챕터가 이 챕터의 짝이 되어줄 것입니다.

Juno흔한 구조적 실수들 4대 실수: 글자를 크게 만들려고 헤딩을 쓰지 말 것, 레벨을 건너뛰지 말 것, <h1>을 두 번째로 추가하지 말 것, 그리고 긴 페이지에 헤딩을 전혀 두지 않은 채 방치하지 말 것. 하나하나가 아웃라인을 헷갈리게 만듭니다. 헤딩 레벨은 의미로 고르고 크기는 CSS가 처리하게 하세요.
Juno흔한 구조적 실수들 거의 모든 구조적 버그는 구조를 겉모습이 대신하는 데서 나옵니다. 크기 때문에 고른 헤딩, 헤딩인 척하는 굵은 <div>, 건너뛴 레벨, <h1> 두 개. 스타일링한 <div>는 결코 아웃라인에 들어가지 않으니, 눈에만 헤딩으로 보일 뿐입니다. 구조는 HTML에, 스타일은 CSS에 두면 이런 문제는 대체로 사라집니다.
Juno흔한 구조적 실수들 어느 경우든 알아볼 수 있는 특징은 스타일링이 구조의 일을 대신하고 있다는 점입니다. 가짜 <div> 헤딩, 건너뛴 레벨, 빈 랜드마크, 키보드 포커스를 튀게 만드는 CSS 재배열까지. 양수 tabindex도 피하세요, 포커스를 순서 밖으로 끌고 나갑니다. CSS가 전혀 없어도 올바른 마크업을 먼저 만들고 그 위에 스타일을 입히면, 누가 어떤 방식으로 접근하든 제대로 읽힙니다.