トピックを検索
読む前や元に戻す前に消えるトースト
「メッセージを削除しました」のトーストにしか「元に戻す」がなく、4秒で自動的に消えるため、たどり着くのが遅い人は操作の機会を失います。
問題
読む、動かす、探すのに時間がかかる人は、削除を取り消す唯一の手段を失います。それを持つトーストが4秒で自動的に消えるためです。
受信トレイにメッセージが並び、それぞれに「削除」ボタンがあります。削除を押すと行が消え、画面の下の隅に暗い色のトーストが出ます。「メッセージを削除しました。元に戻す」。4秒後にトーストはすっと消え、メッセージは完全に削除されます。ゴミ箱はありません。マウスを使う、画面が見える人は、間違えて削除してもトーストに気づき、時間内に「元に戻す」を押せます。それ以外の人は、急ぐしかありません。
トーストは読み上げられてもいます。常にページにある role="status" のコンテナーに追加されるため、スクリーンリーダーは「メッセージを削除しました、元に戻す」と読みます。問題は聞こえないことではなく、待ってくれないことです。
達成基準2.2.1「タイミング調整可能」は、コンテンツが設定する時間制限すべてを対象にしています。一定時間後にひとりでに変わったり消えたりするものは、時間制限です。W3CのUnderstanding文書は、まさにこの例を挙げています。5秒で消えるメールの通知は、受信トレイを見るなど同じ情報を別の方法で得られれば問題になりません。しかし、ほかに手段がない場合、時間で消えるメッセージはこの基準を満たす必要があります。この例では、トーストが唯一の「元に戻す」を持っています。満たすには、制限に出会う前にそれを解除できるか、既定の10倍以上に延ばせるか、終了前に警告して20秒以上の猶予で延長できる必要があります。どれもないため、この操作には4秒の締め切りがあります。
トーストは聞こえる必要もあります。達成基準4.1.3は、「メッセージを削除しました」のようなステータスメッセージを、フォーカスを動かさずに支援技術へ伝えることを求めています。このトーストはそれを満たしていますが、伝えた対象が操作する前に消えてしまえば、読み上げは役に立ちません。
4秒が長いか短いかは、ページの使い方によって変わります。メッセージを読み、間違いだったと判断し、ボタンまで移動するには、どれも時間がかかります。そして、時間がより必要な人ほど、トーストそのものに気づきにくいのです。スマートフォンでは、トーストが一覧の下の部分を覆うことも多く、消えるのを待ってから作業を続ける人もいます。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 視覚を使わない スクリーンリーダーの利用者には「メッセージを削除しました、元に戻す」が聞こえますが、トーストまで移動したときには消えています。消えたことも伝わりません。
- 手の操作が限られる キーボードやスイッチの利用者は、ページの最後のトーストに届くまで、一覧の残りをTabで通過する必要があり、4秒ではまず足りません。
- 視覚が限られる 一覧を拡大している画面拡大ソフトの利用者には、隅のトーストが見えず、移動して見に行く前に消えてしまいます。
- 言語・認知・学習の能力が限られる 読むのに、または削除するつもりだったかを考えるのに時間がかかる人は、メッセージを読んでいる間に選択肢を失います。
スキャンは role="status" のコンテナー、名前のあるボタン、十分なコントラストを見て、すべて合格にします。タイマーはスクリプトの中にあり、ツールが調べるころにはトーストはたいてい消えています。トーストが出ていないページを調べても、何も見つかりません。AIアシスタントやコンポーネントライブラリーは、数秒で閉じるトーストを既定にしがちで、その中に「元に戻す」を入れることもよくあります。このパターンはそう描かれるのが普通だからです。「ホバー中は一時停止」を加える例もありますが、もともと間に合っていたマウスの利用者にしか効きません。キーボード、スクリーンリーダー、画面拡大ソフトで、時間をかけて実際に削除してみて、初めて分かります。
試してみる
メッセージを削除してから、元に戻してみてください。
TabキーとEnterキーで、ゆっくり操作してください。それでも「元に戻す」に届きますか?
問題あり 修正できますか?
- 金曜日のランチ
- 3月の請求書
- チームの写真
- 週次レポート
スクリーンリーダーの読み上げ: (メッセージを削除してください)
再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。
修正方法
利用者が必要とするかもしれない操作は、使い終わるまで残すか、残り続ける場所にも置きます。
- 1何かをする唯一の手段を持つメッセージは消さない。閉じられるまで残すか、その操作を残り続ける場所にも置く。
- 2メッセージは、もともとあるステータス領域から伝えるか、押した操作部品が消えた場合はその操作へフォーカスを移して伝える。
- 3ポインターが乗っている間やフォーカスがある間は、メッセージを消さない。
<ul id="inbox"> <li>金曜日のランチ <button type="button" class="delete">削除</button></li> <!-- … --></ul><div id="toasts" class="toasts" role="status"></div>メッセージを取り戻す唯一の手段が、4秒で消えるトーストの中にあります。その時間を解除する、延ばす、延長する方法もありません。読む、動かす、トーストを見つけるのが遅い人にとっては、「元に戻す」はもう消えています。
トーストの見た目と読み上げはそのままですが、タイマーでは消えません。「元に戻す」か「閉じる」を押したとき、または次のトーストに置き換わったときに消えます。利用者は必要なだけ時間をかけて、読み、Tabで移動し、判断できます。トーストのコンテナーがDOMのどこにあるかが重要です。キーボードの利用者はTabでたどり着くため、ページの最後ではなく、伝える内容の直後に置きます。残っている間、一覧を覆わないようにもします。
どちらも2.2.1を満たし、メッセージの読み上げも保たれます。どれが合うかは、削除がどこで起きるかで決まります。並びが変わらない一覧の1行なら、項目のあった場所に「元に戻す」を置きます。フォーカスがすでにそこにあり、ページの上に何も浮かばず、Tabで探す必要もありません。そうした場所がない場合、たとえば一括削除、並べ替えやページ送りのある一覧、項目自体のページからの削除では、閉じるまで残るトーストを使います。すでにメッセージをトーストで表示しているサイトにとっては、最も手早い変更でもあります。多くのサイトでは両方を使うことになるでしょう。
ホバーやフォーカスでの一時停止だけでは足りません。 トーストに届いた時点でタイマーを止めるだけなので、間に合った人にしか効きません。それでも、タイマーが残るトーストでは必ず行ってください。ポインターが乗っている間やフォーカスが中にある間に、何かが消えてはいけません。
ゴミ箱があれば、トーストを時間で消せます。 削除した項目を「復元」できるゴミ箱にすでに残しているサイトなら、自動で閉じるトーストも2.2.1を満たします。同じ操作を別の方法でできるためで、W3Cが挙げている場合に当たります。トーストではどこへ移したか(「ゴミ箱に移動しました」)を伝え、ポインターやフォーカスが届いたらタイマーを止めます。間に合わなかった人は、ボタン1回で済む復元に何手順もかけることになります。タイマーを残すためだけにゴミ箱を作るのはやめましょう。
設定でも満たせますが、見つけてもらえれば、です。 2.2.1は、制限に出会う前に解除できる方法や、10倍以上に延ばせる方法も認めています。アカウント設定の「通知を閉じるまで表示する」などです。ほとんどの人はその設定を目にしないため、ほかの理由で時間で消えるトーストを残すサイト向けで、主な修正には向きません。
操作のないトースト。 「設定を保存しました」には操作がなく、保存された状態がページで見えるなら、消えても何も失われません。それでも読める時間は表示し、失敗など対応が必要な内容は、残り続ける場所に出します。
削除が実際に行われるとき。 元の場所の「元に戻す」も、残るトーストも、削除を保留にしています。タイマーではなく、利用者の次の操作か、ページを離れたときに確定させます。サーバーの状態も正しく保ちます。すぐに削除を送って「元に戻す」で復元を呼ぶか、確定したときに削除を送るかのどちらかです。タブを閉じると作業が失われるおそれがあるなら、前者のほうが安全です。
フォーカスの行き先。 押した操作部品が消えたら、フォーカスを移す必要があります。そのままにするとbodyに落ち、キーボードの利用者はページの先頭からやり直すことになります。行の代わりに現れた「元に戻す」へフォーカスを移すのは自然です。ほかの作業の途中で、ページの端のトーストへフォーカスを移すのはそうではありません。それは、利用者が答える必要のあるメッセージに限ります。
トーストが重なる場合。 残り続けるトーストが積み重なると、ページを覆います。残るトーストの修正のように前のトーストを次のトーストで置き換えるか、数に上限を設けて「すべて閉じる」を用意します。
修正にならないもの。 role="alert" や aria-live="assertive" にすれば早く読み上げられますが、操作できる時間は変わらず、スクリーンリーダーが読んでいた内容を遮ります。10秒などに延ばしても固定の制限であることに変わりはなく、間に合わない人がいます。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない4つの確認
確認方法: スクリーンリーダー、キーボード、ズーム
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。トーストのコンポーネントや削除の流れを変更した際は、再度確認します。
制限
ここで扱うのは、元に戻せる操作の確認という一種類のメッセージです。エラー、答えが必要なアラート、ほかの人からの通知は、それぞれ別のトピックです。読み上げそのものが届くかどうかも別のトピックです(「画面に出ても読み上げられないステータスメッセージ」を参照)。ライブリージョンとフォーカスの動きは、スクリーンリーダーやブラウザーによって異なります。利用者が実際に作業する速さで、実際のメッセージを確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。