トピックを検索
オンかオフかが伝わらないトグルスイッチ
スイッチは色とつまみの位置でオンとオフを示しますが、状態がCSSのクラスにしかないため、支援技術には伝わりません。
問題
スクリーンリーダーの利用者は、スイッチを見つけられても、オンかオフか、押して切り替わったかが分かりません。
アカウント設定のページに、メール通知、SMSのリマインダー、ニュースレターのスイッチが並んでいます。どれも丸いつまみと細長い枠を持つボタンで、クリックするとつまみが動き、枠が灰色から緑に変わります。スクリーンリーダーの利用者が最初のスイッチにTabで移動すると、「メール通知、ボタン」と読み上げられます。Spaceを押すとつまみは動きますが、新しい読み上げはありません。メール通知がオンになったのかオフになったのか、確かめる方法がありません。
達成基準4.1.2では、操作部品の状態をプログラムで取得でき、変化が支援技術に通知されることが求められます。この例では、状態はつまみの位置を描くCSSのクラスにしかありません。ボタンには名前と役割がありますが、アクセシビリティツリーにはオンもオフもないため、変化は見えても読み上げられません。
role="switch" を付けた div に aria-checked がない場合も同じ問題で、axeは必須属性の不足として報告します。読み込み時に一度だけ aria-checked を設定し、その後は更新しない場合も同様です。
設定ページではスイッチが縦に並ぶことが多く、利用者は順に読んで何が設定されているかを確かめます。状態が伝わらないと、一覧全体が推測になります。
10グループ中3グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響なし)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 視覚を使わない スクリーンリーダーの利用者には名前と役割は伝わりますが、状態が伝わらないため、設定を確かめることも、切り替えが効いたか知ることもできません。
- 視覚が限られる 画面拡大やスクリーンリーダーを併用する弱視の人は、つまみの動きを見落とすことがあり、そのときに頼れる読み上げもありません。
- 言語・認知・学習の能力が限られる 状態がはっきり読み上げられず、文字でも示されないため、確認が必要な人は設定がどちらになったか確信できません。
aria-checked のない role="switch" は検出できますが、CSSのクラスで状態を描く普通の button は、役割と名前があるため自動チェックをすべて通過します。そのクラスがオンを意味することも、切り替え後に属性が一致しているかも、ツールには分かりません。コード生成AIは、ラベルだけ直して状態はそのままにしたり、ラベルを「オン」「オフ」と書き換えて、状態ではなく名前を変えたりしがちです。実際に切り替えて、読み上げを聞いてください。
試してみる
Tabでスイッチへ移動し、Spaceで切り替えてください。
下の欄に、スクリーンリーダーの読み上げが出ます。メール通知がオンかどうか分かりますか?
問題あり 直してみませんか?
スクリーンリーダーの読み上げ: (Tabでスイッチへ移動)
再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。
修正方法
チェックボックス、switchのaria-checked、またはボタンのaria-pressedで状態を伝えます。
- 1切り替えるたびに、公開する状態を見た目と一致させる。
- 2名前は変えず、オンとオフは状態で伝える。
- 3オンとオフを、色だけでなく位置や文字でも示す。
<button type="button" class="switch" onclick="this.classList.toggle('is-on')"> メール通知</button>この方法を選ぶ理由:まずHTMLの要素を使う
Tabで到達でき、EnterとSpaceで押せますが、状態は is-on クラスにしかありません。オンでもオフでも「メール通知、ボタン」と読み上げられ、変化しても何も伝わりません。
状態はブラウザーが持ち、チェックの有無として伝え、Spaceやラベルのクリックで切り替わります。見た目は :checked から描くので、読み上げとずれません。スクリプトなしで、フォームと一緒に送信もされます。
三つとも適合します。特別な理由がなければ、HTML標準のチェックボックスを使います。状態をブラウザーが持つため、スクリプトのせいでずれることがなく、フォームの中でも追加のコードなしで動きます。ほぼすべての設定スイッチでこれを勧める理由はここにあります。すでに独自のボタンで作られている部品や、チェックボックスではなくスイッチとして読み上げたい場合は role="switch" を選び、変化のたびにスクリプトで aria-checked を更新します。オンとオフの位置を持つ設定ではなく、ツールバーのトグルボタンなら aria-pressed を選びます。
チェックボックスは「オン」「オフ」ではなく「チェックあり」「チェックなし」と読み上げられます。多くの人には通じますが、スイッチとして読み上げたい場合は、チェックボックス自体に role="switch" を付けられます。キーボード操作とフォームの動作はそのままで、オンとオフとして読み上げられます。チェックボックスに付けるSafariの switch 属性も同じ効果がありますが、Safariだけなので、それだけに頼らないでください。
どのマークアップでも、次の点に注意します。
- 名前は変えません。「メール通知」と状態「オン」なら明確ですが、ラベルを「メール通知をオンにする」から「オフにする」に変えながら状態も伝えると、矛盾します。
- 状態を色だけで示しません。つまみの位置が変わる、または
aria-hiddenを付けた「オン」「オフ」の文字を枠の横に描けば、強制配色でも、緑と灰色を見分けにくい人にも伝わります。 - 変更がいつ反映されるかを決めます。スイッチは通常すぐ反映されます。サーバーに保存する場合、失敗したらステータス領域で知らせて状態を元に戻し、保存されていない値を表示し続けないようにします。
コンポーネントライブラリのスイッチは、状態を外側の div に持たせていることがあります。読み上げられるのはフォーカスを受ける要素の状態なので、その要素を確認してください。
修正の確認
5つの確認
確認方法: キーボード、スクリーンリーダー、強制配色、マウス
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のスイッチコンポーネントを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。switchの役割の読み上げ方はスクリーンリーダーによって異なり、古いものではチェックボックスやトグルボタンとして読み上げることがあります。CSSは最小限の例なので、フォーカス表示と枠のコントラストを実際の配色で確認してください。使用する支援技術で、設定の操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。