トピックを検索
大きさで選ばれ、構造と合わない見出し
レシピのページで、主な項目の見出しをスタイルを付けたdivで作り、小さい見出しにh5を、区切り線に空のh2を使っているため、スクリーンリーダーの見出し一覧に、ページの中心となる項目が出てきません。
<div class="section-title">作り方</div> 問題
主な項目が見出しになっていないため、スクリーンリーダー利用者は見出しでページを拾い読みできません。
レンズ豆のスープのレシピのページには、大きなタイトル、短い紹介文、細い区切り線があります。線の下には「材料」と「作り方」の2つの項目があり、それぞれ太字の見出しが付いています。作り方の最後には小さな太字の「コツ」があり、ページの最後には「その他」という見出しの下に関連レシピのカードが並びます。見える人には、構成がはっきり分かります。作り方を知りたいスクリーンリーダー利用者は、長いページでよく行うように、見出し一覧を開くか、Hキーで見出しから見出しへ移動します。一覧には「レンズ豆のスープ 見出しレベル1」「見出しレベル2」「コツ 見出しレベル5」「その他 見出しレベル2」と並びます。ページの中心である「材料」と「作り方」がありません。1つは中身がなく、最後の見出しは何の「その他」か分かりません。
それぞれの見出しが、何であるかではなく、どう見せたいかでマークアップされています。1.3.1は、見て分かる構造をコードでも伝えることを求めます。ここでは、どの行が項目の見出しで、どの項目がどの項目の中にあるか、です。2.4.6は、見出しがその内容を表すことを求めます。このページでは、次の4か所で満たしていません。
- 「材料」と「作り方」は、大きな太字にするクラスを付けた
div要素です。見出しに見えますが見出しではなく、WCAGの失敗例F2に当たります。 - 「コツ」は、デザインのh5がちょうどよい大きさだったため
h5になっています。実際はレベル2の「作り方」に属するため、レベルが示す深さより3段浅い位置にあります。 - 紹介文の下の線は、上の枠線を付けた空の
h2です。見出し一覧に、中身のない項目が1つ増えます。 - 関連レシピの見出しは「その他」です。カードの隣では意味が通じますが、見出しの一覧では、何が続くのか分かりません。
画面上には何の問題もありません。大きさ、太さ、余白のすべてが構成を示しています。問題はマークアップにあるため、見た目ではなくコードからページの構造を知る人に影響します。
10グループ中2グループに影響
axe は空の h2(empty-heading)と、h1からh5への飛び(heading-order)を報告します。ただしどちらもベストプラクティスに分類されているため、多くの診断では報告されません。どちらのルールも、見出しに見える div は検出できないため、問題の大部分である2つの項目の欠落は、どのチェックも通ってしまいます。報告された箇所だけを直すと、かえって悪くなることもあります。h5をh2に変えれば heading-order は消えますが、「コツ」が「作り方」と同じレベルになります。AIによる手早い修正では、逆に太字の行をすべて見出しにしがちで、人数や調理時間まで見出しになり、誰も移動したくない項目で一覧が埋まります。各行が見出しかどうか、どのレベルか、言葉が内容を表しているかは、ページと照らし合わせて人が判断する必要があります。
試してみる
見出し一覧を使って、作り方へ移動してください。
一覧には、このレシピのページでスクリーンリーダーが見つける見出しが出ます。各見出しの横のタグは、そのマークアップです。項目を選ぶとそこへ移動します。「作り方」にたどり着けますか?
問題あり 修正できますか?
<h1>平日の夜に作れる、とろりと温まるスープです。
<h2><div>- 玉ねぎ 1個
- にんじん 2本
- 赤レンズ豆 200 g
- 野菜スープ 1リットル
<div>- 玉ねぎとにんじんを柔らかくなるまで炒める。
- レンズ豆とスープを加える。
- 25分煮てから、なめらかにする。
<h5>レモンを少し搾ると味が引き締まります。
<h2>- トマトのスープ
- グリーンピースのスープ
- ポロねぎとじゃがいものスープ
スクリーンリーダーの見出し一覧:
再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。
修正方法
項目の見出しをすべて、構成上の位置に合ったレベルの見出しにし、見た目はクラスで整えます。
- 1見える項目の見出しは、すべて見出しにする。h1〜h6要素か、role="heading"とaria-levelを使う。
- 2レベルは構成から、大きさはクラスから決める。
- 3すべての見出しに項目を表す言葉を入れ、見出しでないものは見出しにしない。
<h1>レンズ豆のスープ</h1><p>平日の夜に作れる、とろりと温まるスープです。</p><h2 class="divider"></h2> <div class="section-title">材料</div><ul>…</ul> <div class="section-title">作り方</div><ol>…</ol><h5>コツ</h5><p>…</p> <h2>その他</h2><ul class="cards">…トマトのスープ、グリーンピースのスープ、ポロねぎとじゃがいものスープ…</ul>正しいレベルの見出し要素
<h1>レンズ豆のスープ</h1><p>平日の夜に作れる、とろりと温まるスープです。</p> <h2 class="section-title divider">材料</h2><ul>…</ul> <h2 class="section-title">作り方</h2><ol>…</ol><h3 class="title-small">コツ</h3><p>…</p> <h2 class="section-title">ほかのスープのレシピ</h2><ul class="cards">…トマトのスープ、グリーンピースのスープ、ポロねぎとじゃがいものスープ…</ul>この方法を選ぶ理由:まずHTMLの要素を使う
主な2つの項目に見出しがなく、その前にあるレベル2の見出しは空です。「コツ」は実際より深いレベルを名乗り、「その他」は何を紹介するのか分かりません。
「材料」「作り方」「ほかのスープのレシピ」はページタイトルの下のレベル2の見出しに、「コツ」は「作り方」の中のレベル3の見出しになり、見出し一覧がページと同じ構成になります。大きさはもともと要素ではなくクラスで決めているため、見た目は変わりません。区切り線は最初の見出しの枠線にしたため、空の項目は増えません。
どちらの方法でも、すべての見出しが正しいレベルで見出し一覧に出て、1.3.1を満たします。マークアップを変えられる場所では、見出し要素を使ってください。そろえて保つ属性がなく同じ働きをし、ARIAを読むツールに限らず、ページを読むすべてのツールが見出しとして扱います。role="heading" は、外部のウィジェットが描画する見出しのように、要素を変えられない場合に使い、変えられるようになったら見出し要素に置き換えます。
見出しの誤りの多くは、レベルと大きさを結び付けることから生まれます。よく結び付いてしまうのは、次の3か所です。
- デザインシステムの見出しコンポーネント:
<Heading level={3} size="small">のように、レベルと大きさを別のプロパティにする。見た目のために誤ったレベルを選ぶ必要がなくなる。 - CMSのエディター:編集者は、小さいという理由でツールバーから「見出し5」を選ぶ。大きさはスタイルとして用意し、本文で使えるレベルを、通常はh2〜h4に絞る。
- カードなどの再利用する部品:カードの見出しは、h2の項目の中ではh3、項目のないページではh2になる。レベルは部品ではなく、置かれる場所から決める。
太字の行がすべて見出しではありません。見出しは、その後に続く内容を紹介するものです。人数、価格、引用文は何も紹介しないため、どれほど大きく表示しても文章のままにします。見た目のためだけの見出しを取り除くことも、足りない見出しを加えることと同じく修正の一部です。
線や余白にはCSSを使います。枠線や余白なら、見出し一覧に何も加えずに同じ線を描けます。hr は、スクリーンリーダーが区切りとして読み上げるため、話題が本当に変わる場所にだけ使います。
短い見出しで問題ありません。「コツ」は「作り方」の下にあるため、レベルから何のコツか分かります。「その他」に言葉を足したのは、「材料」や「作り方」と並ぶレベル2にあり、周りに何の「その他」かを示すものがないためです。
WCAGは、h1 を1つにすることも、レベルを飛ばさないことも、一律には求めていません。ページの内容を表す h1 を1つにし、レベルを一段ずつ下げて、ページにない関係をレベルが示さないようにします。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない4つの確認
確認方法: スクリーンリーダー
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。テンプレート、共通の見出しコンポーネント、CMSエディターのスタイルを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。クラス名、色、リスト内の … は仮のものです。スクリーンリーダーによって見出し一覧の言い方は異なるため、正確な言い回しではなく、見出しの言葉とレベルを確認してください。このガイドは、見出しであるかどうか、そのレベルと言葉を扱います。長い内容に十分な見出しがあるかどうかや、フォームの欄のラベルは扱いません。実際に使用する支援技術で、操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
参考資料
- WCAG Understanding: info-and-relationships(新しいタブで開きます)
- WCAG Understanding: headings-and-labels(新しいタブで開きます)
- WCAG Technique H42(新しいタブで開きます)
- WCAG Technique ARIA12(新しいタブで開きます)
- WCAG Technique F2(新しいタブで開きます)
- WAI Tutorial: page-structure/headings(新しいタブで開きます)
- developer.mozilla.org: Heading_Elements(新しいタブで開きます)
- dequeuniversity.com: heading-order(新しいタブで開きます)
- dequeuniversity.com: empty-heading(新しいタブで開きます)
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。