トピックを検索
設問名がないラジオボタンとチェックボックスのグループ
購入手続きでは各選択肢の上に太字で設問がありますが、設問と選択肢がコードで結び付いていないため、スクリーンリーダーは設問なしで「はい、ラジオボタン」と読み上げます。
問題
スクリーンリーダーの利用者には「はい」や「お急ぎ便」は聞こえても、何の設問への答えかが分かりません。
オンラインショップの購入手続きで、支払いの前に二つの設問があります。「配送方法」では通常便とお急ぎ便をラジオボタンで選び、「不在時は置き配する?」でははいといいえを選びます。その下の「お知らせの受け取り方法」では、メールとSMSをチェックボックスで選びます。各設問は選択肢の上に太字で書かれ、目で見る人は設問を読んでから答えを選びます。しかしスクリーンリーダーでTabキーを押すと、「通常便、ラジオボタン、チェック、1/2」、続いて「はい、ラジオボタン、チェックなし、1/2」、「メール、チェックボックス、チェックなし」と聞こえます。答えだけが届き、設問は届きません。設問は画面の一行上にありますが、マークアップには選択肢との関係がありません。
各設問は、太字にするクラスが付いたp要素です。選択肢は本物のラジオボタンとチェックボックスで、ラベルもあるため名前はあります。しかし選択肢をまとめるものも、設問と結び付けるものもありません。1.3.1は、見た目で分かる関係、ここでは「この選択肢はこの設問への答え」という関係を、コードにも持たせることを求めています。labelが名前を付けるのは一つの欄だけで、複数の欄はまとめられません。それは名前を持つグループの役割で、フォーカスがグループに入るとスクリーンリーダーがその名前を読み上げます。
フォームが長くなるほど問題は大きくなります。「はい」「いいえ」の設問が一つなら文脈で推測できますが、はい・いいえの設問が並ぶ申込フォームではそうはいきません。答えを直しに戻った人は、設問から離れたグループの途中に着くこともあります。
10グループ中2グループに影響
- 全盲 (影響あり)
- 弱視 (影響なし)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響なし)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 視覚を使わない スクリーンリーダーや点字ディスプレイの利用者には、「はい」や「メール」が設問なしで伝わり、どちらも「はい」を含む二つのグループは同じに聞こえます。
- 言語・認知・学習の能力が限られる 読むことを補うためにスクリーンリーダーを使う人や、長いフォームを行き来する人は、設問の行を離れたとたんに何を答えているかを見失います。
スキャナーは各ラジオボタンとチェックボックスに名前があるかを確認します。ここではすべてにあるので合格します。選択肢の上にあるテキストが本当にその設問かは意味の判断なので、多くのツールは指摘しません。ANDIのlegend-aloneが確認するのは逆の誤り、つまりlegendはあっても各欄にラベルがない状態です。AIによる手早い修正は、各ラジオボタンにaria-label="不在時は置き配する? はい"を足しがちです。設問は読まれますが、画面の文字とずれうる隠れたテキストになり、「はいをクリック」と言う音声操作とも合わなくなることがあります。各グループで設問が伝わるかは、人が聞いて確かめます。
試してみる
Tabキーで各設問に入り、はいといいえの間は矢印キーで移動してください。
見た目はどちらも同じです。フォームの下で、スクリーンリーダーに設問まで聞こえるか、答えだけかを確認してください。
問題あり 直してみませんか?
不在時は置き配する?
お知らせの受け取り方法
スクリーンリーダーの読み上げ (Tabで設問へ移動)
再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。
修正方法
設問をグループの名前にします。fieldsetとlegendか、設問を指すグループのロールを使います。
- 1ラジオボタンのまとまりと、一つの設問に答えるチェックボックスのまとまりを、マークアップでグループにする。
- 2グループの名前は、legendかaria-labelledbyで、画面に書かれた設問にする。
- 3グループの名前に加えて、各選択肢にもそれぞれのラベルを残す。
<p class="question">不在時は置き配する?</p><div class="options"> <input id="leave-yes" type="radio" name="leave" value="yes"> <label for="leave-yes">はい</label> <input id="leave-no" type="radio" name="leave" value="no"> <label for="leave-no">いいえ</label></div> <p class="question">お知らせの受け取り方法</p><div class="options"> <input id="by-email" type="checkbox" name="updates" value="email"> <label for="by-email">メール</label> <input id="by-text" type="checkbox" name="updates" value="text"> <label for="by-text">SMS</label></div>この方法を選ぶ理由:まずHTMLの要素を使う
どの選択肢にもラベルがあり、名前はあります。しかし設問は選択肢の横にある段落で、グループの名前ではないため、スクリーンリーダーは「はい、ラジオボタン」とだけ読み、設問は読みません。
fieldsetがグループになり、legendがその名前になります。フォーカスがグループに入ると、スクリーンリーダーは「不在時は置き配する?、グループ、はい、ラジオボタン」のように設問を読みます。ラベルは残すので、各選択肢にもそれぞれの名前があります。fieldsetの既定の枠線や余白が不要なら、CSSで消しても意味は変わりません。
どちらも画面の設問をグループの名前にし、1.3.1を満たします。fieldsetとlegendを使ってください。素のHTMLで同じことができ、IDを揃える必要もなく、リーダー表示や古い支援技術のようにARIAの対応が不十分な環境でも動きます。グループのロールは構造を変えられないマークアップに使い、変えられるようになったらfieldsetに置き換えます。
legendが名前を付けるのはグループで、欄ではありません。 各選択肢にもラベルが必要です。横のテキストだけで名前のないラジオボタンをlegendの下に並べると、設問の後に「ラジオボタン」としか読まれません。andi:legend-aloneが報告するのはこの誤りです。
legendは短くします。 スクリーンリーダーは、特にフォーム一覧で、グループ内の選択肢ごとにlegendを繰り返すことがあります。legendには設問だけを入れ、お急ぎ便の料金のような長い補足は、グループや選択肢にaria-describedbyで結び付けたヒントにします。
チェックボックスが一つならグループは不要です。 「利用規約に同意する」だけのチェックボックスは、ラベルだけで名前が付きます。グループにするのは、複数のチェックボックスが一つの設問に答えるときです。
スタイル。 古いブラウザーでは、fieldsetをflexやgridで配置しにくいことがありました。現在のブラウザーはどちらにも対応しているので、スタイルが理由でfieldsetをやめる必要はほとんどありません。幅の広い子要素でfieldsetが縮まない場合はmin-inline-size: 0を指定します。legendは最初の子要素に置かないと、legendとして扱われません。
入れ子のグループ。 「配送先」の中の住所のように、グループの中にグループを置くこともできますが、legendが順に読まれます。外側の設問が本当に内側を説明しているときだけ入れ子にします。
コンポーネント。 共通のラジオグループとチェックボックスグループのコンポーネントで設問を必須にし、legendとして描画します。そうすれば、グループのない選択肢は作れなくなります。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない4つの確認
確認方法: キーボード、スクリーンリーダー、ズーム、強制配色
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のグループコンポーネントを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。グループ名をどの程度繰り返すかはスクリーンリーダーによって異なり、最初の選択肢でだけ読むものもあります。divで作った独自のラジオボタンには、矢印キーや状態を含むラジオボタンのパターン全体が必要ですが、このガイドでは扱いません。外部ウィジェットや決済用のiframe内のグループも同じように確認してください。実際に使用する支援技術で、操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。