フォーム
pattern会員登録・問い合わせ・設定の変更のように、利用者に情報を入力してもらう画面の組み立て方です。部品は ラベルコントロール・インプット・セレクター・チェックボックス・ラジオ・テキストエリアなどをそのまま使い、このページでは並べ方・書き方・エラーの伝え方を決めます。
見本
何も入れずに「招待する」を押すと、エラーの出方を試せます(役割は安全な初期値「閲覧者」を選んであります)。エラーが 3 件以上のときは、フォームの上にまとめを出してそこへフォーカスを移します。
メンバーを招待する
1 つの項目の構成
1 つの項目は、上から「ラベル(+必須/任意のバッジ)→ 入力欄 → エラー → 補足」の順に縦に積みます。エラーと補足は入力欄の真下に置き、aria-describedby で入力欄と結びます(エラーが先)。
*メールアドレスの形式で入力してください(例: yamada@example.com)
招待メールをこのアドレスに送ります
<div class="label-control"> <div class="label-control-row"> <label class="label-control-text" for="email">メールアドレス</label> <span class="label-badge label-badge-required">必須</span> </div> </div> <input type="email" class="input input-md input-error" id="email" required autocomplete="email" aria-invalid="true" aria-describedby="email-err email-help" /> <p class="field-error-text" id="email-err">*メールアドレスの形式で入力してください</p> <p class="field-support-text" id="email-help">招待メールをこのアドレスに送ります</p>
レイアウト
- 項目は縦に 1 列で積む(項目の間は 24px)。高さを詰めるために 2 列に並べない。上から順に読み、入力し、見落とさない
- 入力欄の幅は、入る値の長さに合わせる。郵便番号・数量のような短い値は短く、住所やメッセージは広く。全部を画面いっぱいにしない(長文の行は読みにくい)。フォーム全体の幅は 448px ほどまで
- 関連する項目はまとめる。ラジオ・チェックボックスの組や「住所」のようなまとまりは
fieldset+legendで囲み、まとまりの名前を読み上げさせる - 選んだ内容で出る項目は、その選択肢の直下に出す(「その他」を選んだら、その下に入力欄)。離れた場所に出すと気づかれない
縦に 1 列で積む
読む順番上から下へ 1 本の流れで読める。拡大表示やスマホでも崩れない。
左右に並べると、どの順で入力するか迷い、右側の項目を見落としやすい。狭い画面では 1 列に崩れる前提が必要になる。
ラベル・補足・必須/任意
- ラベルは短い名詞(「メールアドレス」「役割」)。文章や「〜してください」にしない。説明が要るなら補足に書く
- プレースホルダーをラベルの代わりにしない。入力すると消え、色も薄くて読みにくい。入力例もプレースホルダーでなく補足に書く
- 補足は新しい情報だけ(何に使うか・形式・上限)。ラベルの言い換えは書かない。エラーが出ても補足は消さない
- 必須と任意はどちらもバッジで示す(
label-badge-required/label-badge-optional)。必須の入力欄にはrequiredも付ける。色や「*」だけで示さない
ラベルは入力欄の上に常に見せる
ラベル又は説明例: yamada@example.com
入力したあとも何の欄か分かる。入力例は補足に書く。
プレースホルダーは入力すると消え、何の欄だったか分からなくなる。色が薄く、読み上げにも頼れない。
部品の選び方
何を入れてもらうかで部品を決めます。見た目の好みで選ばないでください。1 つ選ぶ項目は、安全な初期値を選んでおきます。迷ったら、取り返しがつき影響の小さい選択肢にします(権限なら最小の「閲覧者」、通知なら控えめな方)。初期値を決められない項目(所属など)だけ「選択してください」から始め、選ばずに送れないようにします。
| 1 行の文字 | インプット(type と autocomplete を値に合わせる: email / tel / postal-code 等) |
|---|---|
| 複数行の文章 | テキストエリア(上限があれば文字数を出す) |
| 1 つ選ぶ(数個) | ラジオ(選択肢が一目で見える。初期値を 1 つ選んでおく) |
| 1 つ選ぶ(多い) | セレクター(都道府県など 8 個以上) |
| 複数選ぶ | チェックボックスを並べる。並べる場所が無ければ マルチセレクター |
| 自由な値を複数 | タグインプット(担当者・タグ・メールアドレス) |
| 同意・1 つの ON/OFF | 送信で確定するならチェックボックス、その場で反映する設定なら トグルスイッチ |
ボタン
- 送信ボタンはフォームの最後に 1 つ(
btn-primary btn-solid)。文言は「送信」でなく、何が起きるか(「招待する」「保存する」)にする - ページのフォームは最後の項目の直下・左端にそろえる。入力を終えた視線の先に置く。カードやモーダルの中のフォームは、それぞれの footer(右寄せ)に置く
- 取り消し(キャンセル・戻る)は主操作の隣に neutral の outline / ghost で置く。主操作を 2 つにしない
- 未入力でも送信ボタンを disabled にしない。押せない理由が分からないため。押したときにエラーで理由を伝える。送信中は
data-loadingで二重送信を防ぐ
検証とエラー
- 検証するのは「送信したとき」と「入力を終えたとき」(その欄からフォーカスが外れたとき)。入力している途中には検証しない(打ち終わる前にエラーが出る)。一度エラーが出た欄は、直したらその場で消す
- エラーは入力欄の真下に、何が違うか・どう直すかを書く(「メールアドレスの形式で入力してください(例: yamada@example.com)」)。「入力エラー」「不正な値です」だけにしない
- 入力欄には
input-errorとaria-invalid="true"、エラー文はaria-describedbyで結ぶ。ラジオ・チェックボックスの組はまとまり(fieldset)に 1 つだけ出す - 送信してエラーが 1〜2 件なら、最初のエラーの入力欄へフォーカスを移す。3 件以上ならフォームの上に アラート(negative)でまとめを出し、各項目へのリンクを並べてまとめへフォーカスを移す
- 送信の結果(送りました/送れませんでした)は送信ボタンのすぐ横に インラインメッセージ で出す。時間で消えるトーストにしない(フィードバック)
エラー文で直し方を伝える
エラーの修正の提案*メールアドレスの形式で入力してください(例: yamada@example.com)
何が違い、どう直せばよいかが分かる。
*入力エラー
何が違うのか分からず、直せない。
使えない状態・読み込みに失敗したとき
- 変更できない値は disabled でなく、ふつうの文字で見せる(または
readonly)。disabled は薄くて読みにくく、送信にも乗らない。変更できない理由があれば補足に書く(ラベルのlabel-badge-disabled「編集不可」) - 送信に失敗しても、入力した内容を消さない。フォームはそのまま使える状態で残し、送信ボタンの横に失敗と次の手(もう一度・時間をおく)を出す
- 初期値の読み込みに失敗したら、空のフォームを出さずに理由を出す。一部の項目だけ読めないなら、その項目だけ使えない理由を示す
アクセシビリティ
実装時の必須対応
フォームを作ったら確かめる
- !すべての入力欄に見えるラベルを付け、
<label for>で結ぶ。まとまりはfieldset+legend - !必須はバッジ(見た目)と
required(プログラム)の両方で示す - !名前・メール・電話・住所には
autocompleteを付け、自動入力を使えるようにする(同じ情報を何度も入れさせない) - !エラーは
aria-invalid+aria-describedby。送信時はエラーの入力欄(3 件以上ならまとめ)へフォーカスを移す - !送信の結果はボタンの横に
role="status"(失敗はrole="alert")で出す - !入力の途中でページを移動・送信しない(選んだだけで送信されない)