フィードバック

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)。

操作した場所の近くに置く

Good
表示名

保存しました

押したボタンのすぐ横に出るので、視線を動かさずに結果が分かる。

Don't

保存しました

表示名

1 つの操作の結果を、フォーカスを移さずにページの上部に出すと、ボタンを見ている利用者は気づかない。長いページでは画面の外に出てしまう。

モーダルの中の操作の結果は、モーダルの中に出す

Good

入力した内容を残したまま、その場でやり直せる。

Don't

招待メールを送れませんでした

もう一度「メンバーを招待する」から送ってください。

モーダルを閉じてページの上部に出すと、入力した内容が消え、最初から入れ直すことになる。

成功を知らせるかの決め方

成功の知らせは控えめに使います。結果が画面を見て分かるなら、メッセージを足しても騒がしくなるだけです。上から順に当てはめます。

問い はい いいえ
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"、意味は文言が運ぶ
  • !失敗の文言に「何が起きたか」と「次に何をすればよいか」がある
  • !リンクの文言だけで行き先が分かる(「詳しくはこちら」にしない)