トピックを検索
見つからず理由も分からない無効なボタン
注文ボタンは利用規約に同意するまで灰色ですが、クラスだけで無効に見せているため使えるボタンとして読み上げられるか、disabledで無効にしているためTabで飛ばされ、何が足りないのかがどこにも書かれていません。
<button type="submit" disabled>注文する</button> 問題
キーボードやスクリーンリーダーの利用者は、灰色のボタンを使えるものとして聞くか、ボタンを見つけられず、まだ何をすればよいのかを誰にも伝えられません。
購入手続きの最後に、「利用規約に同意する」のチェックボックスと、その下に「注文する」ボタンがあります。チェックを入れるまで、ボタンは灰色です。マウスを使う見える人なら、チェックボックスが原因だと推測できるかもしれません。それ以外の人には分かりません。
あるサイトでは、ボタンはクラスで灰色にしているだけです。スクリーンリーダーの利用者がTabで移動すると「注文する、ボタン」と読み上げられ、使えるように聞こえます。クラスがポインターの操作を止めているのでクリックは効きませんが、Enterではフォームが送信され、ページの上にエラーが出て戻ってきます。別のサイトでは、ボタンに disabled 属性があります。キーボード利用者がTabを押すと、チェックボックスから下の「配送と返品」のリンクへ直接移り、ボタンには一度も止まりません。Tabで移動するスクリーンリーダーの利用者にはボタンがあることも伝わらず、何が足りないのかもページのどこにも書かれていません。
何かを待っている操作では、どれも同じことが起きます。入力が終わっていない手順の「次へ」、変更のないフォームの「保存」、サイズを選ぶ前の「カートに入れる」、空のメッセージの「送信」などです。
達成基準4.1.2では、操作部品の状態をプログラムで取得できることが求められます。使えないことも状態の一つです。ボタンが使えない見た目なのにコードが何も伝えていなければ、支援技術は普通のボタンとして読み上げ、キーボードでも動いてしまいます。これが、この達成基準の不適合です。
disabled 属性のあるボタンは状態を伝えるので、4.1.2は満たします。それでも利用者は先に進めません。ブラウザーはそのボタンをTabの移動先から外して薄く描き、WCAGも無効な部品のコントラストを求めないため、ボタンを見つけられないことも、名前を読めないこともあります。このトピックが求めるのは達成基準より少し先で、部品を見つけられ、無効な理由が分かることです。
この問題は、ほかの欄をすべて入力し終えた、手続きの最後に起きます。スマートフォンの長いフォームでは、チェックボックスが画面の上に隠れ、見える人にも灰色のボタンしか見えないことがあります。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 手の操作が限られる キーボード利用者は、マウスには反応しないのにEnterでは送信されるボタンに着くか、無効なボタンを素通りするため、フォームを送れる状態かどうかが分かりません。
- 視覚を使わない スクリーンリーダーの利用者には、灰色のボタンが「注文する、ボタン」と読み上げられるか、Tabで移動すると無効なボタンにまったく出会わず、理由も読み上げられません。
- 視覚が限られる 無効なボタンは薄く描かれ、コントラストも問われないため、弱視の人は名前を読めず、送れる状態に変わったことにも気づかないことがあります。
- 言語・認知・学習の能力が限られる 理由のない灰色のボタンでは、どの欄が原因かを自分で探す必要があり、フォームをあきらめる人もいます。
axeなどのツールは、ボタンに名前と役割があるかを確かめます。クラスで灰色にしたボタンにはどちらもあるので、通過します。無効なボタンはコントラストのチェックから意図的に外され、理由が示されているかを確かめるものもありません。コード生成AIは、状態を直すために disabled 属性を使うことが多く、ボタンは届かないまま、理由もないまま残ります。aria-disabled を使う場合は、操作を止めるのを忘れがちで、「使用不可」と読み上げながら送信できてしまいます。フォームをTabで移動し、入力が終わる前にボタンを押して、何が伝わるかを確かめてください。
試してみる
Tabでチェックボックスから「注文する」へ移動し、チェックを入れる前にEnterを押してください。
ボタンに届きますか?足りないものを教えてくれるものはありますか?下の欄に、スクリーンリーダーの読み上げが出ます。
問題あり 修正できますか?
スクリーンリーダーの読み上げ:
(Tabでフォームを移動)
修正方法
状態をコードで伝え、ボタンを見つけられる場所に残し、まだ何が必要かを文字で伝えます。
- 1フォーカスを受ける要素にdisabledかaria-disabledがないまま、部品を無効の見た目にしない。
- 2見つける必要があるボタンはTabの移動先に残す。押せるままにするか、aria-disabledを使う。
- 3足りないものは、ボタンのそばか、原因のそばのエラーとして、見える文字で伝える。
クラスで灰色にしたボタン
<label><input type="checkbox" name="terms"> 利用規約に同意する</label><button type="submit" class="btn is-disabled">注文する</button>押せるままにして、押されたら説明するボタン
<label><input type="checkbox" name="terms" id="terms" aria-describedby="terms-error"> 利用規約に同意する</label><p id="terms-error" class="error" hidden>利用規約に同意するにはチェックを入れてください。</p><button type="submit">注文する</button>この方法を選ぶ理由:無効にせず、理由を伝える
ボタンは使えないように見えますが、そう伝えているのはクラスだけです。「注文する、ボタン」と読み上げられ、pointer-events: none はマウスを止めてもキーボードは止めないため、Enterでフォームが送信されます。
ボタンはいつでも届き、読め、押せば何かが起きます。早く押されると、チェックボックスのそばにエラーを出してフォーカスをそこへ移し、スクリーンリーダーはラベル、エラーの状態、エラー文を読み上げます。伝えるべき無効の状態がないので、間違えようがありません。
三つとも達成基準4.1.2を満たします。ボタンを押せるままにして、押されたら説明する方法を勧めます。誰もが見つけて読める場所にボタンが残り、理由は必要な人に必要なときだけ示され、フォームにもともと必要なエラー処理で済みます。まだ押せないことをデザインで示す必要があるなら、aria-disabled を使います。そのときは、操作を止めるのがブラウザーではなくスクリプトになることを受け入れます。HTMLの disabled に見える理由を添える方法は、すでにある無効なボタンへのいちばん小さな変更ですが、Tabで移動する人は素通りしたままなので、最終形ではなく途中の段階と考えてください。
利用者の入力を待っているのではなく、一時的に使えないボタンは、別に考えます。注文を送信している間は、ボタンをその場に残して aria-disabled="true" にし、続けて押されても無視して、「注文を送信しています」とステータスメッセージで伝えます。ここでHTMLの disabled を使うと、ブラウザーによってはフォーカスがページの本文に落ち、利用者は今いた場所を見失います。
HTMLには無効なリンクがありません。disabled クラスを付けたリンクも、リンクのままです。たどらせたくないリンクは、href を外してリンクでもTabの移動先でもなくすか、aria-disabled を付けたボタンにします。
コントラストが失われるのは、薄い見た目のところです。無効な部品はコントラストの達成基準の対象外ですが、対象外だから読めるわけではありません。使えないボタンも文字は読める濃さにし、破線の枠のように色以外の変化も加えます。HTMLの disabled のボタンは、強制配色では GrayText で描かれます。aria-disabled から描いた見た目は、forced-colors のルールを足さないと強制配色で消えます。
理由が複数あるときは、複数のメッセージが必要です。注文ボタンが配送日時の選択と利用規約の同意の両方を待っているなら、ボタンのそばに両方を挙げるか、押せるボタンが足りないものすべてのエラーの一覧を出します。問題をすべて挙げるエラーの一覧を参照してください。各欄のそばのエラーは、何が間違っているかを伝えるエラーで扱っています。
コンポーネントライブラリでは、属性を付ける disabled と、代わりに aria-disabled を付ける focusableWhenDisabled のような設定の両方を持つことがよくあります。共通のボタンがどちらを使っているか、その中でどの要素がフォーカスを受けるかを確認してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない6つの確認
確認方法: キーボード、スクリーンリーダー、強制配色、ズーム
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のボタンコンポーネントを変更した際は、再度確認します。
制限
このサンプルは、どのフォームでも同じ結果になることを保証するものではありません。aria-disabled と disabled の読み上げ方(「使用不可」「淡色表示」「無効」)はスクリーンリーダーによって異なり、aria-describedby を少し間を置いてから、または求められたときにだけ読むものもあります。エラーの文言とページ上の位置は、フォームのほかの部分によって変わります。空のフォームから注文が終わるまでの操作全体を、利用者が使う支援技術で確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。