トピックを検索
何を入力するのか分からない、あいまいなフォームのラベル
ギフトカードのフォームが、欄のラベルを「名前」「メール」「日付」と一語ずつにしているため、自分の情報と受け取る人の情報のどちらを書くのか、どの日付なのかが分かりません。
<label for="name">名前</label> 問題
ラベルが一般的な一語だけの欄には、何を入力すればよいか分からず、受け取る人の情報を書く欄に自分の情報を書いたり、違う日付を入れたりしてしまいます。
ショップのギフトカードのページは、すっきりとデザインされています。カードのプレビューがあり、その横に4つの欄が1列に並びます。ラベルは一語ずつで、「名前」「メール」「日付」「メッセージ」です。デザイナーはカードの横でフォームが軽く見えるよう、ラベルを短くしました。デザイナーにとっては、どの言葉も十分に明らかです。ギフトのフォームなので、名前は受け取る人のものです。
友人にカードを贈ろうとする人は、「名前」を読んで自分の名前を入力します。これまでに入力してきたフォームは、ほとんどが本人の名前を求めていたからです。「メール」にも自分のアドレスを入れるので、カードは友人ではなく自分の受信箱に届きます。「日付」は、送信する日にも、友人の誕生日にも、自分の生年月日にも読め、正しいのは一つだけです。フォームのどこにも、どれなのかは書かれていません。取り違えに最初に気付くのは、確認メールを見たときか、カードを受け取れなかった友人に言われたときです。
同じデザインには、もう一つの実装があります。画面には一語のラベルを残したまま、足りない言葉を、視覚的に隠したspanでスクリーンリーダーにだけ加えるものです。スクリーンリーダーの利用者には「名前(受取人)」と聞こえるようになりますが、画面を読む人には「名前」のままです。
WCAG 2.4.6(見出し及びラベル)は、見出しとラベルが主題や目的を説明していることを求めています。長いラベルを求めているわけではありません。Understandingのページは、適切な手がかりになるなら、一語でも、一文字でも十分な場合があるとしています。しかし、二人の人物に関わるフォームの「名前」は、どちらの手がかりにもなりません。「日付」は三つの答えに当てはまります。ラベルは存在し、欄と結び付いているので、1.3.1と3.3.2は満たしています。満たしていないのは、言葉そのものです。
隠したテキストを加えても、それは変わりません。WCAGはラベルを、コンポーネントを識別するために利用者に提示されるテキストと定義しています。画面を見る人に提示されているラベルは、「名前」のままです。2.4.6のTrusted Testerのテストは各欄のラベルと説明を確認します。画面に表示されているラベルは、やはり何を入力するのかを伝えていません。
2.4.6は見出しも対象にしています。見出しについては大きさで選ばれ、構造と合わない見出しで扱っています。このガイドは、フォームのラベルについてです。
推測が最も難しくなるのは、フォームが二人の人物や、同じ種類の二つのものについて尋ねる場面です。ギフトカード、ほかの人のための予約、配送先と請求先の住所、緊急連絡先などです。スマートフォンでは、答えの手がかりになるカードのプレビューがフォームの上か下に押し出されるため、画像から推測できたはずの人にも見えません。
10グループ中3グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響なし)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 言語・認知・学習の能力が限られる 一語だけのラベルは、誰の名前か、どのメールアドレスか、何の日付かを推測させます。推測が苦手な人や、フォームを書かれたとおりに受け取る人は、自分の情報を入力します。ほとんどのフォームは、入力する本人の情報を求めるからです。
- 視覚を使わない Tabキーで移動すると、スクリーンリーダーは各欄のラベルを読み、欄の周りにある見出しやカードのプレビューを飛ばします。手がかりは「名前、編集テキスト」だけです。
- 視覚が限られる 画面拡大鏡では、欄とそのラベルしか見えません。誰の名前かを示す見出しやカードのプレビューは、視野の外にあります。
どの欄にもlabel要素が結び付いているので、axe、ANDI、そのほかのラベルのチェックはすべて合格にします。「名前」がこのフォームにふさわしい言葉かどうかは、フォームが何を尋ねているかによるため、判定できるルールはありません。EaseWebの診断は、番号、日付、コードのように、一語ではほとんど足りない言葉だけをラベルにした欄と、legendで区別されずに同じラベルを持つ同じフォーム内の二つの欄を、問題としてではなく、人が読むための手がかりとして報告します。あいまいなラベルの修正をAIのコーディングツールに頼むと、aria-label="受け取る人の名前" や隠したテキストを加えることがあり、これは下の二つ目の修正前の例です。スクリーンリーダーには目的が伝わりますが、画面には「名前」とあるままです。
試してみる
友人にギフトカードを贈るつもりで、フォームに入力してください。
入力する前に、各欄が誰の名前とメールアドレスを求めているのか、どの日付なのかを考えてください。カードのプレビューに、ショップが各回答をどう使うかが出ます。Tabキーで欄を移動し、画面のラベルとスクリーンリーダーが読む言葉を比べてください。特に「問題2」で比べてみてください。
問題あり 修正できますか?
送信先: …、送信日: …
スクリーンリーダーの読み上げ:
(Tabで入力欄へ移動)
修正方法
足りない言葉を表示されているラベルに書き込むか、誰の情報かを示すlegendの下に短いラベルを置きます。
- 1表示されているラベルは、グループのlegendと合わせて読むと、何を入力するのかが分かる。
- 2legendで区別できない限り、二つの欄に同じラベルを付けない。
- 3何を入力するのかを伝える言葉は、コードの中だけでなく画面にある。
デザインどおりの一語のラベル
<form> <label for="name">名前</label> <input id="name" name="recipient-name" type="text"> <label for="email">メール</label> <input id="email" name="recipient-email" type="email"> <label for="date">日付</label> <input id="date" name="send-date" type="date"> <label for="message">メッセージ</label> <textarea id="message" name="message"></textarea> <button type="submit">ギフトカードを購入</button></form>足りない言葉を各ラベルに書く
<form> <label for="name">受け取る人の名前</label> <input id="name" name="recipient-name" type="text"> <label for="email">受け取る人のメールアドレス</label> <input id="email" name="recipient-email" type="email"> <label for="date">送信日</label> <input id="date" name="send-date" type="date"> <label for="message">メッセージ</label> <textarea id="message" name="message"></textarea> <button type="submit">ギフトカードを購入</button></form>この方法を選ぶ理由:ラベルは、それだけで意味が通るように書く
どの欄にもラベルがあり、どのラベルも欄と結び付いています。コードは各欄の目的を知っていて、recipient-name、send-date と書いています。利用者が読むラベルは、「名前」「日付」だけです。
各ラベルは、どこで読まれても、それだけで何を入力するのかを伝えます。画面でも、スクリーンリーダーでも、エラーメッセージ(「受け取る人のメールアドレスを入力してください」)でも、音声操作(「受け取る人のメールアドレスをクリック」)でもです。デザインは1列のレイアウト、書体、余白をそのまま保ちます。ラベルは少し長くなりますが、スマートフォンの幅でも1行に収まります。「メッセージ」は元のままです。ギフトのフォームで、メッセージが指すものは一つしかありません。
どちらも2.4.6を満たします。言葉は各ラベルに書いてください。余分な構造なしに同じ役割を果たし、ラベルは周りから切り離されても持ち運ばれる唯一のテキストだからです。エラーの一覧、入力内容の確認ページ、音声操作は、上の見出しを含めず、欄自身のラベルだけを使います。そこでも「受け取る人のメールアドレス」は明確なままで、「メール」はそうではありません。legendは、ギフトのフォームが贈り主の名前とメールアドレスも尋ねる場合や、配送先と請求先の住所のように、同じことを二人の人物や二つの場所について尋ねるフォームで使います。すべてのラベルの前に「受け取る人の」「あなたの」と付けると、フォームが重くなるからです。その場合は、エラーメッセージと確認ページに、グループの言葉を自分で書き加えてください。どちらの方法でも、日付のように、どのグループにも説明されない欄には、その欄自身の言葉が必要です。隠したテキストと aria-label は、三つ目の方法ではありません。スクリーンリーダーには届きますが、画面は元のままです。
受け取る人の欄は、フォームに入力している本人についての欄ではないので、autocomplete="name" や autocomplete="email" は付けません。付けると、ブラウザーがそこに購入者自身の情報を提案し、あいまいなラベルと同じ取り違えを起こします。1.3.5がこれらの値を求めるのは、利用者自身の情報を集める欄だけです。自動入力が効かないフォームの入力欄を参照してください。
ラベルには欄が何かを書き、形式はヒントに書きます。「送信日」はどの日付かを伝えます。入力の仕方は、欄がHTML標準の日付入力でなければ、ラベルの下の一行に書き、aria-describedby で欄と結び付けます。プレースホルダーはどちらにも向きません。入力を始めた途端に消えるからです。
legendはその中の欄と一緒に読まれ、スクリーンリーダーによっては欄ごとに繰り返します。「贈る相手」のように数語にとどめ、説明の文にはしないでください。長い案内はグループの前の段落に書き、そこで必要なら aria-describedby で最初の欄と結び付けます。
共通の入力欄コンポーネントでは、ラベルはプロパティの一つで、コードレビューは中身にかかわらず通します。ラベルの言葉はコンテンツと一緒にレビューし、各欄に何を入れるかのメモをコンポーネントを使う場所の近くに残してください。次にフォームを編集する人が、ラベルがまだ合っているかを判断できます。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得、または全ガイドをコーディングエージェントで使う。
デザインの案
ラベルは親しみやすくても短くてもよく、何を入力するのかが分かれば十分です。
ギフトカードのフォームの欄に付けるラベルを、さらに4通り示します。それぞれのラベルを、画面にそれしかないつもりで読み、何を入力するかを言ってみてください。2つは分かり、2つは推測するしかありません。
デザインファイルで
- 各ラベルはサイトに出る言葉のまま書く(「受け取る人の名前」)。開発者は描かれたものを写すため。
- 各欄の横に、何を、誰の情報として入れるかをメモする(「受け取る人の名前。カードに印字」)。レビューする人と翻訳者が使う。
- 最も長いラベルを幅390ピクセルのスマートフォンの画面で描き、本物の言葉に合うレイアウトにする。
- 二人について尋ねるフォームでは、それぞれの人の欄の上に見出しをフォームの一部として描く。
- エラーメッセージにはラベルの言葉を使う。「受け取る人のメールアドレスを入力してください」。
合格
- 質問の形のラベル 「どなたに贈りますか?」は、ショップが話しかけるように読め、誰の情報が欲しいのかを伝えるので、自分の情報を入れてしまうことがありません。文字色は#1f2d2b(14.30:1)で、小見出しほどの大きさにします。スマートフォンの幅でも、各質問は1行に収めます。
基本原則:ラベルは、それだけで意味が通るように書く
- 日・月・年の上に一つの見出し 見出しが「送信日」とどの日付かを伝え、#5b6764(5.88:1)の一行が例を示し、各欄には年・月・日のラベルが付きます。意味は見出しが担うので、欄は入る数字の幅まで細くできます。
不合格
- 形式だけのラベルWCAG 2.4.6 3つの整った欄の上のDD、MM、YYYYは正確に見えますが、日付の書き方を伝えるだけで、どの日付かは伝えません。カードを送る日も、友人の誕生日も、購入者自身の生年月日も当てはまります。
- グリッドに合わせて切られたラベルWCAG 2.4.6 整ったグリッドが、すべてのラベルに同じ狭い列を与え、長いラベルを省略記号で切ります。「受け取る人の名前」と「受け取る人のメールアドレス」は、どちらも「受け取る人…」としか見えません。列は最も長いラベルに合わせて描くか、ラベルを欄の上に置いてください。
修正の確認
マウスを使わない4つの確認
確認方法: スクリーンリーダー
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。欄を追加したとき、ラベルを変えたとき、フォームを翻訳したときは、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。扱っているのはラベルの言葉で、ラベルがあるか、欄と結び付いているか(ラベルがない・表示と食い違うフォームの入力欄)、必須項目の示し方(色だけで示された必須項目)、ラベルのほかに欄が必要とするヒントや形式は扱っていません。ラベルが明確かどうかは、フォームを使う人と、その人がすでに知っていることによって変わります。フォームを提供するすべての言語で、実際に使う人と一緒に確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。