Primary tabs

意味が伝わるHTML構造(1.3.1 A)

26 September 2025

適合レベル

A

※各レベルについては適合レベルとはをご覧ください


概要

見出しは<h1>~<h6> 、段落は<p>など、内容に合った適切なHTMLタグを使い、文書の構造を正しくマシンリーダブルにする。


具体的な実装方法

1.3.1 A

1. ⭕️良い例

見出し

  • <h1>から<h6>をページの階層構造に合わせて順番通りに使用します。
<h1>ページの主題</h1>
<h2>第一セクション</h2>
<h3>第一セクションの小項目</h3>

リスト

  • 順序のないリストは<ul>、順序のあるリストは<ol>でマークアップします。

フォーム

  • <label>要素のfor属性と、<input>などフォームコントロールのid属性を対応させ、項目とラベルを関連付けます。
<label for="user-name">お名前:</label>
<input type="text" id="user-name">

2. ❌悪い例

見出しを<div>とCSSで表現する

なぜ問題なのか

  • 見た目は見出しでも、プログラム上の構造は見出しではないため、スクリーンリーダーは見出しとして認識できず、見出しジャンプ機能が使えません。

改善策

  • <h2>などの適切な見出し要素を使用します。

リストを改行<br>で表現する

なぜ問題なのか

  • 単なる改行であり、項目のリストであることがプログラムに伝わりません。スクリーンリーダーは「リストが3項目ある」のようにアナウンスできません。

改善策

  • <ul><li>要素でリストをマークアップします。

3.プラットフォーム別の実装

主にHTMLのセマンティックな要素を用いて実装します。

見出し

  • <h1> - <h6>

リスト

  • <ul>, <ol>, <li>

  • <table>, <caption>, <th>, <tr>, <td>

フォーム

  • <form>, <label>, <input>

補足

  • WAI-ARIAのrole属性やaria-*プロパティを使い、より複雑な関係性を定義することも可能です。

4.特殊なケースへの対応

データテーブル

  • <th>要素にscope="col"(列ヘッダ)やscope="row"(行ヘッダ)を指定することで、セルとヘッダの関係性を明確にします。

複雑なUIコンポーネント

  • タブUIなどHTMLだけでは構造を表現しきれない場合は、WAI-ARIA(role="tablist"など)を用いて役割や状態を定義します。

確認観点

1.3.1 A

1.定量的な基準の担保

自動チェックツールでの合格

Lighthouse

  • 見出しレベルの順序やフォームラベルの有無などをチェックできます。

axe DevTools

  • ARIAの利用方法やセマンティックな構造に関する問題を検出します。

チェックリストの達成度:

2.定性的な基準の担保

レビュー

  • コードレビュー時に、ブラウザの開発者ツールでDOMツリーを確認し、見た目だけでなくHTMLの構造が意図通りにマークアップされているかを確認します。

専門家による監査

  • アクセシビリティ専門家が、実際にスクリーンリーダーを使用してページを操作し、見出しジャンプ機能でページ全体を把握できるか、フォームの操作に迷う点はないかなど、実際の利用者体験に基づいた評価を行います。

参考文献

> 達成基準 1.3.1: 情報及び関係性を理解する