HTML / 要素

form要素の使い方

HTMLのform要素は、入力欄やボタンをひとまとめにして、ユーザーが入力したデータを送信するための土台です。

先に結論

formの中にinputselecttextareabuttonなどを置き、actionで送信先、methodで送信方法を指定します。

フォームは入力画面を作るだけで、データを保存するものではありません。送信先のサーバー側にも、受け取ったデータを処理する仕組みが必要です。

最小の例

<form action="/search" method="get">
  <label for="keyword">検索語</label>
  <input id="keyword" name="q" type="search">
  <button type="submit">検索</button>
</form>

labelは入力欄の説明、nameは送信データの名前、valueはその値です。actionmethodを省略すると、送信先は現在のページ、方法は基本的にGETになります。

試してみる

この例では、送信先を省略しているため、このページ自身にGETで送信します。メールアドレスを空欄のまま送信すると、ブラウザーの入力チェックが働きます。

フォームの中に置くもの

要素主な役割
input1行の文字、日付、チェックなどを入力・選択する名前、メール、同意
select用意した選択肢から選ぶ都道府県、カテゴリ
textarea複数行の文章を入力するお問い合わせ内容
button送信、リセット、JavaScriptの操作を開始する送信する、戻す
label入力コントロールの名前や説明を関連付けるメールアドレス

見た目を整えるための要素と、入力の意味を表す要素は分けて考えます。フォーム全体のレイアウトはCSSで設定します。

actionとmethod

指定何をするかよく使う場面
actionデータを送るURL検索処理や登録処理の受付先
method="get"データをURLのクエリにして送る検索や絞り込みなど、結果をURLで共有したい処理
method="post"データをリクエストの本文で送る登録・更新など、URLにデータを載せたくない処理
method="dialog"ネットワーク送信をせず、フォームを含むdialogを閉じる確認や選択の結果をdialogから受け取る処理

POSTにすれば暗号化されるわけではありません。通信内容を守るにはHTTPSを使い、サーバー側でも認証・認可や入力値の確認を行います。

送信されるデータ

コントロールにnameがあると、その名前と値が送信データの候補になります。nameがない入力欄は、通常のフォーム送信でデータとして送られません。

  • disabledのコントロールは、通常のフォーム送信に含まれません。
  • チェックされていないチェックボックスは、通常のフォーム送信に含まれません。
  • 送信ボタンは、送信を開始したボタンの値だけが送信対象になります。
  • 送信された値は、クライアント側の画面だけで信頼せず、サーバー側で確認します。
<input name="color" value="blue">
<input type="checkbox" name="terms" value="yes" checked>

送信データの例:
color=blue
terms=yes

labelとfieldsetで分かりやすくする

各コントロールには、何を入力・選択するのかが分かるlabelを付けます。複数の選択肢をひとつの質問としてまとめるときは、fieldsetlegendを使います。

<fieldset>
  <legend>連絡方法</legend>
  <label><input type="radio" name="contact" value="email"> メール</label>
  <label><input type="radio" name="contact" value="phone"> 電話</label>
</fieldset>

placeholderは入力例を示す補助情報であり、固定して表示されるlabelの代わりにはなりません。

入力をチェックする

requiredtype="email"minmaxpatternなどで、ブラウザーが入力を確認する条件を指定できます。

<label for="age">年齢</label>
<input id="age" name="age" type="number" min="0" max="130" required>

ブラウザーの入力チェックは、入力ミスを減らすための補助です。利用者は送信処理を変更できるため、重要なデータは必ずサーバー側でも検証します。

よくある間違い

  • formの中に別のformを入れる。フォームの入れ子はできません。
  • nameを付け忘れる。画面に表示されても、送信データの名前がなければ受け取りにくくなります。
  • 送信しない操作のbuttontypeを書かない。通常のフォーム内では、type="submit"が既定になるため、操作ボタンにはtype="button"などを明示します。
  • POSTだけで秘密が守られると思う。HTTPS、認証・認可、サーバー側検証も必要です。

Atlasで確認する

formのcontent model、form owner、entry list、制約検証、HTMLFormElement APIまで確認したい場合は、Yugien Atlasのform要素を参照してください。計算結果を表示するoutputと送信データの違いはoutput要素ページ、dialog内でのmethod="dialog"と選択結果はdialog要素ページ、フォーム部品の名前付けと関連付けはYugienのlabel要素ページ、複数行の文章入力はtextarea要素ページでも説明しています。