トピックを検索
操作するだけでページが変わるドロップダウンと入力欄
並べ替えのメニューは値が変わった時点でページを読み込み直し、日付の入力欄はフォーカスを受けた瞬間にカレンダーへフォーカスを移します。
<select onchange="this.form.submit()"> 問題
キーボードやスクリーンリーダーの利用者が、何も選んでいないうちに別のページへ移されたり、先へ進まされたりします。
文房具店のペンの一覧に「並べ替え」のメニューがあります。キーボードの利用者がTabキーでメニューへ移動し、ほかの並べ方を確かめようと下矢印キーを押します。Windowsでは、閉じたselectの値が矢印キーですぐに変わり、多くのブラウザーがその場で change を発生させます。そのため、ページは二つ目の並べ方で読み込み直され、フォーカスはページの先頭に戻ります。三つ目の並べ方を試すには、もう一度Tabキーでメニューまで移動する必要があり、矢印キーを押すたびに先頭へ戻されます。
同じ店の購入手続きには、カレンダー付きの配達日の入力欄があります。この欄にフォーカスが移ると、すぐにカレンダーが開き、スクリプトが最初の日付へフォーカスを移します。日付を入力することはできず、Shift + Tabキーで戻ると再びこの欄に着き、またカレンダーへ送られます。
WCAGでは、新しいページ、新しいウィンドウ、別の場所へのフォーカスの移動、ページの意味が変わるほどの内容の入れ替えを「コンテキストの変化」と呼びます。達成基準3.2.2「入力時」は、事前に知らせていない限り、値の変更でコンテキストの変化を起こしてはならないとしています。達成基準3.2.1「フォーカス時」はさらに厳しく、フォーカスを受けただけでコンテキストの変化を起こすことを、例外なく禁じています。並べ替えのメニューは入力時にページを読み込み直し、日付の入力欄はフォーカス時にフォーカスを移しています。
マウスではリストを開いて一度のクリックで選ぶため、マウスの利用者はほとんど気づきません。ページを一歩ずつ移動して使うすべての人に起きる問題です。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 手の操作が限られる キーボードやスイッチの利用者は選択肢を一つずつたどって選ぶため、最初の一歩でページが読み込み直されます。フォーカスを先へ飛ばす入力欄には、Shift + Tabキーで戻れません。
- 視覚を使わない スクリーンリーダーの利用者は矢印キーでselectの選択肢を確認しますが、その途中で新しいページが先頭から読み上げられ、理由は何も伝わりません。
- 視覚が限られる selectを拡大して見ている画面拡大ソフトの利用者は、読み込み直しでページの先頭に戻され、元の場所を探し直す必要があります。
- 言語・認知・学習の能力が限られる 何も押していないのにページが変わると、何が起きたか分かりにくく、選択が適用されたことや元に戻す方法に気づけないことがあります。
マークアップは正しく、どの要素にもラベルがあるため、axeなどの自動チェックは何も報告しません。問題は focus や change で動くスクリプトの中にあり、実際にキーを押したときにだけ現れます。マウスでselectをクリックするチェックでは、一つを選んだ結果の読み込み直しが、意図どおりの動作に見えます。「selectでページを更新して」とAIに頼むと、下のような onchange のハンドラーがそのまま書かれがちです。
試してみる
キーボードで欄を操作し、フォーカスの行き先を見てください。
「問題1」では「並べ替え」で↓キーを押し、フォーカスの行き先を見てください。「問題2」では「配達日」までTabキーで移動し、Shift + Tabキーで「名前」へ戻ってみてください。
問題あり 修正できますか?
ペン
- ファインライナー
- ゲルペン
- 筆ペン
- 万年筆
Tabキーで「並べ替え」まで移動し、↓キーを押してください。
フォーカスの位置: まだページの外
修正方法
ボタンを待つか、フォーカスをそのままにして、その場で変更します。
- 1フォーカスを受けただけで、フォーカスの移動、新しいウィンドウ、ページの移動を起こさない。
- 2値の変更でページを変えるのは、ボタンを押した後か、要素にフォーカスを残したままその場で変えるときだけにする。
- 3変わった内容は、変更した要素のそばに表示する。
値が変わると読み込み直す並べ替えメニュー
<form action="/pens" method="get"> <label for="sort">Sort by</label> <select id="sort" name="sort" onchange="this.form.submit()"> <option value="popular">Most popular</option> <option value="name">Name, A to Z</option> <option value="new">Newest</option> </select></form>選択を適用するボタン
<form action="/pens" method="get"> <label for="sort">Sort by</label> <select id="sort" name="sort"> <option value="popular">Most popular</option> <option value="name">Name, A to Z</option> <option value="new">Newest</option> </select> <button type="submit">Sort</button></form> <label for="date">Delivery date</label><p id="date-format">For example, 2026-12-14</p><input id="date" name="date" aria-describedby="date-format"><button type="button" id="date-button" aria-expanded="false" aria-controls="calendar">Choose date</button>値が変わるたびにフォームを送信しますが、キーボードでは矢印キーを押すたびに値が変わります。読み込み直しで、フォーカスはページの先頭に戻ります。
selectも入力欄も、それだけでは何も起こしません。ページが読み込み直されるのは「Sort」を押したとき、カレンダーが開いてフォーカスを受け取るのは「Choose date」を押したときで、どちらも利用者が求めた変化です。入力欄には日付を直接入力できるため、カレンダーは補助であり、唯一の手段ではありません。日付を選ぶと欄に入り、日付を選ぶかEscapeキーを押すとカレンダーが閉じて、フォーカスは「Choose date」に戻ります。
どちらも両方の達成基準を満たします。ボタンは最も小さな変更で、JavaScriptなしでも動き、カテゴリーや地域のように新しいページを読み込む必要がある選択に向いています。代わりに、Tabの移動先と押す操作が一つずつ増えます。その場での変更は、その一押しが不要で速く感じられますが、フォーカスを動かさずスクロールもさせずに描き直すスクリプトと、ステータスメッセージが必要です。選択の結果が別のページになるときはボタンを、ページ自身で選択を反映できるときはその場での変更を使ってください。
事前に知らせる方法(「並べ方を選ぶとページが読み込み直されます」)で、並べ替えのメニューは3.2.2を満たします。しかし、3.2.1にはこの例外がないため、日付の入力欄には使えません。キーボードの利用者が最初にたどった選択肢で移動させられることも変わらないため、変更できない部品に対する最後の手段と考えてください。
次のようなものはコンテキストの変化ではなく、ボタンは不要です。
- フォーカス時に表示するツールチップやヒント:要素のそばに内容が加わるだけで、フォーカスは動かない。
- チェックを入れると表示される欄(別の請求先住所など):内容が要素の後に表示され、フォーカスは要素に残る。
- 検索欄への入力に合わせて絞り込まれる一覧:ページは変わらず、フォーカスも欄に残る。
分割した入力欄の自動移動も避けてください。一つの欄が埋まると次の欄へフォーカスを移すのは入力時のコンテキストの変化で、入力内容を確かめる人や数字を直す人を驚かせます。値全体を一つの欄で受け取れば、この問題は起きません。
コンポーネントライブラリーの日付選択がフォーカス時に開く場合は、ボタンから開くオプションを探すか、欄にフォーカスが残るように包んでください。1か月分のカレンダーは、30個のTab移動先にせず、APGの日付選択ダイアログのように、一つのTab移動先の中を矢印キーで移動する形にします。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない5つの確認
確認方法: キーボード、スクリーンリーダー、ズーム
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のフォームや絞り込みのコンポーネントを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。キーボード操作で change が発生するタイミングはブラウザーによって異なり、macOSでは矢印キーでリストが開き、確定したときに値が変わります。利用者が使う環境と、サイトで実際に使っているコンポーネントで確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。