トピックを検索
押された状態が伝わらないトグルボタン
お気に入りボタンは押すとハートが塗りつぶされますが、押された状態がCSSのクラスにしかないため、支援技術にはどちらの状態でも同じボタンとして伝わります。
<button class="fav is-saved" aria-label="お気に入り"> 問題
スクリーンリーダーの利用者は、お気に入りボタンを押せても、商品が保存されたか、押して何か変わったかが分かりません。
商品ページに、キャンバス地のリュックが表示され、商品名の横にハートのボタンがあります。ハートを押すと塗りつぶされ、リュックがお気に入りに追加されます。スクリーンリーダーの利用者がハートにTabで移動すると、「お気に入り、ボタン」と読み上げられます。Enterを押すとハートは塗られますが、新しい読み上げはありません。あとでボタンに戻っても「お気に入り、ボタン」のままです。リュックが保存されたか分からないため、もう一度押して外してしまうおそれを抱えるか、お気に入りの一覧を探しに行くことになります。
押すと押されたままになるボタンでは、どれも同じ問題が起きます。エディターの太字や斜体、動画プレーヤーのミュート、プロフィールのフォロー、「在庫あり」「セール中」のような絞り込みのチップなどです。
達成基準4.1.2では、操作部品の状態をプログラムで取得でき、変化が支援技術に通知されることが求められます。トグルボタンには、押されている状態と押されていない状態があります。この例では、状態はハートを塗る is-saved クラスにしかありません。ボタンには名前と役割がありますが、アクセシビリティツリーには押されているという情報がないため、変化は見えても読み上げられません。
お気に入りや絞り込みのトグルは、商品や検索結果の長い一覧に並ぶことがよくあります。保存したものを確かめるには、ハートを一つずつ確認する必要があります。状態が伝わらないと、そのすべてが推測になります。
10グループ中3グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響なし)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 視覚を使わない スクリーンリーダーの利用者には、保存されていてもいなくても「お気に入り、ボタン」としか伝わらず、何を保存したかも、押して効いたかも確かめられません。
- 視覚が限られる 画面を拡大している人や拡大鏡を使う人は、小さなハートが塗られる変化を見落とすことがあり、スクリーンリーダーを併用していても頼れる読み上げがありません。
- 言語・認知・学習の能力が限られる 状態がはっきりしないため、確認したい人がもう一度押して、残したかった商品を保存から外してしまうことがあります。
修正前のボタンは、役割と名前があり、トグルであることを示すものもないため、自動チェックをすべて通過します。そのクラスが「押されている」を意味することは、ツールには分かりません。コード生成AIは惜しいところまで直しますが、矛盾を残しがちです。aria-pressed を付けたうえで名前も「お気に入りから削除」に変え、「お気に入りから削除、トグルボタン、押されている」と読み上げられるようにしてしまったり、ボタンには使えない aria-checked や aria-selected を付けたりします。実際に押して、何が変わるかを聞いてください。
試してみる
Tabでハートへ移動し、EnterかSpaceで押してください。
下の欄に、スクリーンリーダーの読み上げが出ます。リュックが保存されたかどうか分かりますか?
問題あり 修正できますか?
スクリーンリーダーの読み上げ:
(Tabでハートへ移動)再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。
修正方法
aria-pressed、チェックボックス、または押すと何が起きるかを示す名前で、押された状態を伝えます。
- 1状態をコードで伝える。aria-pressed、チェックボックス、または次の操作を示す名前を使う。
- 2状態か名前のどちらか一方で伝え、名前が変わるボタンにaria-pressedを付けない。
- 3押された見た目は読み上げられる値から描き、色だけで示さない。
<button type="button" class="fav" aria-label="お気に入り"> <svg aria-hidden="true" viewBox="0 0 24 24"><path d="…"/></svg></button>Aria-pressedを持つトグルボタン
<button type="button" class="fav" aria-pressed="false" aria-label="お気に入り"> <svg aria-hidden="true" viewBox="0 0 24 24"><path d="…"/></svg></button>この方法を選ぶ理由:クラスではなく状態から見た目を決める
Tabで到達でき、EnterとSpaceで押せますが、状態は is-saved クラスにしかありません。保存されていてもいなくても「お気に入り、ボタン」と読み上げられ、変化しても何も伝わりません。
aria-pressed を付けるとトグルボタンになり、「お気に入り、トグルボタン、押されていない」と読み上げられ、変化すると「押されている」と伝わります。名前は「お気に入り」のままで、状態が残りを伝えます。ハートはクラスではなくこの属性から塗るので、見た目と読み上げが一つの値から決まり、ずれません。
三つとも達成基準4.1.2を満たします。どれを選ぶかは、トグルが何であるか、すでに何があるかによります。お気に入りや太字のように、ボタンとして見えて動くトグルを作るなら、aria-pressed を使います。名前は一つのままで、フォーカス時にも変化した瞬間にも読み上げられ、必要なのは属性一つです。HTMLにはトグルボタンの要素がないため、HTMLの要素の代わりにARIAを使っているわけではありません。まとめて送信する絞り込みのように、トグルが実際にはフォームの選択肢である場合や、マークアップがすでにチェックボックスである場合は、チェックボックスのままにします。状態はブラウザーが持ち、スクリプトなしでも動きますが、チェックボックスとして読み上げられ、Enterには反応しません。ミュートとミュート解除のように、デザインがすでにラベルを次の操作に変えている場合は、aria-pressed を重ねずに名前を変える方法を残し、新しい名前が読み上げられるかを確かめるか、結果をステータスメッセージでも伝えます。
aria-pressed やチェックボックスを使うときは、どちらの状態でも名前を変えません。「お気に入り」と状態「押されている」なら明確ですが、「お気に入りから削除、押されている」は二つの異なることを同時に伝えます。
フォローボタンのように、ラベルが見える文字の場合も同じ選択になります。
aria-pressedを使うなら、「フォロー」の文字はそのままにし、押された見た目を属性から描きます。- ラベルを変えるなら、新しい言葉は「フォロー中」ではなく、次の操作である「フォロー解除」にし、
aria-pressedは付けません。 - 「フォロー中」のように今の状態を表す言葉に変えると、見える人には状態が伝わりますが、それ以外の人には操作として読み上げられます。
押された状態は色以外でも示します。ハートが輪郭だけから塗りつぶしに変わるのは形の変化で、塗りに currentColor を使えば強制配色でも残ります。灰色から赤に変わるだけのハートは、強制配色でも、二つの色を見分けにくい人にも区別がつきません。
お気に入りの保存には、ふつうサーバーへのリクエストが伴います。押したときに状態を変え、保存に失敗したら元に戻してステータスメッセージで知らせます。保存されていない商品のハートを塗ったままにしないでください。
コンポーネントライブラリでは、押された状態を外側の要素やアイコンに持たせていることがあります。読み上げられるのはフォーカスを受ける要素の状態なので、その要素を確認してください。ボタンではなく、オンとオフの位置を持つ設定の行なら、トグルスイッチを参照してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
5つの確認
確認方法: キーボード、スクリーンリーダー、強制配色、マウス
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のボタンコンポーネントを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。トグルボタンの読み上げ方はスクリーンリーダーによって異なり、名前の変化が読み上げられるかどうかは、スクリーンリーダーとブラウザーの組み合わせによります。CSSは最小限の例なので、フォーカス表示とハートのコントラストを実際の配色で確認してください。商品を保存してからお気に入りの一覧で見つけるまでの操作全体を、使用する支援技術で確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。