本文へ移動
easeweb
ご相談
トピックを検索

キーボードで開けず、階層も伝わらないツリービュー

セクションとページが並ぶサイドバーを、クリックできるdivで作っているか、ツリーのロールを付けても、そのロールが約束するキー操作、状態、階層がないため、キーボードではセクションを開けず、スクリーンリーダーにはすべての項目が同じ階層に聞こえます。

WCAG 2.2
SC 1.3.1ASC 4.1.2ASC 2.1.1A
必須とする規格
Section 508 · EN 301 549(EU) · JIS X 8341-3
問題あり <div class="section">アカウント</div>
アクセシビリティの問題を示した図: 手の操作:「アカウント」はどう開くの?
01

問題

キーボード利用者はサイドバーのセクションを開いて中のページにたどり着けず、スクリーンリーダー利用者には、ページがどのセクションにあるか、どの深さにあるか、セクションが開いているかが分かりません。

02

試してみる

キーボードだけで「アカウント」を開き、「メールアドレスを変更する」まで移動してください。

  1. 問題1:Tabキーを押します。止まるのは表示中のリンクだけで、セクションには止まらないため、「アカウント」を開けません。
  2. 問題2:同じdivにツリーのロールを足しただけです。Tabキーは同じようにセクションを飛ばし、矢印キーは何もせず、下の欄ではすべての項目が階層1と読まれます。
  3. 修正を適用します。ツリービューでは、矢印キーで移動してセクションを開け、HomeとEndで端へ移動できます。

問題あり 修正できますか?

スクリーンリーダーの読み上げ:

(Tabでサイドバーへ移動)

再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。

03

修正方法

すべてのセクションを、キーボードで開けて開閉状態を伝える操作部品にし、そのページをマークアップ上でもセクションの中に入れます。

  1. 1どのセクションもキーボードで開け、開いているかどうかを伝える。
  2. 2ページのセクションと深さは、字下げだけでなくマークアップで示す。
  3. 3role="tree" には、ロールが約束するもの、つまりTabの移動先1つ、矢印キー、階層、状態をすべて持たせる。持たせないなら、リストとボタンを使う。
修正前

クリックできるdivで作ったセクション

<div class="help-nav">  <div class="section">はじめに</div>  <div class="pages" hidden>    <a href="/help/create-account">アカウントを作成する</a>    <a href="/help/invite-your-team">チームを招待する</a>  </div>  <div class="section is-open">請求</div>  <div class="pages">    <a href="/help/plans">プランと料金</a>    <div class="section">支払い方法</div>    <div class="pages" hidden>      <a href="/help/cards">カード</a>      <a href="/help/bank-transfer">銀行振込</a>    </div>    <a href="/help/invoices">請求書</a>  </div>  <div class="section">アカウント</div>  <div class="pages" hidden>    <a href="/help/change-email">メールアドレスを変更する</a>    <a href="/help/delete-account">アカウントを削除する</a>  </div></div>
修正後

セクションごとにボタンを置いた、入れ子のリスト

<nav class="help-nav" aria-label="ヘルプのトピック">  <ul>    <li>      <button type="button" aria-expanded="false" aria-controls="help-start">はじめに</button>      <ul id="help-start" hidden>        <li><a href="/help/create-account">アカウントを作成する</a></li>        <li><a href="/help/invite-your-team">チームを招待する</a></li>      </ul>    </li>    <li>      <button type="button" aria-expanded="true" aria-controls="help-billing">請求</button>      <ul id="help-billing">        <li><a href="/help/plans">プランと料金</a></li>        <li>          <button type="button" aria-expanded="false" aria-controls="help-payment">支払い方法</button>          <ul id="help-payment" hidden>            <li><a href="/help/cards">カード</a></li>            <li><a href="/help/bank-transfer">銀行振込</a></li>          </ul>        </li>        <li><a href="/help/invoices">請求書</a></li>      </ul>    </li>    <li>      <button type="button" aria-expanded="false" aria-controls="help-account">アカウント</button>      <ul id="help-account" hidden>        <li><a href="/help/change-email">メールアドレスを変更する</a></li>        <li><a href="/help/delete-account">アカウントを削除する</a></li>      </ul>    </li>  </ul></nav>

この方法を選ぶ理由:まずHTMLの要素を使う

AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得、または全ガイドをコーディングエージェントで使う。

04

修正の確認

マウスを使わない5つの確認

確認方法: キーボード、スクリーンリーダー、強制配色、ズーム

5件中0件を確認済み

OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。サイドバー、その部品、ライブラリーを変更した際は、再度確認します。

制限

このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。スクリプトは最小限の例で、ツリーには先頭文字での移動、複数選択、必要なときの読み込みがありません。ページ上部に横に並ぶドロップダウンメニューは別のパターンで、マウスでしか開かないドロップダウンメニューで扱っています。1つだけ開閉する部分は、開いているか伝わらない表示・非表示ボタンで扱っています。項目をドラッグで移動できるファイルのツリーには、ドラッグしない方法も必要です。マウスでしか動かせないドラッグ&ドロップのボードを参照してください。スレッドの受信トレイのように行に複数の列があるものはツリーグリッドで、別のパターンです。対象とする支援技術で、一連の操作全体をテストしてください。

よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。

コードを更新しても、使いやすさを保つために

ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。

再テストの進め方