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제목과 랜드마크가 개요를 형성하는 방식 스크린 리더는 페이지에서 두 가지 목록을 만듭니다: 모든 제목과 그 수준, 그리고 모든 랜드마크 영역입니다. 그 쌍이 개요이며, 많은 사람들이 실제로 읽는 방식입니다. 따라서 구조는 몇 가지 사용자를 위한 좋은 것이 아니라, 읽기 경험 자체이며, 당신이 선택한 태그에서 바로 나옵니다.

하나의 메인과 올바른 제목 순서

개요를 깔끔하게 유지하는 두 가지 습관이 있습니다. 첫째, 페이지에 단일 <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에 유지하는 단일 페이지 앱). 이는 ARIA 역할 main을 가지며, 키보드 및 스크린 리더 사용자가 반복되는 네비게이션을 우회하기 위해 의존하는 "주요 콘텐츠로 건너뛰기" 이동의 목표입니다.

제목 수준은 나타나는 것보다 훨씬 더 많은 무게를 가지는데, 이는 알아둘 가치가 있는 역사 때문입니다. 수년 동안 HTML 사양은 문서 **개요 알고리즘**을 설명했으며, 이는 섹셔닝 요소(<section>, <article>, <nav>, <aside>)에서 구조를 계산하므로, <section> 내에 중첩된 <h1>은 자동으로 두 번째 수준 제목으로 강등될 것입니다. 이는 깔끔한 생각이었습니다. 아무 브라우저도 이를 구현하지 않았고, 어떤 스크린 리더도 이를 사용하지 않았으며, 결국 사양에서 제거되었습니다.

실제적인 결과는 간단하고 영구적입니다: 개요는 당신의 제목 번호만으로 정의됩니다. 세 개의 <section> 요소 깊이 내에 중첩된 <h1>은 여전히 모든 브라우저와 모든 스크린 리더에 최상위 제목입니다. 중첩은 아무것도 당신을 위해 번호를 다시 매기지 않습니다. 따라서 하나의 <h1>을 유지하고, 한 번에 한 수준씩 내려가며, 수치를 크기 다이얼로 절대 다루지 말고 구조적 사실로 취급하세요.

Juno하나의 메인과 올바른 제목 순서 페이지는 하나의 제목을 가지므로 페이지당 하나의 <h1>입니다. 제목 수준을 한 번에 한 단계씩 내려가세요, <h2> 다음에 <h3>, <h5>로 건너뛰지 마세요. 그리고 페이지의 주요 콘텐츠는 하나의 <main>에 들어갑니다. 제목이 틀린 크기로 보이면, 그것은 CSS의 일이지, 수준을 전환할 이유가 아닙니다.
Juno하나의 메인과 올바른 제목 순서 하나의 <main>, 하나의 <h1>, 그리고 한 번에 하나씩 내려가는 수준입니다. 제목을 렌더링하는 크기에 대해서가 아니라 개요에서의 위치에 대해 선택하세요, 크기는 스타일시트에 속하기 때문입니다. <main>은 또한 건너뛰기 링크의 목표이므로, 하나를 유지하면 그 지름길이 작동합니다.
Juno하나의 메인과 올바른 제목 순서 섹션 중첩에 의해 제목을 번호 다시 매기는 이전 개요 알고리즘은 절대 구축되지 않았으므로 당신의 제목 번호가 개요입니다, 전부입니다. 세 개의 <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 또는 그리드로 시각적으로 물건들을 이동할 수 있지만, 소스를 변경하지 않습니다. 따라서 마크업을 콘텐츠가 실제로 읽는 순서로 작성한 다음 거기서부터 스타일링합니다. CSS에서 재순서하면 가시적 순서와 탭 순서가 더 이상 일치하지 않아 키보드로 탐색하는 사람에게 방향 감각을 잃게 합니다.

<section><article>은 콘텐츠를 그룹화하지만, 어느 것도 제목 수준을 생성하지 않습니다. 이것이 개요 알고리즘 포인트가 구체화됩니다: <section>은 개요에 못을 더하지 않으며, 내부에 제목이 없는 <section>은 스크린 리더가 탐색할 수 있는 것에 기여하지 않습니다. 모든 섹셔닝 요소에 제목을 주거나, 그것은 눈이 볼 수 있는 그룹화이고 개요가 할 수 없습니다.

스킴 읽기를 염두에 두고 구조화합니다, 거의 아무도 처음부터 끝까지 페이지를 읽지 않기 때문입니다. 시력이 있는 사용자는 제목을 스캔합니다; 스크린 리더 사용자는 제목 및 랜드마크 목록을 통과합니다. 화면마다 설명적인 <h2> 하나, 그리고 포인트가 지원 세부 정보 전에 오도록 콘텐츠를 앞에 로드하는 것은 둘 다 제공합니다. 제목이 없는 문단 벽은 어느 종류의 스키머에게도 읽을 수 없습니다.

그러면 **키보드 네비게이션**이 있으며, 마우스보다는 Tab 키로 페이지를 이동하는 것으로, 소스 순서를 따릅니다. CSS order, flex-direction: row-reverse 또는 그리드 배치로 시각적으로 콘텐츠를 재순서하는 순간, 시각적 순서와 소스 순서가 갈라집니다: 브라우저가 여전히 소스를 따르기 때문에 포커스는 예측 불가능하게 화면 주위를 뜁니다. 마우스 사용자가 절대 주목하지 않을 재순서가 키보드 사용자에게는 미로가 됩니다. 신뢰할 수 있는 규칙은 소스 순서를 의도된 읽기 순서와 일치시키는 것이며, 콘텐츠가 읽히는 방식에 영향을 미치지 않는 변경을 위해 CSS 재순서를 예약하는 것입니다.

Juno콘텐츠 그룹화 및 순서 지정<section>으로 관련 콘텐츠를 제목을 가진 주제 부분에 대해 그룹화하고, <article>은 단일 게시물처럼 자체적으로 서는 부분을 래핑합니다. 그러면 순서를 신경 씁니다: 페이지는 위에서 아래로 읽으므로 중요한 것들이 맨 위 근처로 갑니다. 누군가가 실제로 읽고 싶은 순서대로 작성하세요.
Juno콘텐츠 그룹화 및 순서 지정<section>은 제목 아래 콘텐츠를 그룹화하고, <article>은 자체 포함된 단위를 래핑하며, 둘 다 개요에 도달하도록 제목이 필요합니다. 큰 것은 다음과 같습니다: 소스 순서는 읽기 순서이고 탭 순서입니다. 마크업을 읽는 순서대로 작성한 다음 CSS가 모양을 처리하게 하거나, 키보드 경로가 사람들이 보는 것과 일치하지 않습니다.
Juno콘텐츠 그룹화 및 순서 지정 제목 없는 <section>은 개요에 보이지 않으므로 모든 그룹화는 제목을 얻거나 스크린 리더가 도달할 수 있는 것을 그룹화하지 않습니다. 그리고 소스 순서는 당신의 탭 순서입니다: CSS order 또는 그리드로 재순서하고 포커스는 키보드 사용자를 위해 화면 주위를 뛰기 시작합니다. 소스 순서를 읽기 순서와 일치시키고 콘텐츠가 읽히는 방식을 변경하지 않을 때만 CSS에서 재순서합니다.

일반적인 구조적 실수

몇 가지 구조적 실수가 반복해서 나타나며, 각각은 깔끔한 해결책을 가집니다.

  • 텍스트를 크게 만들기 위해 제목 태그를 사용합니다. 원하는 크기로 렌더링된다고 해서 <h3>에 도달하는 것은 개요를 깨뜨립니다. 의미에 따라 수준을 선택하고 CSS에서 크기를 설정합니다.
  • 제목 수준을 건너뜁니다. <h2>에서 <h4>로 이동하면 개요에 구멍이 생깁니다. 한 번에 한 수준씩 내려가세요.
  • 하나 이상의 <h1> 입니다. 페이지는 하나의 제목을 가집니다. 추가 <h1> 태그는 목차를 헷갈리게 합니다.
  • 제목이 없습니다. 제목이 없는 오랜 문단 실행은 스캔하기 어렵습니다. 독자가 그들의 방식을 찾을 수 있도록 제목을 추가합니다.

이들을 수정하면 페이지는 모든 사람을 위해 명확하게 읽으며, 눈으로 스캔하든 큰 소리로 읽든 말입니다. 접근성 장은 모든 방문자를 위해 페이지를 작동하게 만드는 것에 대해 더 나아갑니다.

일반적인 실수는 모두 외관이 구조를 대신하는 것으로 축약됩니다.

렌더링된 크기에 대해 제목 수준을 선택하는 것은 개요를 섞이게 합니다, 수준이 구조적 신호이고 CSS가 이미 크기를 제어하기 때문입니다. 수준을 건너뛰는 것(<h2> 뒤에 <h4>)은 누락된 섹션으로 읽히는 간격을 남깁니다. 여러 <h1> 요소는 페이지에 하나 이상의 제목을 주고 목차를 흐리게 합니다. 그리고 <p> 또는 <div>를 굵고 크게 보이도록 스타일링하여 제목을 가짜하면, 구조 없이 모양을 얻습니다: 스크린 리더가 구축하는 제목 목록에 절대 나타나지 않습니다.

언급할 가치가 있는 두 가지 더 있습니다. <nav> 같은 빈 랜드마크는 아무데도 이끌지 않는 영역을 추가합니다. 그리고 CSS에서 콘텐츠를 재순서하여 가시적 순서가 더 이상 소스와 일치하지 않으면 키보드 사용자가 보는 것과 일치하지 않는 순서로 페이지를 탭으로 이동합니다. 구조를 HTML에, 외관을 CSS에 유지하면, 이 중 대부분은 절대 일어나지 않습니다.

대부분의 구조적 실패는 같은 오류가 다른 옷을 입은 것입니다: 구조가 필요한 곳에서 사용된 외관입니다. 제목처럼 보이도록 스타일링된 <div>는 스타일링이 개요에 영향을 미치지 않기 때문에 보조 기술에 아무것도 제공하지 않습니다; 실제 제목 요소만 제목 목록에 들어갑니다. 건너뛴 수준은 스크린 리더 사용자에게 사라진 섹션으로 읽습니다. 여러 <h1> 요소는 페이지에 여러 제목을 제공하고 대부분의 사용자가 의존하는 하나의 지름길을 약하게 합니다.

더 미묘한 실패는 순서와 포커스에 관한 것입니다. CSS로 재순서하여 시각적 및 소스 순서가 갈라지는 것은 마우스 사용자에게 보이지 않으며 탭을 통해 이동하는 사람에게 방향 감각을 잃게 합니다, 왜냐하면 키보드 네비게이션이 소스를 따르기 때문입니다. 양수 tabindex 값(요소를 탭 순서에서 더 일찍 강제하는 속성)은 순서를 벗어난 초점을 뛰게 함으로써 이것을 더 나쁘게 하며; 그것들을 피하고 소스 순서가 작동하게 하세요. 그리고 접근 가능한 콘텐츠가 없는 랜드마크, 빈 <nav> 또는 제목이 없는 <section>은 아무데도 이끌지 않는 영역을 지도에 추가합니다.

모든 것 아래의 규칙: CSS가 없어도 올바르도록 HTML에 구조를 구축하고, 그 위에 스타일링합니다. 개요가 평문, 스타일링 없는 마크업으로 유지되는 페이지는 이것이 읽히는 모든 방식으로 유지되는 것입니다. 요소 자체에 대해 더 알아보려면, 시맨틱 HTML 장이 이것의 동반자입니다.

Juno일반적인 구조적 실수 큰 네 가지: 텍스트를 크게 만들 제목을 사용하지 말고, 수준을 건너뛰지 말고, 두 번째 <h1>을 추가하지 말고, 긴 페이지를 제목 없이 두지 마세요. 각각은 개요를 혼동합니다. 제목 수준을 의미에 따라 선택하고 CSS가 크기를 처리하게 하세요.
Juno일반적인 구조적 실수 거의 모든 구조적 버그는 외관이 구조를 대신하는 것입니다: 크기에 대해 선택된 제목, 제목인 척하는 굵은 <div>, 건너뛴 수준, 두 개의 <h1> 요소. 스타일링된 <div>는 절대 개요에 도달하지 않으므로 눈에만 제목입니다. 구조를 HTML에, 스타일링을 CSS에 유지하면 이들은 대부분 사라집니다.
Juno일반적인 구조적 실수 모든 경우의 신호는 스타일링이 구조의 일을 하는 것입니다: 가짜 <div> 제목, 건너뛴 수준, 빈 랜드마크, 키보드 포커스를 뛰게 하는 CSS 재순서입니다. 양수 tabindex도 건너뛰세요, 그것은 초점을 순서 밖으로 끌어냅니다. 0 CSS로 올바른 마크업을 구축한 다음 위에 스타일링하고, 누군가가 그것에 도달하든지 그것은 올바르게 읽습니다.