0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

これはなに

フォームを実装するとき、placeholder 属性に入力例や説明を書いてしまうことが多いと思います。

<input type="text" placeholder="ここにユーザー名を入力してください">

この書き方、実はアクセシビリティ上の問題があります。

placeholder の何が問題なのかを整理しながら、実務でどう判断すれば良いかをまとめました。

参考資料:

placeholder の根本的な問題:入力すると消える

placeholder には決定的な制約があります。入力を始めると消えます。

「user_name のような形式で入力してください」という placeholder があったとします。ユーザーはそれを読んで入力を始めますが、最初のキーを押した瞬間に消えてしまいます。

「あれ、どんな形式だったっけ?」

特に認知障害や短期記憶に困難を抱えるユーザーにとって、これは大きな障害になります。入力しながら確認したいのに、確認できない状態になってしまうからです。

消えること以外にも、いくつか問題があります:

  • コントラスト比の低さ:多くのブラウザでグレー表示されます。WCAG 2.1 の達成基準 1.4.3 では通常テキストのコントラスト比は 4.5:1 以上が必要ですが、デフォルトスタイルではこれを満たさないことが多いです
  • オートコンプリート時の問題:ブラウザが自動入力すると placeholder が消えるため、入力中にヒントを参照できなくなります
  • スクリーンリーダーとの相性:ブラウザ・スクリーンリーダーによって読み上げ挙動がばらつきます

使い方による3パターン評価

placeholder の使い方は大きく3パターンに分けられます。

パターン 評価
説明文に例を置く 入力欄の下に「例:user_name」 ◎ 最良
例示形式のプレースホルダー user_name △ 次善
指示形式のプレースホルダー 「ここにユーザー名を入力してください」 × NG

:x:NG:指示形式

<!-- NG -->
<input type="text" placeholder="ここにユーザー名を入力してください">

入力を始めると「何を入力すればよいか」の手がかりが完全に消えます。ラベルがあったとしても、入力形式の手がかりがゼロになります。

:small_red_triangle: 次善:例示形式

<!-- 次善 -->
<input type="text" placeholder="user_name">

消えたとしても「あの形式か」と思い出しやすいという利点があります。指示形式よりは実用的です。

:white_check_mark: 最良:説明文に例を置く

<!-- 最良 -->
<label for="username">ユーザー名</label>
<input type="text" id="username">
<p class="hint">例:user_name</p>

これなら入力中も消えません。WCAG 2.1 の達成基準 3.3.2(ラベルまたは説明)でも、入力フォーマットの説明は永続的に表示することが推奨されています。

ラベルとの関係で問題の大きさが変わる

placeholder の問題は、ラベルの有無によって影響の大きさが変わります。

ラベルの代わりに placeholder だけ → NG

<!-- NG -->
<input type="email" placeholder="メールアドレス">

入力後にフィールドの意味が分からなくなります。また、<label> 要素がないためスクリーンリーダーがフィールドを正しく読み上げられません。
WCAG 2.1 の達成基準 1.3.1(情報及び関係性)および 2.4.6(見出し及びラベル)にも反します。

ログインフォームではこのパターンをよく見かけます。
デザイン的にはスッキリしますが、アクセシビリティの観点では問題が残ってしまいます。

ラベルがある上での補足 placeholder → 許容範囲

<!-- 許容範囲 -->
<label for="email">メールアドレス</label>
<input type="email" id="email" placeholder="contact@example.com">

ラベルがあるため最低限の情報は保たれます。ただし同じ情報を説明文に置く方が確実です。

実例:before / after

問い合わせフォームのメールアドレス欄

Before
問題:ラベルなし・指示形式・入力後にフィールドの意味が消える

<input type="email" placeholder="メールアドレスを入力してください">

After

<label for="email">メールアドレス</label>
<input type="email" id="email">
<p class="hint">例:contact@example.com</p>

ラベルを追加し、placeholder を削除して説明文に例を移しました。


会員登録フォームのユーザー名欄

Before
問題:ラベルはあるが指示形式のプレースホルダー

<label for="username">ユーザー名</label>
<input type="text" id="username" placeholder="ここにユーザー名を入力してください">

After
指示形式の placeholder を削除し、説明文に入力形式の例を移しました。

<label for="username">ユーザー名</label>
<input type="text" id="username">
<p class="hint">例:user_name(半角英数字と「_」「-」が使えます)</p>

ログインフォーム

Before
問題:ラベルなし・入力後にフィールドの意味が消える

<input type="email" placeholder="メールアドレス">
<input type="password" placeholder="パスワード">

After
ラベルを追加し、placeholder を削除しました。
ログインフォームは情報がシンプルなため、ラベルを追加するだけで placeholder が不要になるケースが多いです。

<label for="email">メールアドレス</label>
<input type="email" id="email">

<label for="password">パスワード</label>
<input type="password" id="password">

まとめ

確実にNGなのは次の2点です:

  • placeholder でラベル代わりにすること
  • 指示形式(「ここに〇〇を入力してください」)を使うこと

それ以外は「入力中も必要な情報がユーザーに届くか」を基準に判断すると迷いが減ると思います。

ルール 内容
ラベルは必ずつける placeholder でラベル代わりにしない
指示形式は使わない 「ここに〇〇を入力してください」はNG
理想は説明文に例を置く 消えないので確実
次善は例示形式 使うなら user_name のような具体例で

まず「指示形式だけは絶対使わない」から始めると、多くのフォームは大きく改善されると思います。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?