トピックを検索
長押しや時間内の2回押しが必要なボタン
保存したリストが、Enterを1.5秒押し続けるか、3秒以内にもう一度押したときだけ削除されるため、スイッチ、音声入力、スクリーンリーダーが送る1回の短い押下では何も起きません。
setTimeout(deleteList, 1500) 問題
スイッチ、音声入力、スクリーンキーボード、スクリーンリーダーが短い押下を1回だけ送る人はリストを削除できず、ゆっくり押す人は時間切れになります。
ショップのアカウントページに、顧客が保存したリストが並んでいます。たとえば14アイテムの「キッチンのアイデア」で、それぞれに削除する方法があります。デザイナーは、ダイアログを挟まずに、削除の前にひと呼吸置いてほしいと考えました。そこでボタンには「長押しで削除」と書かれています。マウス、指、Enter、Spaceのどれかで押し続けると、ボタンの中をゲージが進み、1.5秒たつ前に離すとゲージが戻ります。同じ考えのもう一つの形は、普通の「リストを削除」ボタンです。1回押すと「もう一度押して削除」に変わり、3秒たつと元に戻ります。
どちらもキーボードで動きます。ただし、手とキーボードがタイミングを合わせられる場合だけです。スイッチの押下、「Enterを押す」という音声のコマンド、スクリーンキーボードのタップは、どれも押してすぐ離す1回の押下として届きます。ゲージは進んだ瞬間に戻り、リストは残ります。時間内にもう一度押すには、3秒以内にボタンへもう一度届く必要がありますが、スイッチのスキャンや音声のコマンドでは、間に合わないことがあります。
達成基準2.1.1は、すべての機能を「個々のキーストロークに特定のタイミングを要することなく」キーボードで操作できることを求めています。解説書は、このタイミングの例を2つ挙げています。短い時間のうちにキーを繰り返し押したり、続けて押したりする必要があるもの、そしてキーストロークとして受け付けられる前に、キーを長く押し続ける必要があるものです。長押しのボタンは2つ目に、「もう一度押す」ボタンは1つ目に当たります。どちらもキーボードの操作を受け付けていますが、それでも基準を満たしません。削除する方法が、時間内に押すことしかないためです。
時間を緩めても結果は変わりません。短い長押しも、長い待ち時間も、間に合わない人がいるタイミングであることに変わりはありません。基準を満たすには、キーストロークから時間の条件をなくします。
この問題はテストではほとんど表に出ません。ページを作ってテストする人は、タイマーが想定するとおりにキーを押すためです。表に出るのは、「何も削除できない」という顧客と、消したはずのリストが並んだアカウントです。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響なし)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響あり)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 手の操作が限られる スイッチの押下、「Enterを押す」という音声のコマンド、スクリーンキーボードのタップは、どれも押してすぐ離す1回の押下として届くため、ゲージは満ちません。スキャンや音声のコマンドでボタンにもう一度届くまでに、3秒以上かかることもあります。
- 届く範囲・力が限られる 手のふるえや筋力の低下がある人は、キーを1.5秒押し続ける間に指が外れることがあります。押し間違いを防ぐバウンスキーを使っている人は、2回目が早すぎると無視されます。
- 視覚を使わない ブラウズモードのスクリーンリーダーは、ボタンを1回のクリックで押すため、ゲージは満ちません。「もう一度押して削除」への変化も、3秒が過ぎる前に読み上げられるとは限りません。
- 言語・認知・学習の能力が限られる どれだけ押し続けるのか、どれだけ早くもう一度押すのかがどこにも書かれておらず、ボタンが勝手に元に戻るため、読もうと手を止めた人は、何か起きたのかどうか分からなくなります。
ボタンは名前が見えるHTML標準のボタンなので、自動チェックでは問題が見つかりません。Enterを押すスクリプトにとっては、何も起きないボタンであり、別の何かを待っているボタンとの区別がつきません。そもそも、本番のサイトで削除のボタンを押すテストは、診断では実行できません。そこでEaseWebの診断は、ページの言葉を読みます。操作要素の近くにある「Hold to」「press and hold」「press again to」や「長押し」は、確認の対象として報告します。言葉のない長押しや、1回目を押した後にだけ現れる「もう一度押して」は、どのチェックも見つけられません。AIのコーディングツールは、長押しで確定するボタンを頼まれれば作り、キーボードで動くようにkeydownとkeyupのハンドラーも加えますが、そこで終わることがあります。2.1.1のタイミングの部分は、見落としやすいほうです。
試してみる
Tabで「キッチンのアイデア」の下のボタンへ移動し、スイッチや音声入力と同じように、Enterを1回すばやく押してください。
次に、自分のペースでリストを削除してみてください。リストの下の欄に、キーを押していた時間や、もう一度押すまでの残り時間が出ます。
問題あり 修正できますか?
保存したリスト
キッチンのアイデア
14アイテム
ゲストルーム
6アイテム
直前の押下:まだありません
修正方法
1回押せば、待ってくれる確認が開くか、残り続ける「元に戻す」付きで削除されるようにします。
- 1キーを決まった時間押し続けることや、時間内にもう一度押すことを、操作の条件にしない。
- 2EnterかSpaceを1回すばやく押せば、すべての操作か、待ってくれる確認に届く。
- 3削除した後や元に戻した後は、ページに残っている要素にフォーカスを移す。
押し続けている間だけ削除できるボタン
<h2>保存したリスト</h2><ul> <li> <h3>キッチンのアイデア</h3> <p>14アイテム</p> <button type="button" id="delete-list" class="hold"> <span class="hold-fill" aria-hidden="true"></span> 長押しで削除 </button> </li> …</ul>1回押すと、待ってくれる確認が開く
<h2 id="lists-heading" tabindex="-1">保存したリスト</h2><ul> <li id="list-kitchen"> <h3>キッチンのアイデア</h3> <p>14アイテム</p> <button type="button" id="delete-list">リストを削除</button> </li> …</ul> <dialog id="confirm-delete" role="alertdialog" aria-labelledby="confirm-title" aria-describedby="confirm-message"> <form method="dialog"> <h2 id="confirm-title">「キッチンのアイデア」を削除しますか?</h2> <p id="confirm-message">リストと、保存した14アイテムが削除されます。</p> <button value="keep" autofocus>リストを残す</button> <button value="delete">リストを削除</button> </form></dialog>削除するには、キーかポインターを1.5秒押し続けるしかありません。1回すばやく押すと、タイマーが始まってすぐに止まり、ブラウズモードのスクリーンリーダーが送るクリックも、同じようにすぐ終わるか、タイマーを始めもしません。
長押しで作ろうとしたひと呼吸が、質問になり、その人に必要なだけ待ちます。クリック、タップ、Enter、Spaceのどれか1回で開き、もう1回押せば答えられます。フォーカスは「リストを残す」から始まるため、繰り返された押下ではリストが残ります。リストを削除した後は、フォーカスがページのbodyに落ちず、リストの上の見出しに移ります。質問そのものを読み上げさせる方法は、質問が読み上げられない確認ダイアログで扱っています。
どちらも2.1.1を満たし、どちらも誰にもタイミングを合わせることを求めません。確認は、削除のたびに1回多く押す必要がありますが、サーバー側の変更は要らず、間違いを起きる前に止めます。削除したものを元に戻せない場合は、こちらを選んでください。「元に戻す」は削除を1回の押下のまま保つため、よく整理する人や、1回押すだけでも負担になる人に向いていますが、サーバーがリストを戻せる場合にしか使えません。削除が多く、元に戻せる場合に選んでください。どちらの場合も、マウスや指での長押しは、好む人のための近道として残せます。ただし、クリック、タップ、Enter、Spaceだけで、操作全体が済むことが条件です。その長押しは、指やボタンを離したときに完了し、外へずらすと取り消せるようにします。詳しくは押した瞬間に実行され、キャンセルできないボタンを参照してください。
操作要素にはHTML標準の button を使い、自分でキーのハンドラーを書かなくてもEnterとSpaceで動くようにします。また、ボタン自体のフォーカスリングを付けてください。長押しのボタンの中を進むゲージは、フォーカスの表示ではありません。div で作った操作要素は、別の形で2.1.1を満たしません。詳しくはTabキーで到達できないdivのボタンを、リングがない場合はフォーカス表示が見えない独自デザインのボタンを参照してください。
修正前のコードを、数字を変えて直そうとしないでください。0.5秒の長押しも押し続ける必要があり、10秒の待ち時間もいずれ終わります。keydown、pointerdown、1回目のクリックで始まるタイマーをすべて数え、どれも人と操作の間に立っていないことを確かめます。
同じ問題は、削除のボタン以外の形でも現れます。どれにも、1回押すだけの方法があります。
- 長押しで音声メッセージを録音する:1回押すと録音が始まり、もう1回押すと止まるようにし、録音した時間を示す「停止」ボタンを置きます。
- 通話中にSpaceを押している間だけ話せる:押すたびに切り替わる「ミュート」ボタンを置き、Spaceの長押しは好む人のための追加の方法として残します。フォーカスのある操作部品だけでなく、ページのどこでも反応するSpaceは、オフにできない1文字のショートカットと同じように音声入力や文字入力の邪魔になるため、オフにもできるようにします。
- 目のアイコンやShiftを押している間だけパスワードを表示する:もう一度押すまで表示が続く「パスワードを表示」ボタンにし、
aria-pressedでどちらの状態かを伝えます。 - Escapeを2回押すとエディターが閉じる:1回のEscapeで閉じるようにし、保存していない内容が失われる場合は、先に待ってくれる確認を出します。
キーの組み合わせは、タイミングを求める押下ではありません。Ctrl + Kは1つの組み合わせとして押し、固定キー機能を使えば1つずつ順に押せます。決まった時間押し続けるものはありません。セッションの時間切れなど、作業全体にかかる時間の制限は、この基準ではなく、2.2.1「タイミング調整可能」の対象です。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得、または全ガイドをコーディングエージェントで使う。
修正の確認
マウスを使わない5つの確認
確認方法: キーボード、音声入力、スクリーンリーダー
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のボタンやリストのコンポーネントを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。サーバーとのやりとりと、複数のリストの中の元の位置にリストを戻す処理は省略しています。マウスや指での長押しと、長押しで開くメニューについては、ポインター側から右クリックや長押し、スワイプでしか出ない操作メニューで扱っています。キーボード、スイッチ、音声入力、実際に使用する支援技術で、操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。