웹 접근성 기초 점검: 키보드 순서·초점 표시·확대 화면을 직접 확인하는 체크리스트

··설명 약 10분·작성: 해비·블로그 소개

웹 접근성을 키보드 이동과 200% 확대 화면에서 어떻게 점검하나요?

접근성은 마우스 없이 기능을 찾아 사용할 수 있는지부터 점검합니다. Tab 이동 순서와 초점 표시, Enter·Space 조작을 보고, 200% 확대와 좁은 화면에서 내용 가림을 확인합니다.

적용 조건·범위: 상단에서는 두 파일로 만든 독립 화면을 점검하고, 하단에서는 앞서 만든 TaskFlow의 skip link와 공통 focus 스타일에 같은 기준을 적용합니다. 자동 도구 결과와 실제 키보드 사용 결과는 구분해 기록합니다.

본문 근거: developer.mozilla.org/en-US/docs/Learn_web_development/Core/Accessibility/HTML

독립 실습: 직접 만들고 확인하기

웹 접근성 기초 점검: 키보드 순서·초점 표시·확대 화면을 직접 확인하는 체크리스트 · 독립 실습

Tab으로 본문 바로가기·링크·폼을 이동하며 초점과 이메일 검증을 확인하세요.

예제 크게 보기 (새 탭)
.skip-link { position: absolute; left: 16px; top: -100px; padding: 10px; background: #222; color: #fff; }
.skip-link:focus { top: 16px; }
:focus-visible { outline: 2px solid #222; outline-offset: 3px; }
직접 실행: 환경 준비와 전체 파일

독자 질문

마우스 없이 서비스 화면의 모든 기능에 도달하고 초점 위치를 볼 수 있을까요?

직접 만들 화면

건너뛰기 링크, 문의 폼, FAQ가 키보드 순서대로 이어지는 TaskFlow 점검 화면

새 폴더에 index.html과 style.css를 만들고 아래 전체 파일을 각각 저장하세요. 브라우저에서 index.html을 엽니다.

<!doctype html>
<html lang="ko">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>웹 접근성 기초 점검: 키보드 순서·초점 표시·확대 화면을 직접 확인하는 체크리스트</title><link rel="stylesheet" href="./style.css"></head>
<body>
<a class="skip-link" href="#main">본문으로 바로가기</a>
<header><nav aria-label="주요 메뉴"><a href="#main">소개</a> <a href="#contact">문의</a></nav></header>
<main id="main" tabindex="-1">
  <h1>TaskFlow</h1>
  <form id="contact">
    <label for="email">이메일</label>
    <input id="email" name="email" type="email" required>
    <button type="submit">문의 보내기</button>
  </form>
  <details><summary>계정 없이 사용할 수 있나요?</summary><p>기본 화면을 살펴볼 수 있습니다.</p></details>
</main>
</body>
</html>

확인할 결과와 실제 검증 상태

Tab 첫 이동에서 건너뛰기 링크가 보이고 Enter로 main에 도착하는지, 입력창 label 클릭과 FAQ의 Enter/Space 조작이 가능한지 직접 확인하세요. 건너뛰기 링크에서 main으로 이동한 뒤 다음 Tab이 이메일 입력으로 이어지는지, 입력에서 Shift+Tab을 누르면 앞선 메뉴로 돌아갈 수 있는지 기록하세요. 200% 확대와 320px 폭에서 내용 가림·가로 넘침도 기록하세요. 이 정적 폼은 제출 저장 기능을 구현하지 않았으므로 결과로 쓰지 않습니다.

실제 브라우저·DevTools 조작 결과: 미확인. 위 내용은 코드에서 예상되는 결과와 독자가 수행할 확인 절차입니다.

다음 학습 연결

14회차에서는 이 기준으로 점검하고 필요한 문제를 수정한 구성 요소를 하나의 완성 페이지로 묶습니다.

1. 키보드만으로 이동하기

마우스를 사용하지 않고 Tab과 Shift+Tab으로 페이지를 이동합니다.

확인 대상:

header link
nav link
FAQ summary
form input
textarea
submit button
pricing link
fixed help link

focus 순서가 시각 순서와 크게 어긋나지 않는지 봅니다.

tabindex를 남용하지 않기

다음처럼 양수 tabindex로 순서를 인위적으로 재배치하지 않습니다.

<button tabindex="10">

DOM source order를 자연스럽게 구성하는 것이 기본입니다.

필요한 custom focusable 요소가 있다면 0 또는 -1의 의미를 이해하고 사용합니다.

focus indicator

다음 CSS는 피합니다.

*:focus {
  outline: none;
}

키보드 사용자가 현재 위치를 잃을 수 있습니다.

필요하면 focus-visible 스타일을 개선합니다.

:focus-visible {
  outline: 2px solid #171717;
  outline-offset: 3px;
}
키보드 이동과 초점 표시를 확인하고, 화면을 확대해도 주요 내용과 조작 요소가 가려지지 않는지 점검합니다.
개념 설명용 일러스트. 키보드 이동과 초점 표시를 확인하고, 화면을 확대해도 주요 내용과 조작 요소가 가려지지 않는지 점검합니다. 이미지 원본 열기

source order

CSS Grid/Flex의 order 속성으로 화면 위치를 바꿔도 DOM 읽기 순서는 그대로일 수 있습니다.

시각적으로 첫 번째인 콘텐츠가 DOM에서는 마지막이라면 키보드와 읽기 순서가 혼란스러울 수 있습니다.

가능하면 source order 자체를 의미 있는 순서로 작성합니다.

200% zoom

브라우저 zoom을 200%로 올립니다.

확인합니다.

  • 텍스트가 잘리지 않는가
  • fixed 요소가 본문을 가리지 않는가
  • 표 외의 페이지 전체에 가로 스크롤이 생기지 않는가
  • form label과 input이 겹치지 않는가
  • FAQ 내용을 읽을 수 있는가

작은 viewport

320~360px 정도로 줄입니다.

반응형 CSS가 있더라도 실제 긴 텍스트·표·fixed button까지 함께 테스트해야 합니다.

form label

모든 input에 visible label 또는 의미 있는 accessible name이 있는지 확인합니다.

<label for="email">
  이메일
</label>
<input
  id="email"
  type="email"
/>

placeholder만 사용하지 않습니다.

link와 button

다른 위치로 이동
→ a


현재 페이지에서 동작 실행
→ button

스타일이 같아도 의미는 다릅니다.

table

pricing table에서 caption과 th/scope가 유지되는지 확인합니다.

<th scope="row">
  프로젝트
</th>

이미지 alt

hero와 card 이미지가 실제 정보를 전달한다면 alt를 제공합니다.

이미 주변 텍스트와 완전히 중복되는 장식 이미지라면 빈 alt를 검토합니다.

색상만으로 상태를 전달하지 않기

예를 들어 “선택된 요금제”를 색상만으로 구분하지 않습니다.

텍스트, 아이콘, aria-current 등 실제 의미와 맞는 보조 표현을 함께 검토합니다.

자동 도구와 수동 점검

Lighthouse나 Accessibility 검사 도구는 유용하지만 모든 문제를 찾지는 못합니다.

특히 다음은 직접 확인해야 합니다.

  • focus 순서가 자연스러운가
  • link text가 이해 가능한가
  • zoom 후 실제 사용 가능한가
  • FAQ label이 의미 있는가
  • alt가 이미지 목적에 맞는가

자주 발생하는 오류와 해결

자동 접근성 점수만 통과하면 끝이라고 생각합니다

자동 도구는 focus 순서의 자연스러움, link 문구의 이해 가능성, 200% zoom 후 실제 사용성 같은 항목을 완전히 판단하지 못합니다. 수동 점검을 병행합니다.

outline:none으로 기본 focus를 제거합니다

대체 focus 스타일이 없다면 키보드 사용자가 위치를 잃습니다. :focus-visible로 명확한 표시를 제공합니다.

CSS order로 시각 순서만 바꿉니다

DOM source order와 keyboard/reading order는 다를 수 있습니다. 가능한 경우 HTML 순서 자체를 의미 있게 구성합니다.

zoom에서 fixed UI가 내용을 가립니다

200% 확대와 작은 viewport를 함께 확인하고 고정 요소가 본문 사용을 막지 않는지 테스트합니다.

학습 완료 체크리스트

  • 키보드만으로 페이지를 점검할 수 있습니다.
  • focus indicator를 유지할 수 있습니다.
  • source order와 visual order를 구분할 수 있습니다.
  • 200% zoom과 작은 viewport를 테스트할 수 있습니다.
  • form, table, image의 접근성 기본을 확인할 수 있습니다.

독립 실습은 여기서 마칠 수 있습니다. 아래 선택 실습은 TaskFlow 프로젝트 파일로 진행합니다.

선택 실습: 할 일 앱에 적용하기

TaskFlow는 간단한 서비스 화면에서 시작해 할 일 앱으로 이어 만드는 예제입니다. 이 선택 실습에서는 HTML과 CSS로 이번 화면을 만듭니다.

TaskFlow 전체를 접근성 체크리스트로 검사하고 실제 문제만 수정합니다.

선택: 연재 프로젝트와 전체 자료

연재 프로젝트를 이어 만드는 분을 위한 자료입니다. 이 글의 개념과 예제만 찾으셨다면 필요한 파일과 실행 방법만 펼쳐보세요.

TaskFlow 프로젝트 적용

웹 접근성 기초 점검: 키보드 순서·초점 표시·확대 화면을 직접 확인하는 체크리스트 · 단계별 TaskFlow

TaskFlow 누적 13단계입니다. Tab으로 본문 바로가기·링크·폼을 이동하며 초점과 이메일 검증을 확인하세요.

예제 크게 보기 (새 탭)

실행 가능한 시작본과 이번 단계

이번 단계 시작 ZIP을 새 폴더에 압축 해제합니다. 이 ZIP은 직전 단계의 완료 파일과 같으며 앞 글의 코드를 따로 모을 필요가 없습니다. 이번 단계 완료 ZIP은 다른 폴더에 풀어 비교합니다.

body 첫 요소에 skip link를 추가하고 main id·tabindex, 전체 focus-visible 표시를 맞춥니다. 기존 #home은 hero에 유지합니다.

  1. index.html: 이 파일의 기존 내용을 아래 완료 파일 전체와 대조하여 교체합니다. 다른 파일은 유지합니다.
  2. style.css: 이 파일의 기존 내용을 아래 완료 파일 전체와 대조하여 교체합니다. 다른 파일은 유지합니다.

짧은 코드 예제는 변경 위치를 설명합니다. 파일 전체를 작성하거나 교체할 때는 완료 파일 전체를 사용하세요. 생략 표시가 있는 부분 코드를 파일 전체로 저장하지 않습니다.

실행: ZIP의 index.html을 브라우저에서 엽니다. 외부 서버나 npm 설치 없이 로컬 HTML·CSS·이미지를 사용합니다. 문의 폼은 서버 전송을 연결하지 않은 문서 예제입니다. 연습 값만 사용하고 입력 형식을 확인합니다.

직접 확인할 결과: 본문 바로가기 대상과 모든 메뉴 대상이 존재하고 form label·표 scope·FAQ summary·이미지 alt를 유지합니다.

전체 파일·코드 보기

완료 파일 전체

index.html 전체 파일

<!DOCTYPE html>
<html lang="ko">
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
  <title>
   TaskFlow
  </title>
  <link href="./style.css" rel="stylesheet"/>
 </head>
 <body>
  <a class="skip-link" href="#main">
   본문으로 바로가기
  </a>
  <header class="site-header">
   <div class="page site-header__inner">
    <a class="brand" href="#home">
     TaskFlow
    </a>
    <nav aria-label="주요 메뉴" class="nav">
     <a href="#features">
      기능
     </a>
     <a href="#contact">
      문의
     </a>
    </nav>
   </div>
  </header>
  <main class="page" id="main" tabindex="-1">
   <div class="service-layout">
    <div>
     <section class="hero" id="home">
      <h1>
       해야 할 일을 한눈에 정리하세요
      </h1>
      <p>
       TaskFlow는 오늘의 작업을 빠르게 정리하는 서비스입니다.
      </p>
      <img alt="TaskFlow 서비스 소개 페이지의 기능·문의 화면" class="hero__image" height="800" src="./images/hero.webp" width="1200"/>
     </section>
     <section id="features">
      <h2>
       주요 기능
      </h2>
      <div class="feature-grid">
       <article class="card feature-card">
        <span class="feature-card__badge">
         NEW
        </span>
        <h3>
         빠른 작업 추가
        </h3>
        <p>
         해야 할 일을 바로 기록할 수 있습니다.
        </p>
        <img alt="TaskFlow 기능 카드 세 개" class="feature-card__image" height="450" src="./images/feature-board.webp" width="800"/>
       </article>
       <article class="card">
        <h3>
         간단한 분류
        </h3>
        <p>
         해야 할 일을 구분합니다.
        </p>
       </article>
       <article class="card">
        <h3>
         진행 확인
        </h3>
        <p>
         완료 여부를 확인합니다.
        </p>
       </article>
       <article class="card task-preview">
        <div class="task-preview__content">
         <h3>
          아주 긴 작업 제목과 URL
         </h3>
         <p>
          https://example.com/very-long-task-url-without-normal-break-points-123456789
         </p>
        </div>
        <a href="#contact">
         문의
        </a>
       </article>
      </div>
     </section>
     <section class="faq" id="faq">
      <h2>
       자주 묻는 질문
      </h2>
      <details>
       <summary>
        TaskFlow는 어떤 서비스인가요?
       </summary>
       <p>
        해야 할 일을 빠르게 정리하는 작업 관리 서비스 예제입니다.
       </p>
      </details>
      <details>
       <summary>
        모바일에서도 볼 수 있나요?
       </summary>
       <p>
        작은 화면부터 설계한 반응형 레이아웃을 사용합니다.
       </p>
      </details>
      <details>
       <summary>
        문의는 어디서 하나요?
       </summary>
       <p>
        아래 문의 폼을 이용할 수 있습니다.
       </p>
      </details>
     </section>
     <section id="pricing">
      <h2>
       요금제
      </h2>
      <div class="pricing-grid">
       <article class="card">
        <h3>
         Basic
        </h3>
        <p>
         개인 학습용
        </p>
       </article>
       <article class="card">
        <h3>
         Pro
        </h3>
        <p>
         더 많은 프로젝트
        </p>
       </article>
      </div>
      <div aria-label="요금제 비교표 가로 스크롤" class="table-scroll" role="region" tabindex="0">
       <table class="pricing-table">
        <caption>
         TaskFlow 요금제 기능 비교
        </caption>
        <thead>
         <tr>
          <th scope="col">
           항목
          </th>
          <th scope="col">
           Basic
          </th>
          <th scope="col">
           Pro
          </th>
         </tr>
        </thead>
        <tbody>
         <tr>
          <th scope="row">
           프로젝트
          </th>
          <td>
           3개
          </td>
          <td>
           무제한
          </td>
         </tr>
         <tr>
          <th scope="row">
           작업 보관
          </th>
          <td>
           30일
          </td>
          <td>
           무제한
          </td>
         </tr>
         <tr>
          <th scope="row">
           팀 공유
          </th>
          <td>
           없음
          </td>
          <td>
           지원
          </td>
         </tr>
        </tbody>
       </table>
      </div>
     </section>
     <section id="contact">
      <h2>
       문의하기
      </h2>
      <form>
       <div class="form-field">
        <label for="name">
         이름
        </label>
        <input autocomplete="name" id="name" name="name" type="text"/>
       </div>
       <div class="form-field">
        <label for="email">
         이메일
        </label>
        <input autocomplete="email" id="email" name="email" type="email"/>
       </div>
       <div class="form-field">
        <label for="message">
         문의 내용
        </label>
        <textarea id="message" name="message" rows="5"></textarea>
       </div>
       <button type="submit">
        문의 보내기
       </button>
      </form>
     </section>
     <div class="feature-slot">
      <article class="card feature-card">
       <img alt="TaskFlow 기능 카드 세 개" class="feature-card__image" height="450" src="./images/feature-board.webp" width="800"/>
       <div>
        <h3>
         작업 카드
        </h3>
        <p>
         넓은 공간에서는 이미지와 설명을 나란히 배치합니다.
        </p>
       </div>
      </article>
     </div>
    </div>
    <aside aria-label="기능 미리보기">
     <div class="feature-slot">
      <article class="card feature-card">
       <img alt="TaskFlow 기능 카드 세 개" class="feature-card__image" height="450" src="./images/feature-board.webp" width="800"/>
       <div>
        <h3>
         작업 카드
        </h3>
        <p>
         넓은 공간에서는 이미지와 설명을 나란히 배치합니다.
        </p>
       </div>
      </article>
     </div>
    </aside>
   </div>
  </main>
  <footer class="site-footer">
   <div class="page">
    <p>
     © TaskFlow
    </p>
   </div>
  </footer>
  <a class="help-button" href="#contact">
   문의
  </a>
 </body>
</html>

style.css 전체 파일

:root {
  color: #171717;
  background: #f5f5f5;
}


*,
*::before,
*::after {
  box-sizing: border-box;
}


body {
  margin: 0;
  font-family:
    Arial,
    sans-serif;
  line-height: 1.6;
  color: #171717;
  background: #f5f5f5;
}


.page {
  width: min(
    100% - 32px,
    960px
  );
  margin-inline: auto;
}


.site-header,
.site-footer {
  padding-block: 20px;
}


main {
  padding-block: 48px;
}


section + section {
  margin-top: 64px;
}


.card {
  padding: 24px;
  border: 1px solid #d7d7d7;
  background: #fff;
}


form {
  display: grid;
  gap: 16px;
}


.form-field {
  display: grid;
  gap: 8px;
}


input,
textarea {
  width: 100%;
  min-height: 44px;
  padding: 10px 12px;
  border: 1px solid #b8b8b8;
  background: #fff;
}


button {
  min-height: 44px;
  padding: 10px 16px;
  border: 1px solid #171717;
  background: #171717;
  color: #fff;
}

a { color: inherit; }
input, textarea, button { font: inherit; }
h1 { font-size: 32px; font-weight: 700; }
h2 { font-size: 24px; }
h3 { font-size: 20px; }

.site-header__inner {
  display: flex;
  flex-direction: column;
  gap: 12px;
}


.nav {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 16px;
}


.feature-list {
  display: flex;
  flex-direction: column;
  gap: 16px;
}


@media (min-width: 48rem) {
  .site-header__inner {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
  }


  .feature-list {
    flex-direction: row;
  }


  .feature-list > * {
    flex: 1;
  }
}

.site-header {
  position: sticky;
  top: 0;
  z-index: 10;
  background: #f5f5f5;
  border: 1px solid #ddd;
}


.feature-card {
  position: relative;
}


.feature-card__badge {
  position: absolute;
  top: 12px;
  right: 12px;
  padding: 4px 8px;
  border: 1px solid #171717;
  background: #fff;
  font-size: 12px;
}


.help-button {
  position: fixed;
  right: 16px;
  bottom: 16px;
  min-width: 44px;
  min-height: 44px;
  padding: 10px 14px;
  border: 1px solid #171717;
  background: #171717;
  color: #fff;
  text-decoration: none;
}

.faq {
  display: grid;
  gap: 12px;
}


.faq details {
  border: 1px solid #d7d7d7;
  background: #fff;
}


.faq summary {
  padding: 16px;
  cursor: pointer;
  font-weight: 700;
}


.faq details p {
  margin: 0;
  padding: 0 16px 16px;
}


.faq summary:focus-visible {
  outline: 2px solid #171717;
  outline-offset: 2px;
}

.feature-grid,
.pricing-grid {
  display: grid;
  grid-template-columns:
    repeat(
      auto-fit,
      minmax(
        min(100%, 220px),
        1fr
      )
    );
  gap: 16px;
}

.task-preview {
  display: flex;
  align-items: flex-start;
  gap: 12px;
}


.task-preview__content {
  min-width: 0;
  flex: 1;
}


.task-preview__content p {
  overflow-wrap: anywhere;
}

.settings-layout {
  display: grid;
  grid-template-columns:
    180px
    minmax(0, 1fr);
  gap: 24px;
}

.table-scroll {
  overflow-x: auto;
}


.pricing-table {
  width: 100%;
  min-width: 640px;
  border-collapse: collapse;
  background: #fff;
}


.pricing-table caption {
  margin-bottom: 12px;
  text-align: left;
  font-weight: 700;
}


.pricing-table th,
.pricing-table td {
  padding: 12px;
  border: 1px solid #d7d7d7;
  text-align: left;
}

img {
  display: block;
  max-width: 100%;
}


.hero__image {
  width: 100%;
  height: auto;
}


.feature-card__image {
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
}

.service-layout {
  display: grid;
  gap: 24px;
}


@media (
  min-width: 64rem
) {
  .service-layout {
    grid-template-columns:
      minmax(0, 1fr)
      280px;
  }
}

.feature-slot {
  container-type:
    inline-size;
}


.feature-card {
  display: grid;
  gap: 16px;
}


@container (
  min-width: 30rem
) {
  .feature-card {
    grid-template-columns:
      180px
      minmax(0, 1fr);
    align-items: center;
  }
}

.service-layout > * { min-width: 0; }

:root {
  --z-header: 10;
  --z-floating: 20;
}


.site-header {
  position: sticky;
  top: 0;
  z-index:
    var(--z-header);
}


.help-button {
  position: fixed;
  right: 16px;
  bottom: 16px;
  z-index:
    var(--z-floating);
}

:focus-visible {
  outline: 2px solid #171717;
  outline-offset: 3px;
}

.skip-link {
  position: absolute;
  left: 16px;
  top: -100px;
  z-index: 100;
  padding: 10px 12px;
  background: #171717;
  color: #fff;
}


.skip-link:focus {
  top: 16px;
}

section[id], main[id] { scroll-margin-top: 8rem; }
body { padding-bottom: 5rem; }

위 파일과 ZIP의 동명 파일은 동일합니다. 회차별 README·CHANGES 문서는 ZIP에 포함합니다. 생성 산출물·node_modules·실제 환경 변수 파일은 포함하지 않습니다.

시작본과 이번 변경

CSS z-index가 안 먹힐 때: stacking context와 부모 층 디버깅의 완료 체크포인트를 시작본으로 사용합니다.

index.html body 첫 부분에 skip link와 main 대상 id를 맞추고 style.css의 focus 표시를 적용합니다. Tab/Shift+Tab·Enter·200% 확대·320px에서 실제 실패 항목을 수정하고 결과를 기록합니다.

연속 프로젝트 선수 조건

  • 1~12회차 TaskFlow 정적 화면이 완성되어 있어야 합니다.
  • 이 글은 새 기능 추가보다 실제 사용성 검수에 집중합니다.

이전 체크포인트

publishing-step-12-stacking-context

이번 목표

TaskFlow 전체를 접근성 체크리스트로 검사하고 실제 문제만 수정합니다.

공통 focus style

:focus-visible {
  outline: 2px solid #171717;
  outline-offset: 3px;
}

skip link 추가

긴 header/nav를 반복해서 지나야 하는 경우 main으로 바로 이동하는 skip link를 추가할 수 있습니다.

<a
  class="skip-link"
  href="#main"
>
  본문으로 바로가기
</a>
<main id="main">
  ...
</main>
.skip-link {
  position: absolute;
  left: 16px;
  top: -100px;
  z-index: 100;
  padding: 10px 12px;
  background: #171717;
  color: #fff;
}


.skip-link:focus {
  top: 16px;
}

점검 목록

[ ] Tab 순서가 자연스러움
[ ] focus 표시 확인
[ ] header/nav source order 확인
[ ] label/input 연결
[ ] FAQ summary keyboard 사용 가능
[ ] pricing table caption/scope
[ ] image alt
[ ] 200% zoom
[ ] 320px reflow
[ ] fixed help button이 콘텐츠를 가리지 않음

실행 확인

마우스를 사용하지 않고 hero부터 footer까지 이동합니다.

브라우저 zoom 200%, viewport 320px, desktop 1024px 이상을 각각 확인합니다.

완료 체크포인트

publishing-step-13-accessibility

다음 학습

다음 글에서는 지금까지 만든 모든 요소를 하나의 완성된 TaskFlow 서비스 페이지로 통합합니다.

공식 참고

글 소개·학습 준비·전체 목차
웹 접근성 기초 점검: 키보드 순서·초점 표시·확대 화면을 직접 확인하는 체크리스트 대표 일러스트

웹 퍼블리싱 · 13 / 15 · 종합 점검 · 웹 접근성

키보드로 접근성을 점검할 때는 Tab·Shift+Tab 이동 순서와 초점 표시를 먼저 기록하고, Enter·Space로 기능을 조작한 뒤 200% 확대와 좁은 화면에서 내용 가림을 확인합니다.

HTML 구조, 키보드 이동, focus 표시, source order, form label, zoom, 작은 viewport가 서로 연결되어 실제 사용자가 페이지를 사용할 수 있는지를 확인하는 과정입니다.

상단에서는 두 파일로 만든 독립 화면을 점검하고, 하단에서는 앞서 만든 TaskFlow의 skip link와 공통 focus 스타일에 같은 기준을 적용합니다. 자동 도구 결과와 실제 키보드 사용 결과는 구분해 기록합니다.

이번 글에서 배우는 내용

  • semantic HTML과 접근성
  • keyboard navigation
  • focus indicator
  • source order
  • zoom과 reflow
  • form label
  • link와 button
  • table header
  • 이미지 alt
  • 색상 외의 상태 정보

먼저 알아야 할 내용

HTML 링크·폼·details와 CSS focus-visible을 알면 됩니다. 전체 TaskFlow 없이 작은 점검 화면으로 키보드·확대를 확인합니다.

목차

이 글이 도움이 되었나요?

조회 중

읽음 기록

읽음 — / 전체 15개 · 필수 13개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기