HTML講座 / placeholderと入力中も残る案内文を付ける

空の入力欄に短い例を表示するにはplaceholderを使います。欄の名前にはlabel、実際の初期値にはvalueなどを使い、入力中も必要な条件は欄の外へ残します。ヒントと実際の値を分けると、例文を利用者の回答として送る誤りを防げます。

label・placeholder・valueの違い

指定 役割 入力後と送信
label 入力欄の名前 入力中も残る。ラベル文自体は欄の値ではない。
placeholder 空欄のときの短い例 入力すると消える。ヒント自体は送信されない。
value inputの実際の初期値 編集可能な値。変更しなければそのまま送られ得る。

新規の問い合わせ欄でメールの例を見せるならplaceholderを使います。例のアドレスをvalueへ入れると本物の値に見え、必須の空欄検査も通る場合があります。一方、保存済み情報の編集では実際の初期値が必要です。目的を分けて指定します。

inputに短いヒントを付ける

開始タグへplaceholderを追加します。forとidでラベルを関連付け、nameで送信キーを決めます。

<label for="email">Email</label>
<input type="email" id="email" name="email"
       placeholder="e.g. alex@example.com">

placeholderを使えるinputの型はtext、search、tel、url、email、passwordです。dateやnumberで同じ動作を期待せず、条件を欄の外に書きます。詳しくはHTML標準のplaceholderと入力型と属性の対応を参照できます。関連付けはlabelとinputでも扱います。

textareaのヒントと初期値

複数行のtextareaにもplaceholderを使えます。ヒントだけにする場合は開始タグと終了タグの間を空にします。

<label for="message">Message</label>
<textarea id="message" name="message" rows="4"
          placeholder="e.g. When will my order arrive?"></textarea>

次はヒントではなく編集できる初期値です。textareaではvalue属性ではなくタグの間の文章が初期内容になります。

<textarea name="message">Please tell me when my order will arrive.</textarea>

空白やインデントも値になる場合があるため、空欄のつもりでヒントが出なければタグの間を確認します。textareaの標準規則と複数行入力と選択メニューで使い方を確認できます。

重要な条件は入力中も残す

placeholderは入力すると消えるので、項目名や重要な条件の代わりにはなりません。見えるラベルと補足の文章を残し、補足のIDをaria-describedbyへ指定すると、支援技術も説明を利用できます。

<label for="email">Email (required)</label>
<input type="email" id="email" name="email"
       placeholder="e.g. alex@example.com"
       aria-describedby="email-help" required>
<p id="email-help">Enter the email address where you want to receive a reply.</p>

これは説明との関連付けで、検証処理そのものを追加する属性ではありません。欄を操作中も条件を読めるかを確認します。W3C WAIのフォーム説明にこの方法の解説があります。

必須メールと任意メッセージの完全な例

次をUTF-8のform-guide.htmlとして保存し、ブラウザーで開きます。CSSは白い背景でのヒント色を指定し、狭い画面では欄をフォームの幅に収めています。

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Form guidance example</title>
  <style>
    body {
      margin: 24px;
      color: #222;
      font-family: sans-serif;
      line-height: 1.6;
    }
    form { max-width: 440px; }
    label { display: block; font-weight: bold; }
    input, textarea {
      box-sizing: border-box;
      width: 100%;
      padding: 10px;
      border: 1px solid #777;
      border-radius: 4px;
      font: inherit;
    }
    input::placeholder, textarea::placeholder {
      color: #666;
      opacity: 1;
    }
    .help { margin-top: 4px; }
    button { padding: 8px 20px; font: inherit; }
  </style>
</head>
<body>
  <h1>Contact us</h1>
  <form method="get">
    <p>
      <label for="email">Email (required)</label>
      <input type="email" id="email" name="email"
             placeholder="e.g. alex@example.com"
             aria-describedby="email-help" required>
    </p>
    <p id="email-help" class="help">Enter the email address where you want to receive a reply.</p>
    <p>
      <label for="message">Message (optional)</label>
      <textarea id="message" name="message" rows="4"
                placeholder="e.g. When will my order arrive?"></textarea>
    </p>
    <button type="submit">Submit</button>
  </form>
</body>
</html>

最初はヒントが見え、入力すると消えますが、ラベルと欄の外の説明は残ります。入力をすべて消すとヒントが戻ります。空のメールで送信、abcで送信、alex@example.comでメッセージを空のまま送信、の順に比較します。必須と基本形式は別の条件で、書式が通ってもアドレスの実在は保証されません。

この例にメッセージを保存するサーバーはありません。GETで現在の文書へ送る実習です。HTTP上ではURLに値が出ることを確認でき、ローカルファイルでは扱いが異なる場合があります。入力検証の境界値も合わせて試してください。

placeholderと実際の値の送信を比べる

ヒント自体は送信されませんが、空の値が項目として送られる場合はあります。nameがあり無効化されていない欄なら、検証に止められなければemail=のようになります。nameがない欄やdisabledの欄は通常のデータ一覧から除かれます。

次を別のHTML文書のbodyへ入れ、開発者ツールのConsoleでその後のコマンドを実行します。通信せずに一覧を作る実習です。

<form id="compare-form">
  <label for="default-name">Initial value</label>
  <input id="default-name" type="text" name="default_name" value="Alex">
  <label for="hint-name">Hint example</label>
  <input id="hint-name" type="text" name="hint_name" placeholder="e.g. Alex">
</form>
Array.from(new FormData(document.getElementById("compare-form")).entries())
[["default_name", "Alex"], ["hint_name", ""]]

初期状態ではvalueのAlexは含まれ、ヒントの「e.g. Alex」は含まれません。二つ目にSamと入力して再実行すると現在値がSamになります。FormDataの構築自体はrequiredの検証をしません。フォームデータの構築規則と実際の送信との違いを確認できます。

ヒントが出ない、読みにくい場合

まずinputのvalue、textareaの内容、自動入力、スクリプトで値が入っていないか確認します。次に型がplaceholderへ対応しているかを調べます。短い例だけを欄内に置き、長い条件や改行を必要とする説明は外へ出します。

CSSの::placeholderで色や不透明度を調整できますが、薄過ぎる色にせず背景との読みやすさを確認します。モバイルでもラベル、ヒント、説明を区別できるかを点検してください。実際の初期値を誤って削除するのではなく、欄の目的に合った指定へ直すことが大切です。

같은 카테고리의 다른 글
HTML講座 / HTML文書の基本構造

HTML講座 / HTML文書の基本構造

doctype、html、head、bodyの役割と、文字コード・文書タイトル・viewportの設定を解説します。ファイルの保存から表示確認、表示されない場合の調べ方まで学べます。

HTML講座 / textarea・select・option・buttonを使う

HTML講座 / textarea・select・option・buttonを使う

複数行入力、選択メニュー、送信・リセット・通常ボタンを使い分けます。表示ラベルと送信値、初期値と現在値を実際のフォームで比較する方法も紹介します。

HTML講座 / detailsとsummaryで開閉できる説明を作る

HTML講座 / detailsとsummaryで開閉できる説明を作る

JavaScriptなしで開閉する補足説明を作ります。open属性の真偽、分かりやすいsummaryの書き方、Tab・Enter・Spaceによる操作の確認方法も紹介します。

HTML講座 / labelとinputを正しく関連付ける

HTML講座 / labelとinputを正しく関連付ける

labelのforとinputのidを対応させる方法を学びます。idと送信時のnameの違い、重複IDの問題、placeholderがラベルの代わりにならない理由も説明します。

HTML講座 / テキストの意味を表すem・strong・引用・コード

HTML講座 / テキストの意味を表すem・strong・引用・コード

emとstrong、qとblockquote、abbr、code、kbdの違いを学びます。太字や斜体という見た目ではなく、文章中の役割に合わせて要素を選ぶ方法を説明します。

HTML講座 / fieldset・legend・autocompleteでフォームを説明する

HTML講座 / fieldset・legend・autocompleteでフォームを説明する

関連する入力をfieldsetでまとめ、legendで質問を示す方法を学びます。ラジオグループを独立させるnameと、自動入力の目的を示すautocompleteの違いも解説します。

HTML講座 / placeholderと入力中も残る案内文を付ける

HTML講座 / placeholderと入力中も残る案内文を付ける

label、placeholder、valueの違いを学びます。inputとtextareaの例、aria-describedbyによる説明の関連付け、フォームデータで送られる値の確認方法も紹介します。

HTML講座 / リンクの作成、相対パスとページ内移動

HTML講座 / リンクの作成、相対パスとページ内移動

aとhrefによるリンク、絶対URLと相対URL、ページ内の移動を学びます。新しいタブ、メール、ダウンロードの条件と、三つのファイルでパスを確認する実習も紹介します。

HTML講座 / table・tr・th・tdで表を作る

HTML講座 / table・tr・th・tdで表を作る

行と列を持つデータをHTMLの表で表す基本を学びます。見出しセルとデータセル、theadとtbody、横幅が広い表のスクロール方法も紹介します。

HTML講座 / メール・数値・日付・選択肢に合うinputの型

HTML講座 / メール・数値・日付・選択肢に合うinputの型

email、number、date、checkbox、radioの使い分けを学びます。見える入力UIと送信値、初期値と現在値の違いを、フォームデータの確認とともに説明します。