実践Webアクセシビリティ

セマンティックHTMLの実践:アクセシビリティ向上のためのマークアップ

Tags: セマンティックHTML, ARIA, マークアップ, HTML, アクセシビリティ

ウェブサイトのアクセシビリティを確保する上で、基盤となるのがセマンティックなHTML構造です。見た目が同じでも、適切なHTML要素を使用しているかどうかが、スクリーンリーダーを含む様々な支援技術の利用者にとっての理解度や操作性に大きな影響を与えます。この記事では、なぜセマンティックHTMLが重要なのかを改めて確認し、具体的なマークアップの実践方法をコード例と共に解説します。

セマンティックHTMLとは何か、なぜ重要か

セマンティックHTMLとは、要素の役割や意味を正確に伝えるHTMLマークアップのことです。例えば、見出しには<h1>から<h6>を使用し、段落には<p>を使用する、リストには<ul><ol><li>を使用するなどです。これに対して、<div><span>のみで全ての構造を表現しようとするマークアップは、セマンティクス(意味)に乏しいと言えます。

セマンティックHTMLがアクセシビリティに重要な理由は以下の通りです。

  1. 支援技術による構造理解: スクリーンリーダーなどの支援技術は、HTMLのセマンティクスを解釈して、ウェブページの構造やコンテンツの関係性をユーザーに伝えます。例えば、<h1>を適切に使うことで、ページの大見出しであることをユーザーに明示できます。ナビゲーションは<nav>、主要なコンテンツは<main>でマークアップすることで、ユーザーはページ内の主要エリア間を容易に移動できます。
  2. ナビゲーションの容易さ: 多くの支援技術では、見出しやランドマーク(主要な構造を示す要素、例: <nav>, <main>, <footer>など)をジャンプポイントとして使用できます。セマンティックなマークアップがされていれば、ユーザーはページ全体を線形に読み上げさせることなく、目的の情報が含まれるセクションへ素早く移動できます。
  3. コンテンツの関係性理解: 例えば、<figure><figcaption>を使うことで、画像とキャプションが関連付けられていることを明確に伝えられます。<label><input>を関連付けることで、フォームコントロールの目的が利用者にはっきり分かります。
  4. 保守性と拡張性: セマンティックなコードは人間にとっても読みやすく、他の開発者が構造を理解しやすいため、長期的な保守や機能追加が容易になります。

WCAG (Web Content Accessibility Guidelines)においても、情報の構造や関係性をプログラムが解釈できるようにすることが求められています(WCAG 2.1達成基準 1.3.1 情報及び関係性)。セマンティックHTMLは、この達成基準を満たすための基本的な手段です。

具体的なセマンティックHTMLの実装例

1. 基本的なページ構造

ページの主要なセクションには、HTML5で導入されたセマンティック要素を使用します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>実践Webアクセシビリティ</title>
</head>
<body>
    <header>
        <h1>サイトのタイトル</h1>
        <nav>
            <h2>ナビゲーション</h2>
            <ul>
                <li><a href="/">ホーム</a></li>
                <li><a href="/about">サイトについて</a></li>
                <li><a href="/articles">記事一覧</a></li>
            </ul>
        </nav>
    </header>

    <main>
        <article>
            ### 記事タイトル
            <p>これは記事の導入部分です...</p>
            <section>
                #### サブセクションの見出し
                <p>このセクションの内容です...</p>
            </section>
            <section>
                #### 別のサブセクション
                <p>このセクションの内容です...</p>
            </section>
        </article>

        <aside>
            ### 関連情報
            <p>サイドバーの内容です...</p>
        </aside>
    </main>

    <footer>
        <p>&copy; 2023 実践Webアクセシビリティ</p>
    </footer>
</body>
</html>

これらの要素は、それぞれが持つデフォルトのARIAロール(例: <nav>role="navigation", <main>role="main", <footer>role="contentinfo"など)により、支援技術にその役割を伝えます。特別な理由がない限り、これらのネイティブ要素を使用することが推奨されます。

2. 見出し構造

見出しはページの構造を示す上で非常に重要です。<h1>から<h6>を階層的に使用し、視覚的なデザインのためだけに見出しレベルをスキップしたり、<div>などで代替したりしないでください。

<h1>ページ全体のタイトル</h1>
<section>
    ## セクションの大見出し
    <p>このセクションの導入...</p>
    <section>
        ### サブセクションの見出し
        <p>このサブセクションの内容...</p>
    </section>
</section>
<section>
    ## 別のセクションの大見出し
    <p>このセクションの導入...</p>
</section>

支援技術の利用者は、見出しリストを使ってページをブラウズすることが多いため、適切な見出し構造はナビゲーションの効率に直結します。

3. リスト

複数の項目をリストとして表現する場合、適切なリスト要素(<ul>, <ol>, <dl>)を使用します。

### 箇条書きリスト

<ul>
    <li>項目1</li>
    <li>項目2</li>
    <li>項目3</li>
</ul>

### 番号付きリスト

<ol>
    <li>最初のステップ</li>
    <li>次のステップ</li>
    <li>最後のステップ</li>
</ol>

### 定義リスト

<dl>
    <dt>HTML</dt>
    <dd>HyperText Markup Language</dd>
    <dt>CSS</dt>
    <dd>Cascading Style Sheets</dd>
</dl>

CSSでリストマーカーを非表示にしても、セマンティクスは失われません。スクリーンリーダーはこれらをリストとして認識し、項目数を読み上げたり、リスト内のナビゲーションを提供したりします。<div>などでリストを模倣すると、これらの機能が失われます。

4. ARIA属性による補強

ネイティブのHTML要素で適切なセマンティクスが得られない場合や、カスタムコンポーネントを作成する場合に、ARIA属性を使用してセマンティクスや状態、プロパティを補強します。ただし、可能な限りHTML要素を使用すること(Use native HTML elements or make elements accessible with WAI-ARIA (Implicit WAI-ARIA Semantics))が最優先です。

例:ARIA aria-labelledbyaria-describedby の使用

特定の要素のラベルや説明を提供するために使用します。特に、フォームの入力フィールドではない要素に名前を付けたい場合や、補足的な説明が必要な場合に有効です。

<div id="dialog1" role="dialog" aria-labelledby="dialog1_title" aria-describedby="dialog1_desc">
    <h2 id="dialog1_title">設定の変更</h2>
    <p id="dialog1_desc">以下の設定項目を変更できます。</p>
    <!-- ダイアログの内容 -->
    <button>閉じる</button>
</div>

<div id="status_message" role="status">
    <p>ファイルが正常にアップロードされました。</p>
</div>

この例では、ダイアログ要素(role="dialog")のラベルをdialog1_titleというIDを持つ要素のテキストで提供し、説明をdialog1_descを持つ要素のテキストで提供しています。role="status"は、重要な状態メッセージが更新された際に、支援技術に自動的に通知させるARIAライブリージョンの一種です。

例: role="none" / role="presentation" の使用

CSSのスタイリングのためにHTML構造を崩すことなく、要素が持つデフォルトのセマンティクスを打ち消したい場合に使用します。これは、リスト構造を使いつつ、視覚的にはリストマーカーやインデントを表示しない、といった場合に、不要なリストセマンティクスを支援技術に伝えないために使うことがあります。

<!-- スタイリングのためにリスト構造を使っているが、意味的なリストではない場合 -->
<ul role="none">
    <li role="none">
        <div><img src="..." alt=""></div>
        <div>
            ### 見出し
            <p>説明</p>
        </div>
    </li>
    <li role="none">
        <div><img src="..." alt=""></div>
        <div>
            ### 見出し
            <p>説明</p>
        </div>
    </li>
</ul>

この例では、リスト項目がそれぞれ独立したカードのようなコンポーネントとして表示され、リストであること自体に意味がない場合に、role="none"またはrole="presentation"を使用することで、リストセマンティクスを支援技術に伝えないようにしています。ただし、この使用は慎重に行う必要があり、本当にリストとしての意味がない場合に限定すべきです。

実装時の注意点とよくある落とし穴

実装したセマンティクスをテストする方法

まとめ

セマンティックHTMLは、見た目だけでなく、そのコンテンツが持つ意味や役割を明確にすることで、アクセシビリティの基盤を築く非常に重要な要素です。適切なHTML要素を使い分け、必要に応じてARIA属性で補強することで、支援技術の利用者がウェブサイトの構造を容易に理解し、効率的に情報を得たり操作したりできるようになります。

この記事で紹介した基本的な構造要素やリスト、見出しの使い方を日々のマークアップで実践し、さらにARIA属性の活用、そして様々なツールやスクリーンリーダーでのテストを組み合わせることで、より多くの人にとって使いやすいウェブサイトを実現できるでしょう。まずは小さなコンポーネントやページの一部からでも、セマンティックなマークアップを意識して取り組んでみてください。