WAI-ARIAのランドマークロールについて

WAI-ARIAのランドマークロールについて、調べたことをメモ。

ランドマークロールについて

WAI-ARIAの機能のうちの1つに、ロール(Role)があります。
これは要素の役割について定義する機能で、role属性を使って設定できます。

role属性で設定できる内容にもいくつか種類があり、その中の1つがランドマークロールになります。
ランドマークロールを使うことで、ページ上にあるナビゲーションや本文など、主要な要素をランドマーク(目印)として扱えます。

スクリーンリーダーには、ページ上に設定されたランドマークへ移動する機能があるため、主要なコンテンツにアクセスするための手助けになります。
以下はスクリーンリーダーのVoiceOverでランドマークを確認した際の表示です。

ランドマークロールの種類

ランドマークロールで設定できる値は8種類あります。

  • バナー(banner)
  • コンテンツ情報(contentinfo)
  • ナビゲーション(navigation)
  • メイン(main)
  • 補足(complementary)
  • フォーム(form)
  • 検索(search)
  • リージョン(region)

バナー(banner)

主にページの先頭に配置される、サイト全体のヘッダー領域を示すランドマークです。
header要素は暗黙的なbannerロールとなりますが、aside/article/main/nav/section要素の子孫になっている場合、bannerロールとみなされないようです。

サイト全体のヘッダーと、main要素内にheader要素を配置した場合にランドマークがどう扱われるかを試してみます。

<header class="header">
  <p class="logo"><a href="#">ロゴ</a></p>
  ~ 略 ~
</header>

<div class="contents">
  <main class="main">
    <article>
      <header>
        <p>公開日とかカテゴリ情報とか</p>
      </header>
      <h1>コンテンツ内容</h1>
      ~ 略 ~

ランドマーク設定のデモページ

各スクリーンリーダーで確認した結果は、以下の通りです。

サイト全体のヘッダー main内
VoiceOver バナー
NVDA バナー
PC-Talker バナーランドマーク バナーランドマーク

VoiceOverの場合

NVDAの場合

PC-Talkerの場合、mainタグの中でもランドマークとして扱われてしまうようでした。

コンテンツ情報(contentinfo)

主にページの最後に配置される、サイト全体のフッター領域を示すランドマークです。
footer要素は暗黙的なcontentinfoロールとなりますが、header要素と同様にaside/article/main/nav/section要素の子孫になっている場合、contentinfoロールとみなされないようです。

サイト全体のフッターと、main要素内にfooter要素を配置した場合にランドマークがどう扱われるかを試してみます。

~略~
<div class="contents">
  <main class="main">
    <article>
      ~略~
      <footer>
        <p>記事のタグ情報とか</p>
      </footer>
    </article>
  </main>
  ~略~
</div>

<footer class="footer">
  <p>フッター</p>
  ~略~
</footer>

ランドマーク設定のデモページ

各スクリーンリーダーで確認した結果は、以下の通りです。

サイト全体のフッター main内
VoiceOver フッター
NVDA コンテンツ情報
PC-Talker コンテンツ情報ランドマーク コンテンツ情報ランドマーク

bannarロールの時と同じく、PC-Talkerの場合はmainタグ内でもランドマークとして扱われてしまうようでした。

ナビゲーション(navigation)

ページ内のナビゲーションの領域を示すランドマークです。
nav要素は暗黙的なnavigationロールとなります。
ページ内に複数のnavigationロールが含まれる場合、aria-labelledbyまたはaria-labelを使って、アクセシブルな名前を付けるようにします。

ヘッダーとフッター、サイドバーにnav要素を配置した場合、ランドマークがどう扱われるかを試してみます。

<header class="header">
  <p class="logo"><a href="#">ロゴ</a></p>
  <nav>
    <ul class="nav">
      <li>
        <a href="#">サイト概要</a>
      </li>
      <li>
        <a href="#">ブログ</a>
      </li>
      <li>
        <a href="#">問い合わせ</a>
      </li>
    </ul>
  </nav>
  ~略~
</header>

<div class="contents">
  ~略~
  <aside class="side">
    ~略~
    <nav>
      <h2>カテゴリ別</h2>
      <ul>
        <li>
          <a href="#">HTML・CSS</a>
        </li>
        <li>
          <a href="#">JavaScript</a>
        </li>
        <li>
          <a href="#">CMS</a>
        </li>
      </ul>
    </nav>
    ~略~
  </aside>
</div>

<footer class="footer">
  <p>フッター</p>
  <nav>
    <ul class="nav">
      <li>
        <a href="#">サイト概要</a>
      </li>
      <li>
        <a href="#">ブログ</a>
      </li>
      <li>
        <a href="#">問い合わせ</a>
      </li>
    </ul>
  </nav>
</footer>

ランドマーク設定のデモページ

各スクリーンリーダーで確認した結果は、以下の通りです。

header内 aside内 footer内
VoiceOver ナビゲーション ナビゲーション ナビゲーション
NVDA ナビゲーション ナビゲーション ナビゲーション
PC-Talker ナビゲーションランドマーク ナビゲーションランドマーク ナビゲーションランドマーク

前述の通り、ページ内に複数のnavigationロールが含まれる場合、aria-labelledbyまたはaria-labelを使って、アクセシブルな名前を付けるようにします。
その際、同じリンク内容のnavigationロールがあればそれぞれに同じラベルを使用します。

以下のように、navigationロールにアクセシブルな名前を追加してみます。

<header class="header">
  <p class="logo"><a href="#">ロゴ</a></p>
  <nav aria-label="メイン">
    <ul class="nav">
      <li>
        <a href="#">サイト概要</a>
      </li>
      <li>
        <a href="#">ブログ</a>
      </li>
      <li>
        <a href="#">問い合わせ</a>
      </li>
    </ul>
  </nav>
  ~略~
</header>

<div class="contents">
  ~略~
  <aside class="side">
    ~略~
    <nav aria-labelledby="category">
      <h2 id="category">カテゴリ別</h2>
      <ul>
        <li>
          <a href="#">HTML・CSS</a>
        </li>
        <li>
          <a href="#">JavaScript</a>
        </li>
        <li>
          <a href="#">CMS</a>
        </li>
      </ul>
    </nav>
    ~略~
  </aside>
</div>

<footer class="footer">
  <p>フッター</p>
  <nav aria-label="メイン">
    <ul class="nav">
      <li>
        <a href="#">サイト概要</a>
      </li>
      <li>
        <a href="#">ブログ</a>
      </li>
      <li>
        <a href="#">問い合わせ</a>
      </li>
    </ul>
  </nav>
</footer>

ランドマーク設定のデモページ2

結果は以下の通りで、PC-Talker以外の場合、設定したアクセシブルな名前が読み上げに付与されるようになりました。

header内 aside内 footer内
VoiceOver メイン ナビゲーション カテゴリ別 ナビゲーション メイン ナビゲーション
NVDA メイン; ナビゲーション カテゴリ別; ナビゲーション メイン; ナビゲーション
PC-Talker ナビゲーションランドマーク ナビゲーションランドマーク ナビゲーションランドマーク

VoiceOverの場合

NVDAの場合

メイン(main)

ページの主なコンテンツ領域を示すランドマークです。
main要素は暗黙的なmainロールとなります。

~略~
<div class="contents">
  <main class="main">
    <article>
      <header>
        <p>公開日とかカテゴリ情報とか</p>
      </header>
      <h1>コンテンツ内容</h1>
      ~略~
    </article>
  </main>
~略~

ランドマーク設定のデモページ

各スクリーンリーダーで確認した結果は以下の通りです。

VoiceOver 本文
NVDA メイン
PC-Talker メインランドマーク

補足として、article要素は本来ランドマークに含まれないのですが、VoiceOverだと「記事」、PC-Talkerだと「記事ランドマーク」と読み上げるようでした。

補足(complementary)

メインコンテンツに関連する補助的な内容を含み、かつ単独でも成立する領域を示すランドマークです。
aside要素は暗黙的なmainロールとなります。
ページ内に複数のnavigationロールが含まれる場合、aria-labelledbyまたはaria-labelを使って、アクセシブルな名前を付けるようにします。

サイドバーとして使用する場合と、article内で使用する場合にランドマークがどう扱われるかを試してみます。

~略~
<div class="contents">
  <main class="main">
    <article>
      ~略~
      <aside>
        <h2>補足内容</h2>
        <p>テキストテキストテキスト</p>
      </aside>
      ~略~
    </article>
  </main>

  <aside class="side">
    ~略~
  </aside>
</div>
~略~

ランドマーク設定のデモページ

各スクリーンリーダーで確認した結果は、以下の通りです。

サイドバー article内
VoiceOver 捕捉
NVDA 補足情報
PC-Talker 補足ランドマーク 補足ランドマーク

サイドバーとして使用した場合は特に問題なさそうだったのですが、article内で使用した場合にVoiceOverとNVDAでランドマークとして扱われないようでした。

article内にあるasideに対して、(1)アクセシブルな名前を付与した場合 (2)article外にそのまま出した場合 の2パターンを試してみます。

~略~
<div class="contents">
  <main class="main">
    <article>
      ~略~
      <aside aria-labelledby="article-aside">
        <h2 id="article-aside">補足内容</h2>
        <p>テキストテキストテキスト</p>
      </aside>
      ~略~
    </article>
    <aside>
      <h2>補足内容2</h2>
      <p>テキストテキストテキスト</p>
    </aside>
  </main>

  <aside class="side">
    ~略~
  </aside>
</div>
~略~

ランドマーク設定のデモページ2

結果は以下の通りで、VoiceOverとNVDA共にどちらの方法でもランドマークとして扱われるようでした。

アクセシブルな名前追加 article外に移動
VoiceOver 補足内容 捕捉 捕捉
NVDA 補足内容; 補足情報 補足情報
PC-Talker 補足ランドマーク 補足ランドマーク

フォーム(form)

フォームのグループを示すランドマークです。
form要素に対してaria-labelledbyまたはaria-labelを使ってアクセシブルな名前を設定することで、formのロールとして扱われます。
フォームの内容が検索の場合、代わりにsearchランドマークを使用します。

フォームにアクセシブルな名前を追加しなかった場合、ランドマークとして扱われないのかを試してみます。

~略~
<div class="contents">
  <main class="main">
    <article>
      ~略~
      <div class="comment">
        <form action="#" method="post">
          <label for="comment">コメント</label>
          <textarea name="comment" id="comment"></textarea>
          <button type="submit">送信</button>
        </form>
      </div>
      ~略~
    </article>
  </main>
  ~略~
</div>
~略~

ランドマーク設定のデモページ

各スクリーンリーダーで確認した結果は以下の通りで、どのスクリーンリーダーでもランドマークとして扱われませんでした。

VoiceOver
NVDA
PC-Talker

次にアクセシブルな名前を追加した場合を試してみます。

~略~
<div class="contents">
  <main class="main">
    <article>
      ~略~
      <div class="comment">
        <form aria-label="コメント action="#" method="post">
          <label for="comment">コメント</label>
          <textarea name="comment" id="comment"></textarea>
          <button type="submit">送信</button>
        </form>
      </div>
      ~略~
    </article>
  </main>
  ~略~
</div>
~略~

ランドマーク設定のデモページ2

結果は以下の通りで、VoiceOverとNVDAではランドマークとして扱われるようになりましたが、PC-Talkerでは変わらないようでした。

VoiceOver コメント フォーム
NVDA コメント; フォーム
PC-Talker

検索(search)

サイト内検索など検索機能を提供する領域を示すランドマークです。
search要素は暗黙的なsearchロールとなりますが、search要素は比較的最近追加された要素なので、対応ブラウザによってはsearch要素を使わず、form要素に対してrol=”search”を設定する方法を検討してください。
ページ内に複数のsearchロールが含まれる場合、aria-labelledbyまたはaria-labelを使って、アクセシブルな名前を付けるようにします。

サイト全体のヘッダーと、サイドバー(aside)にsearch要素を配置した場合にランドマークがどう扱われるかを試してみます。

<header class="header">
  ~略~
  <search class="search">
    <form action="#" method="get">
      <input type="search" name="search_keyword">
      <button type="submit">検索</button>
    </form>
  </search>
</header>

<div class="contents">
  ~略~
  <aside class="side">
    <search class="search">
      <form action="#" method="get">
        <input type="search" name="search_keyword">
        <button type="submit">検索</button>
      </form>
    </search>
    ~略~
  </aside>
</div>
~略~

ランドマーク設定のデモページ

各スクリーンリーダーで確認した結果は以下の通りです。

header内 aside内
VoiceOver 検索 検索
NVDA 検索
PC-Talker 検索ランドマーク 検索ランドマーク

aside要素内に配置した場合、NVDAでランドマークとして扱われないようでした。
アクセシブルな名前の付与や、search要素にrole=”search”を設定してみるなどいろいろ試してみたのですが、NVDAでaside要素内の場合にはランドマークとして認識しなさそうでした。
search要素を使用しないで、form要素に対してrole=”search”を設定する方法で試してみます。

<header class="header">
  ~略~
  <search class="search">
    <form action="#" method="get">
      <input type="search" name="search_keyword">
      <button type="submit">検索</button>
    </form>
  </search>
</header>

<div class="contents">
  ~略~
  <aside class="side">
    <div class="search">
      <form role="search" aria-label="サイト内" action="#" method="get">
        <input type="search" name="search_keyword">
        <button type="submit">検索</button>
      </form>
    </div>
    ~略~
  </aside>
</div>
~略~

ランドマーク設定のデモページ2

結果は以下の通りで、NVDAでは変わらずランドマークとして扱われませんでした。

header内 aside内
VoiceOver 検索 サイト内 検索
NVDA 検索
PC-Talker 検索ランドマーク 検索ランドマーク

リージョン(region)

他のランドマークロールがどれも適切ではないものの、ランドマークとして登録すべきと判断した要素に対して使用する、汎用的なランドマークロールです。
section要素に対してaria-labelledbyまたはaria-labelを使ってアクセシブルな名前を設定することで、regionのロールとして扱われます
ただし、全てのsection要素に対してアクセシブルな名前を付けてregionのロールにするのではなく、重要な内容と判断した場合のみ設定するようにします。

main要素内のsection要素と、aside要素内のsection要素に対してアクセシブルな名前を付けて、ランドマークがどう扱われるかを試してみます。

~略~
<div class="contents">
  <main class="main">
    <article>
      ~略~
      <section aria-labelledby="sec2-2">
        <h2 id="sec2-2">見出し2-2</h2>
        <p>テキストテキストテキスト</p>
        <section>
          <h3>見出し3-1</h3>
          <p>テキストテキストテキスト</p>
        </section>
        <section>
          <h3>見出し3-2</h3>
          <p>テキストテキストテキスト</p>
        </section>
      </section>
      ~略~
    </article>
  </main>

  <aside class="side">
    ~略~
    <section aria-labelledby="recent-article">
      <h2 id="recent-article">最新記事一覧</h2>
      <ul>
        <li><a href="#">記事A</a></li>
        <li><a href="#">記事B</a></li>
        <li><a href="#">記事C</a></li>
      </ul>
    </section>
  </aside>
</div>
~略~

各スクリーンリーダーで確認した結果は以下の通りで、NVDA以外ではランドマークとして扱われていないようでした。

main内 aside内
VoiceOver
NVDA 見出し2-2 最新記事一覧
PC-Talker

参考サイト

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2024年9月
1234567
891011121314
15161718192021
22232425262728
2930