HTML5で導入されたplaceholder属性によって、フォームフィールドにプレースホルダを設定できるようになりました。さて、「プレースホルダ」とはそもそもなんでしょうか。また、どのようなテキストを書けばよいのでしょうか。
プレースホルダとは
フォームフィールドに薄い灰色のテキストが表示されているものを見かけます。あのテキストや、その仕組みはプレースホルダと呼ばれています。
Safariはアドレスバーに“Go to this address”、検索バーに“Google”というプレースホルダが設定されている。
“placeholder”は実際のものに変わって表示されるものを意味するものです。たとえばダミーテキストなどもplaceholder textなどと呼ばれます。このノートでは、inputやtextareaなどフォームフィールドに表示されるものに限定してこの「プレースホルダ」という言葉を使っています。
プレースホルダのついたフォームフィールドは、こんな動作をします。
値が何も入力されていない時、フィールド内にプレースホルダを表示する。
フィールドが入力を受け付けると、プレースホルダが消える。
これらの挙動から、プレースホルダには「入力前にそのフィールドに関し何かしら情報を提示する」目的があると推測されます。
プレースホルダが消える挙動については、OSやソフトウェアの実装によって異なります。詳しくはプラットフォーム実装との差異 をお読みください。
HTML5のplaceholder属性
Webサイトがアプリケーション化しているからなのか、Webサイトでもプレースホルダを見ることも増えてきました。このプレースホルダの多くはJavaScriptによって実装されていますが、HTML5ではplaceholderというそのままの名前の属性がinputおよびtextarea要素に導入されています。
仕様書の説明を大雑把に訳すとこんな感じでしょうか。
placeholder 属性は、ユーザーがデータを入力する際に彼らを手助けする目的で提示される短い ヒント(単語や短いフレーズなど)を表す。ヒントには入力例や望まれる入力形式の説明が当てはまるだろう。この属性が指定された場合、その値にはU+000A LINE FEED (LF)やU+000D CARRIAGE RETURN (CR)が含まれてはならない。
長いヒントやその他の補足情報については、title 属性がより適切である。
placeholder属性はlabel の代わりに使うべきではない。
UAはこのヒントを、要素の値 が空文字列である場合に改行を取り除いた うえでユーザーに提示するべきだ。このとき、コントロールはフォーカスされてない状態であってもよいし、フォーカスされていてもよい。
改行文字を含んではならないとあるのに、その後UAは改行を取り除き表示すると書かれているので矛盾しているようにも読めますが、前者は製作者の要件、後者はUAの要件になります。
使い方ですが、値にプレースホルダのテキストを書くだけです。改行を含められないので、textareaで複数行のプレースホルダを表示することはできません。
<input placeholder="プレースホルダ ">
<textarea placeholder="プレースホルダ "></textarea>
placeholderのマークアップ。
これだけ。便利な世の中になりました。
何が「ヒント」となりうるか
placeholder属性やその挙動についてわかったところで、ここからはその属性の使い方について考えていきましょう。
仕様の定義から、placeholder属性は入力する内容に関し「ヒントを与える」という役割を持つことが分かりました。では、どういったテキストがその「ヒント」として適切なのでしょうか。
長い文は不適当
まず、長いヒントはplaceholder属性の値として想定されていないことが分かります。どれくらいが長いヒントなのかは分かりませんが、長い文でしか伝わらないようなヒントを、入力時に消えてしまうプレースホルダとして設定するのは、あまり賢いやり方ではないでしょう。
ラベル代わりの利用はダメ
次に、label代わりに使うべきではないとあります。これが何故いけないかというと、placeholderだけではそのフィールドが何のためのものか、視覚的にしか伝わらないことが多いからです。
<input type=email placeholder="メールアドレス">
labelを関連づけず、プレースホルダをラベルとして利用する例。
placeholder属性の読み上げ
placeholder属性のアクセシビリティについては、FirefoxとSafariで属性値の読み上げがサポートされているようです。しかし、HTML5 placeholder attribute tests によると、両者の読み上げ方には違いがあります。Firefoxではlabelが優先されますが、Safariではplaceholderが優先されてしまうようです。また、Firefoxでは、labelでラベルとコントロールを囲った場合(forで参照しない場合)、ラベルとプレースホルダがどちらも読み上げられてしまうようです。
placeholderの情報が支援技術に渡るように一部のUAで実装されていても、placeholderに対応しない環境では引き続きそのフィールドが何であるかが分かりません。placeholderをラベル代わりに使うのが問題というわけではなく、ラベルを与えないフォームフィールドがそもそも問題と考えてください。
入力内容の例示は効果的な例もある?
次に、入力例です。メールアドレスのフィールドに「例: placeholder@example.com」などが書かれているケースがありますが、そういうものを想定しているのでしょう。
<input type=email placeholder="placeholder@example.com">
メールアドレス:
ほとんどの場合、入力例が有用になるケースや、そもそもヒントになるケースはまれなように感じます。しかし、入力する情報が特定のカテゴリに限定されないフィールドの場合、プレースホルダが有用なヒントとなる可能性はありそうです。
たとえば、Yahoo!ロコ地図 の検索フィールドには「入力例:東京都港区赤坂9-7-1、東京ミッドタウン」「大阪駅 居酒屋」というプレースホルダがあります。どれも位置に関係する情報ですが、「東京都港区赤坂9-7-1」は住所、「東京ミッドタウン」はランドマーク、「大阪駅 居酒屋」はあるランドマーク周辺の情報検索と、性質はそれぞれ異なるのがわかります。
検索フォームが幅広いキーワードを受け付けられることを示すことで、ユーザーが目的の情報にありつきやすくなる効果が期待できるかもしれません。しかし、こういった情報も入力時に消えてしまうプレースホルダではなく、フィールドのそばに併記する方がよいかもしれません。プレースホルダの情報が助けになると判断された場合は、フォームのUIを見直すのがよいでしょう。
JavaScriptによるプレースホルダの実装は必要か
プレースホルダをJavaScriptで実装するものがあります。placeholder属性が導入される前から存在していたものや、古いブラウザでもプレースホルダが欲しいという要求に答えたのでしょう。
実装方法ですが、だいたい2パターンかと思います。
フォーカスに応じてvalue属性の値とそのスタイルをを書き換える。
labelやtitleにプレースホルダを記述し、スタイルシートで重ねフォーカス制御を実装する。
さて、placeholderと同じ挙動をスクリプトからで行う意義について考えてみましょう。プレースホルダはヒントを与えるもので、それがなくてもフィールドに何を入力するかは、プレースホルダなしでも理解できなければいけません。
そして、与えるプレースホルダは多くの場合「検索ワードを入力」や「Search」といった、ヒントにもならないテキストです。大した行数ではないでしょうが、スクリプトを実装してまでこうしたプレースホルダをplaceholderに対応しないブラウザでも表示させる必要はあるのでしょうか。
まとめ
プレースホルダはフィールドに入力する情報に関し何らかの「ヒント」をユーザーに伝える役割があります。ヒントはプレースホルダの使われる文脈に依存しますが、ちまたにあるプレースホルダ多くはあまり役目を果たしていないと感じます。「Search」など飾り程度でしかないものが多いからです。
プレースホルダは場合によって、良いヒントを提供してくれるかもしれません。しかし、プレースホルダの情報はあくまでヒントです。プレースホルダがなくなると目的が分からなくなるようなフォームであってはいけないわけです。ですから、まず問題なく機能するフォームを作ったうえで、必要あらばプレースホルダでヒントを与えるという設計フローがよいでしょう。