フィードバック
pattern保存できた・送れなかった・メンテナンスがある、といったシステムから利用者への知らせの出し方です。部品は インラインメッセージ・アラート・モーダル・入力欄のエラー(field-error-text)をそのまま使い、このページではどの知らせを・どこに・どの色で出すかを決めます。画面の隅に出て数秒で消えるトースト/スナックバーは意図的に用意していません(トーストを用意しない理由)。
3 つの原則
知らせが届かない典型は「見ていない場所に出た」「読む前に消えた」「読み上げられなかった」の 3 つです。原則はその裏返しです。
1. 操作した場所に置く
利用者の視線は押したボタンや入力欄にある。知らせはその視野の中、DOM 上もその要素の直後に置く。拡大表示や読み上げでも「何の結果か」がつながる。
2. 利用者のペースで消える
時間で勝手に消さない。消えるのは次の操作をしたとき、または利用者が閉じたとき。読むのに時間がかかる人、画面から目を離していた人にも届く。
3. 色に頼らず、読み上げにも伝える
アイコン+文言で意味を運び、色と文言を一致させる。あとから出す知らせは role="status"/role="alert" でフォーカスを奪わずに読み上げる。
知らせの種類
知らせは、きっかけによって 3 種類に分かれます。まず種類を決めると、使う部品が決まります。
| 種類 | 例 | 使うもの |
|---|---|---|
| システムからのお知らせ 利用者の操作と関係なく出す |
メンテナンスの予定 / 規約の変更 / アカウントの制限 | ページ上部の アラート。対応が済むまで閉じられないものもある |
| 操作の結果 保存・送信・削除などへの返答 |
保存しました / 送れませんでした / 5 MB を超えています | 操作した場所の直近に インラインメッセージ。入力の誤りは入力欄の真下の field-error-text(3 件以上ならフォームの上に アラート でまとめる) |
| 案内 操作と関係なく役立つこと |
新しい機能が使えます / 下書きが残っています | 次の行動を勧めるならページ上部の アラート(info)、ちょっとしたヒントなら該当箇所の インラインメッセージ(neutral) |
色(テーマ)の選び方
色は知らせの内容で選びます。見た目の強さで選ばないでください。色だけでは意味が伝わらないため、どのテーマも専用のアイコンと文言がセットです。
info — 今の画面に関わる大事な情報、次の行動の提案
新しい機能のお知らせ、仕様の変更、もっと便利な使い方。インラインメッセージでは neutral を使う。
success — 操作が終わった
控えめに使う。画面の変化で結果が分かるなら出さない(成功を知らせるかの決め方)。
warning — このままだと困ることが起きる
期限が近い、一部の機能が制限される、元に戻せない操作の前。何が起きるかと、避ける方法を書く。
negative — 失敗した・直す必要がある
保存・送信の失敗、入力の誤り。何が起きたかと、次に何をすればよいかを書く。
neutral — 使えない・見られない
権限がない、一部のデータを読み込めなかった、機能を一時的に止めている。使えない理由と、使えるようにする方法(誰に頼むか)を書く。
置き場所
置き場所は、知らせが何に関わるかで決まります。迷ったら、利用者が操作した場所に近い方を選びます。
| 置き場所 | 使うとき |
|---|---|
| ページ・セクションの上部 | ページ全体やセクション全体に関わる知らせ。いちばん多い置き場所。アラートは本文の幅に合わせ、ヘッダーの直下に画面の端から端まで貼り付けない |
| 操作した場所の直近 | 1 つの操作・1 つの入力欄に関わる知らせ。ボタンの横・フォームの直下・表の行内に インラインメッセージ、入力欄の真下に field-error-text |
| モーダルの中 | モーダルの中の操作の結果。本文(modal-body)の先頭にアラートを置く。モーダルを閉じてページ側に出さない |
操作した場所から離れた所に出してよいのは、そこへフォーカスを移すときだけです。視線も読み上げも知らせへ移るので、見逃されません。
- 送信してエラーが 3 件以上 — フォームの上にアラート(negative)でまとめを出し、まとめへフォーカスを移す。各入力欄の真下のエラーもそのまま出す(まとめだけにしない)。1〜2 件なら、まとめは出さず最初のエラーの入力欄へフォーカスを移す(フォームの検証とエラー)
- 作業を止めて判断を求めるとき — モーダルでフォーカスを預かり、閉じたら呼び出し元へ戻す
それ以外で、フォーカスを移さずに離れた所へ出すのはやめます(下の Don't)。
操作した場所の近くに置く
押したボタンのすぐ横に出るので、視線を動かさずに結果が分かる。
保存しました
1 つの操作の結果を、フォーカスを移さずにページの上部に出すと、ボタンを見ている利用者は気づかない。長いページでは画面の外に出てしまう。
モーダルの中の操作の結果は、モーダルの中に出す
メンバーを招待する
招待メールを送れませんでした
通信を確かめて、もう一度送ってください。
入力した内容を残したまま、その場でやり直せる。
招待メールを送れませんでした
もう一度「メンバーを招待する」から送ってください。
モーダルを閉じてページの上部に出すと、入力した内容が消え、最初から入れ直すことになる。
成功を知らせるかの決め方
成功の知らせは控えめに使います。結果が画面を見て分かるなら、メッセージを足しても騒がしくなるだけです。上から順に当てはめます。
| 問い | はい | いいえ |
|---|---|---|
| 1. 結果が画面を見れば分かるか チェックが入った・行が増えた・並び順が変わった |
メッセージは出さない。ただし変わった状態は読み上げにも伝える(aria-pressed・件数の aria-live など) |
2 へ |
| 2. 保存・送信ボタンの結果か | 3 へ | 結果が関わる場所にインラインメッセージかアラートを出す。作ったものがあれば、そこへのリンクを添える |
| 3. 押すと別のページへ移るか | 移った先の上部にアラート(success)。移った先の内容で結果が分かる(作った案件の詳細が開く等)なら出さない | ボタンのすぐ横にインラインメッセージ(success) |
失敗の伝え方の決め方
失敗は必ず伝えます。どの部品でも、何が起きたかと次に何をすればよいか(直す・もう一度・時間をおく・問い合わせる)を書きます。原因が分からない失敗でも、次の手は書けます。上から順に当てはめます。
| 問い | はい | いいえ |
|---|---|---|
| 1. 入力内容の誤りか | フォームのエラーの伝え方に従う(入力欄の真下に field-error-text、3 件以上はフォームの上にまとめ) | 2 へ |
| 2. モーダルの中の操作か | モーダルの本文の先頭にアラート(negative)。モーダルは閉じず、入力も消さない | 3 へ |
| 3. このままでは作業を続けられないか ログインが切れた・ほかの人が先に更新した |
モーダルで操作を止め、次の手(ログインし直す・最新を読み込む)を選んでもらう | 4 へ |
| 4. 1 つの操作の失敗か | 操作した場所の直近にインラインメッセージ(negative) | ページやセクション全体に関わる失敗(一覧を読み込めない等)は、その上部にアラート(negative) |
行き先の早見表
ここまでをまとめると、知らせの行き先は次の 5 つです。迷ったら「出さない」と「操作した場所の直近」に寄せます。
| 状況 | 使うもの | 置き場所と消え方 | 読み上げ |
|---|---|---|---|
| 結果が画面を見れば分かる単純な成功 | 出さない | 画面の変化そのものが知らせ | 状態の変化を aria-* で |
| 1 つの操作の結果 | inline-message | ボタンの横・フォームの直下・行内。次の操作まで残る | role="status" / role="alert" |
| 1 つの入力欄の誤り | field-error-text | 入力欄の真下。直すまで残る | aria-describedby + aria-invalid |
| ページ・セクション・モーダル全体に関わる知らせ | alert | ページ・セクション・モーダル本文の上部。利用者が閉じるか、対応が済むまで残る | role="status" / role="alert" |
| 操作を止めて判断を求める確認・失敗 | modal | 最前面。選ぶまで閉じない。閉じたらフォーカスを呼び出し元へ戻す | <dialog> + aria-labelledby |
トースト/スナックバーを用意しない理由
画面の隅に固定して数秒で消える通知は、Material Design ではスナックバー、Android ではトーストと呼ばれ、Web でも広く使われています。relay はこれをコンポーネントとして用意しません。仕様そのものが次の達成基準とぶつかり、DS で作ると違反の入口を配ることになるからです。
| 達成基準(WCAG 2.2) | トーストで起きること | relay の置き方で解けること |
|---|---|---|
| 2.2.1 タイミング調整可能 | 数秒で消えるため、読むのに時間がかかる人・目を離していた人は内容を知れない | 次の操作まで残す。時間制限を作らない |
| 1.3.2 意味のある順序 | DOM の末尾に入るので、読み上げの順では「どの操作の結果か」が切れる | 操作した要素の直後に入れ、見た目と読み上げの順を一致させる |
| 2.4.3 フォーカス順序 ・ 2.1.1 キーボード | ボタン付きのトーストは、消える前にキーボードで届きにくい。届かせるためにフォーカスを飛ばすと作業が中断される | 操作の直近にあるので Tab 1 回で届く。判断が要るならモーダルでフォーカスを預かり、閉じたら戻す |
| 4.1.3 ステータスメッセージ | 読み上げは aria-live でできるが、消えたあとに聞き返せない |
残っているので、いつでも読み直せる |
| 1.4.10 リフロー ・ 1.4.4 テキストのサイズ変更 | 画面の隅に固定されるため、拡大して操作対象を見ている利用者の視野に入らない。拡大すると本文を覆う | 操作対象と同じ視野に置くので、拡大しても一緒に見える |
- 見逃される — 隅に出る小さな通知は、繰り返し見るうちに広告のように無視される。本当に伝えるべき失敗も同じように流れる
- 誤って閉じる — スワイプや近くのタップで消える。「元に戻す」を載せると、消えた時点で取り消す機会もなくなる
- 重さが混ざる — 成功も失敗も同じ位置・同じ見た目で流れ、重大な失敗が「いつもの通知」に埋もれる
- 振る舞いがそろわない — 表示時間・重ね方・ボタン・閉じるの有無がプロダクトごとに揺れ、見た目をそろえても使い心地がそろわない
「それでもトーストが要る」と思ったときの読み替え
| やりたかったこと | 読み替え |
|---|---|
| 保存・送信の成功を知らせたい | 結果が画面で分かるなら出さない。分からないなら「保存する」の横にインラインメッセージ(success)を残す |
| 通信の失敗を知らせたい | 操作した場所にインラインメッセージ(negative・role="alert")。ログインし直す必要があるならモーダルで止める |
| 「元に戻す」を数秒だけ出したい | 取り消しを時間制限つきにしない。削除の前にモーダルで確かめるか、削除の後にアラートで「元に戻す」を残す |
| 別のページへ移った後に結果を知らせたい | 移った先の上部にアラート(success)を置き、利用者が閉じるまで残す |
| 時間のかかる処理の完了を知らせたい | 処理中は操作した場所で進み具合を示し、完了も同じ場所にインラインメッセージか、一覧なら該当の行の状態で示す。画面を離れるほど長いならメールなど画面の外の手段も考える |
| 一度に複数の結果を知らせたい | 重ねて出さない。それぞれの操作の直近に置くか、ページ上部のアラートにまとめて箇条書きにする |
アクセシビリティ
部品を選んだあと、プロダクト側で確かめる項目です。各コンポーネントの「アクセシビリティ」タブと MCP get_component の同じ名前の節にも同じ内容があります。
置き場所と順序
- !操作した要素の直後に、見た目の上でも DOM の上でも入れている
- !
position: fixedで画面の隅に固定していない - !フォーカスを動かしていない(モーダルと、3 件以上のエラーのまとめを除く)
- !400% に拡大しても、操作対象と知らせが同じ視野に入る
消え方
- !
setTimeoutなどで自動で消していない - !消えるのは次の操作か、利用者の操作(閉じる・直す・送り直す)のとき
- !閉じるボタンには
aria-label="閉じる"があり、キーボードで届く - !取り消し(元に戻す)に時間制限を付けていない
読み上げ
- !あとから出す知らせに
role="status"(成功・情報)/role="alert"(失敗・注意)がある - !ライブリージョンは空の状態で先に置くか、
roleを持つ要素として入れている(あとからroleだけ付けても読み上げられない) - !同じ内容を短い間に何度も入れていない(読み上げが続く)
- !知らせを出さない成功でも、変わった状態が読み上げで分かる
意味の伝え方
- !テーマ(success / negative / warning 等)と文言が一致している
- !アイコンは
aria-hidden="true"、意味は文言が運ぶ - !失敗の文言に「何が起きたか」と「次に何をすればよいか」がある
- !リンクの文言だけで行き先が分かる(「詳しくはこちら」にしない)
関連する達成基準(WCAG 2.2)
4.1.3 ステータスメッセージ ・ 2.2.1 タイミング調整可能 ・ 1.3.2 意味のある順序 ・ 2.4.3 フォーカス順序 ・ 1.4.1 色の使用 ・ 1.4.10 リフロー ・ 3.3.1 エラーの特定 ・ 3.3.3 エラー修正の提案
WCAG 2.2 の全基準の対応表: アクセシビリティについての取り組み