トピックを検索
ランドマークの一覧に出てこない検索欄と関連コンテンツ
ショップのヘッダーの検索欄がただの form で、「こちらもおすすめ」の欄も main の中にあるため、ランドマークの一覧に検索が出ず、おすすめの欄まで商品の内容として扱われてしまう
<form action="/search"> 問題
ページを領域ごとにたどる人が、検索へ直接移動できず、ショップのおすすめと商品の内容を区別できない
ある生活雑貨のショップの商品ページは、多くのショップと同じ形をしています。ヘッダーにはロゴの Tidewater Home、3つのリンクのメニュー、検索欄があります。その下に商品のホーローのマグ($18)、続いて「こちらもおすすめ」という見出しの下にほかの商品が並び、最後に「お問い合わせ」と「返品」のあるフッターがあります。ページの骨組みはきちんと作られています。ヘッダー、メニュー、本文、フッターはランドマークになっていて、ランドマークの一覧には「バナー」「ナビゲーション」「メイン」「コンテンツ情報」が並び、どのランドマークの外にも内容は残っていません。
ページを領域ごとにたどる人が、検索へ行こうとして、スクリーンリーダーや SkipTo のようなランドマークの拡張機能でこの一覧を開きます。一覧に検索はありません。バナーを選んでヘッダーの中から検索欄を探すか、Tabキーでロゴとメニューを通り過ぎて欄までたどることになります。次にマグの説明を読もうと「メイン」を選ぶと、一覧のメインには「こちらもおすすめ」まで含まれていて、ほかの商品もマグのページの一部のように扱われます。メインのどこまでが商品で、どこからがショップのおすすめなのかは、一覧からは分かりません。
1.3.6は、ページの各領域の目的をプログラムで解釈できること、つまり見た目だけでなく、それぞれの領域が何のためにあるかをコードでも伝えることを求めます。理由は解説書にあります。ページの領域が特定されていれば、利用者はユーザーエージェントで領域を取り除いたり、強調したりできます。解説書が最初に挙げる例も、ランドマークで領域を示したサイトで、利用者が main のロールを持たない部分を隠せるというものです。領域についての十分な達成方法はランドマークを使うARIA11で、そのランドマークには、検索のための search と、メインの内容を補いながら単独でも意味を持つ内容のための complementary が含まれています。
このページは、骨組みにはランドマークを使っていますが、そこで止まっています。
- 検索は、名前もロールもない
formです。form要素は名前があるときだけランドマークになり、その場合も「検索」ではなく「フォーム」です。そのため、検索がどこにあるかを示すランドマークがコードになく、ページの領域を並べるツールにも検索は載りません。 - 関連コンテンツは
mainの中のdivです。コードの上ではおすすめもメインの内容、つまりページの存在理由の一部になるため、メインを残してほかを隠すツールではおすすめも残ります。
抜けや置き間違いがあり、内容を囲みきれないランドマークで説明している1.3.1の点では、このページに問題はありません。4つの領域はランドマークで、内容はすべてどれかの中にあります。1.3.6はさらに、ページの領域の目的まで求めます。このページでは、利用者が名前で呼ぶ2つの領域、検索とおすすめの目的がコードに表れていません。1.3.6には失敗例がなく、ARIA11の確認手順も、ページにあるランドマークを調べるもので、ないランドマークは調べません。そのため、どの領域にランドマークが必要かは、達成基準の文言と例から判断することになります。また、レベルAAAなので、求める診断はあまりありません。
ページ上部の検索欄も、見出しの下に並ぶ商品も、見た目は利用者が期待するとおりです。問題があるのはコードが伝える内容だけで、同じヘッダーと商品のテンプレートを使うページすべてで同じことが起きます。
10グループ中2グループに影響
- 全盲 (影響あり)
- 弱視 (影響なし)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響なし)
- 筋力・可動域 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 言語・認知・学習の能力が限られる SkipTo や Landmarks などのブラウザー拡張機能は、ページの領域を短い言葉でメニューに並べ、選んだ領域へ移動させます。込み入ったページを近道でたどる手段です。このページではメニューに検索がなく、おすすめも商品の一部として数えられます。そのため、1.3.6が想定するような、メインの内容だけを残してほかを隠すツールを使っても、おすすめは残ってしまいます。
- 視覚を使わない スクリーンリーダー利用者は、ランドマークのキーを押すか、ランドマークの一覧を開いて、ヘッダーを読まずに検索へ移動します。このページでは一覧に検索がないため、フォームの入力欄へ移動するキーなど、別の方法で検索欄を探すことになります。
axe には1.3.6のルールがありません。axe のレベルAAAのルールは3つで、コントラスト(1.4.6)、リンクの目的(2.4.9)、ページの再読み込み(2.2.4と3.2.5)を調べます。ランドマークのルールも、main、バナー、コンテンツ情報が1つずつあり、その外に何もないこのページを合格にします。search ランドマークの外にある検索欄はコードから見つけられるため、この診断ツールは、そうした検索欄を、欄の名前とボタンの文言を添えて確認対象に挙げます。一方、あるまとまりが単独で成り立つ関連コンテンツなのか、ページの目的の一部なのかは、ツールには判断できません。商品のレビューやサイズの目安は main に入り、おすすめは入りませんが、その違いはコードには表れません。ページを読んで人が判断する必要があります。ランドマークを加えるよう頼まれたAIツールは、付けすぎる傾向があります。ニュースレターの登録フォームに role="search" を付けたり、商品自身の説明を aside で囲んだり、あらゆるまとまりを名前付きの section にして、誰も移動したくない領域でランドマークの一覧を埋めたりします。
試してみる
ランドマークのツールで検索へ移動し、メインの内容だけを表示してみましょう
ウィンドウの上のバーは、ページのランドマークを読み取るツールの代わりです。「移動先」は SkipTo 拡張機能のようにランドマークを並べ、「メインの内容だけを表示」はそれ以外をすべて隠します。後者は、WCAGの解説書が1.3.6の例として挙げているものです。メニューに検索はありますか?メインの内容だけにしたとき、マグのほかに何が残りますか?
修正を適用して、もう一度両方を試してください。
修正方法
検索と関連コンテンツをランドマークにする
<header> <a href="/" class="logo">Tidewater Home</a> <nav> <a href="/kitchen">キッチン</a> <a href="/table">テーブル</a> <a href="/bath">バス</a> </nav> <form action="/search"> <label for="q" class="visually-hidden">ショップ内を検索</label> <input id="q" name="q" type="search"> <button type="submit">検索</button> </form></header><main> <h1>ホーローのマグ</h1> <p class="price">$18</p> <div class="related"> <h2>こちらもおすすめ</h2> <ul>…</ul> </div></main><footer> <a href="/contact">お問い合わせ</a> <a href="/returns">返品</a></footer>問題点3点
- 検索フォームにはロールも名前もないため、ランドマークにならず、ランドマークの一覧に検索がありません。
- 関連コンテンツは
mainの中のdivなので、コードは商品ページ自身の内容として数えます。 - そのため一覧に並ぶのは「バナー」「ナビゲーション」「メイン」「コンテンツ情報」だけで、検索にもおすすめにも、それが何であるかを手がかりに移動したり、残したり、隠したりできません。
Search 要素と aside 要素
<header> <a href="/" class="logo">Tidewater Home</a> <nav> <a href="/kitchen">キッチン</a> <a href="/table">テーブル</a> <a href="/bath">バス</a> </nav> <search> <form action="/search"> <label for="q" class="visually-hidden">ショップ内を検索</label> <input id="q" name="q" type="search"> <button type="submit">検索</button> </form> </search></header><main> <h1>ホーローのマグ</h1> <p class="price">$18</p></main><aside class="related" aria-labelledby="related-title"> <h2 id="related-title">こちらもおすすめ</h2> <ul>…</ul></aside><footer> <a href="/contact">お問い合わせ</a> <a href="/returns">返品</a></footer>修正の手順3ステップ
- 検索フォームを
search要素で囲みます。search要素は search ランドマークになるため、一覧に「検索」が出て、選ぶと検索欄に着きます。中のフォームにロールは要りません。 - 関連コンテンツを
mainの外に出し、フッターの前でmainの横に置きます。メインは商品で終わります。 - その囲みを complementary ランドマークになる
asideにし、見出しを指すaria-labelledbyで名前を付けます。一覧では「こちらもおすすめ」という名前と一緒に出ます。
ランドマークの一覧には「バナー」「ナビゲーション」「検索」「メイン」「補足情報、こちらもおすすめ」「コンテンツ情報」が並び、メインにはマグだけが入ります。これで修正前の例の2つの領域が直り、その領域について1.3.6を満たします。アイコンとコントロールは、この達成基準の残りの部分です(「制限」を参照)。aside は div のときの見た目をそのまま保てます。マークアップのどこにあっても、レイアウトのCSSで商品の下に配置できます。
この方法を選ぶ理由:まずHTMLの要素を使う
どちらの方法でも同じランドマークの一覧になり、これらの領域について1.3.6を満たします。要素を使ってください。search と aside は要素そのものがロールと同じ役割を持つので、属性を管理し続ける必要がありません。search 要素は2023年10月から主要なブラウザーで使えます。ロールは、自分で form を出力して属性をそのまま渡すフォームのコンポーネントのように、要素を変えられないテンプレートに使い、変えられるようになったら要素に切り替えます。
何を main に入れるかは、そのページが何のためにあるかで決めます。商品ページは商品のためのページなので、写真、価格、選択肢、説明、レビュー、サイズの目安は main に残します。ショップがその周りに加えるまとまりは、main の横に置きます。
- おすすめ、最近見た商品、コーディネートの提案の列は complementary です。商品に関連しながら、単独でも意味を持ちます。
- 商品と関係のないニュースレターの登録やキャンペーンは complementary ではありません。ARIA Authoring Practices は、関係のない内容にはもっと一般的なランドマークを勧めています。名前のある
section、つまり region です。 - おすすめと最近見た商品のように complementary が2つあるときは、区別できない複数のナビゲーションランドマークで説明しているように、それぞれに名前が必要です。
aside は main の中ではなく横に置きます。ARIA Authoring Practices は complementary ランドマークを最上位に置くよう勧めています。それに、メインを残してほかを隠すツールが隠せるのは、メインの外にあるものだけです。ARIA 1.3の草案では、補う対象のメインの内容の直下に complementary ランドマークを置くことも認められました。そのため、axe でこれを調べていたルール landmark-complementary-is-top-level は非推奨になり、初期設定では動きません。main の横に置けば、Authoring Practices と草案のどちらにも沿います。すべてのセクションを main の中に出力するテーマでは、移すまとまりのための場所を、レイアウトの main の横に用意する必要があります。
search ランドマークは、検索と絞り込みにだけ使います。HTML標準の search 要素は検索や絞り込みの操作のためのものなので、商品一覧の上の絞り込みフォームも search にでき、検索専用のページの検索フォームもヘッダーのものと同じく search にします。ログインのフォームや、テキスト欄が1つだけのニュースレターのフォームは検索ではありません。検索がドロワーやダイアログで開くときは、その中のフォームを search 要素で囲みます。1つのページに検索が2つあるときは、それぞれに名前を付けます。
article の中の引用のように、記事自身の aside は、名前がない限り complementary ランドマークになりません。引用ならそれが正しい形です。aside は、枠のあるすべての箱ではなく、ページの関連コンテンツに使います。
修正の確認
4項目、マウス不要
確認方法: スクリーンリーダー、キーボード
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。テンプレートに新しいまとまりを加えた際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。パス、クラス名、リストの中の … は仮のものです。このガイドのランドマークの呼び方は NVDA の日本語版に合わせています。言い回しはスクリーンリーダーによって違うため、言い回しではなく領域を聞いてください。このガイドは、1.3.6が挙げる3つのもののうち、領域を扱います。残りはアイコンとコントロールで、WCAGにはまだそのための達成方法が公開されていません。解説書には、コントロールについてマイクロデータを使う方法が、今後のリンクとして1つ挙がっているだけです。言葉や絵に記号の概念を示すためのW3Cの属性、WAI-Adapt Symbols Module の adapt-symbol は、2023年1月から勧告候補のままで、先へ進むには、この属性に反応するユーザーエージェントか拡張機能が2つ必要です。実装報告にはそうしたブラウザーも拡張機能も挙がっていないため、アイコンが利用者自身の記号に置き換わることを、今のところページの側では当てにできません。今ツールがアイコンやコントロールから読み取れるのは名前なので、名前がないアイコンだけのボタンで示しているように、それぞれに名前を付けてください。個人情報を集める入力欄は autocomplete で目的を示します。これは自動入力が効かないフォームの入力欄で扱っています。骨組み自体のランドマーク、つまり1つの main と最上位のヘッダーとフッターは、抜けや置き間違いがあり、内容を囲みきれないランドマークを参照してください。実際に使用する支援技術で、操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
参考資料
- WCAG Understanding: identify-purpose(新しいタブで開きます)
- WCAG Technique ARIA11(新しいタブで開きます)
- ARIA APG: landmark-regions(新しいタブで開きます)
- html.spec.whatwg.org: grouping-content(新しいタブで開きます)
- developer.mozilla.org: search(新しいタブで開きます)
- developer.mozilla.org: aside(新しいタブで開きます)
- dequeuniversity.com: landmark-complementary-is-top-level(新しいタブで開きます)
- skipto.disability.illinois.edu: skipto-extension(新しいタブで開きます)
- w3.org: adapt-symbols(新しいタブで開きます)
EaseWebのサービス
修正した問題を、次のリリースで再発させない
このガイドのような修正方法を、コーディングエージェントが従うルールと、CIのチェックに組み込みます。あわせて定期的に、キーボードとスクリーンリーダーで手動の再テストを行います。