HTMLのフォームとは?form・input・label・buttonの違いと書き方を初心者向けに解説

HTMLフォームの基本の書き方と、役割・属性・確認のしかたを学ぶ初心者向け記事のアイキャッチ

問い合わせフォームを作ろうとして、入力欄やボタンをどう組み合わせればよいのか、ボタンを押すだけでメールが届くのかと迷っていませんか。

HTMLのフォームは、入力した情報をまとめて送るための仕組みです。全体をまとめるform、入力欄を作るinput、項目名を示すlabel、操作を行うbuttonに分けると、構造を理解しやすくなります。

この記事では、4つの要素の違いを確認し、名前とメールアドレスを入力するフォームを書きます。完成コードを保存してブラウザーで開き、ラベルの連動や入力チェックを確かめるところまで進めます。入力画面と、メールを届ける処理の違いも分かるようになります。

この記事で分かること
  • form・input・label・buttonの役割と親子関係
  • 名前とメールアドレスを入力するフォームの基本的な書き方
  • forとid、nameと値の違い
  • action・method・typeの選び方
  • 入力や送信がうまくいかないときの症状別の確認先
目次

HTMLのフォームとは?

HTMLのフォームは、ユーザーが入力・選択した情報をまとめて送信するための領域です。問い合わせフォームなら名前やメールアドレス、検索フォームなら検索キーワードを受け取ります。

MDNのform要素の解説では、formは情報を送信するための対話型コントロールを含む文書の区間と説明されています。

フォームは入力欄だけでなく送信のまとまり

フォームには、テキスト入力欄だけでなく、項目名、チェックボックス、送信ボタンなども含められます。formは、それらを一つの送信単位としてまとめる外側の要素です。

<form>
  <!-- ラベル、入力欄、ボタンを入れる -->
</form>

formは見た目の枠を作るためではなく、どの入力項目を一緒に送るかをまとめるために使います。見た目の枠線や余白はCSSで整えます。

HTMLだけでできること・できないこと

HTMLでは、入力欄と送信ボタンを画面に表示し、送信先や送信方法を指定できます。ただし、送られた内容を保存したり、担当者へメールで届けたりする処理はHTMLの役割ではありません。

HOAI Point

HTMLは入力画面と送信の入口を作るものと考えましょう。実際の保存・メール送信・自動返信には、サーバー側のプログラムやフォームサービスが必要です。

formの内側で、labelが項目を説明し、inputが値を受け取り、buttonが送信を実行します。この流れを先に覚えると、属性を追加しても役割を見失いません。

form・input・label・buttonの違い

4つの要素は、フォーム全体・入力欄・項目名・操作ボタンという役割に分かれます。

要素役割主に確認する属性
form入力項目を一つの送信単位にまとめるaction、method
input文字、メールアドレス、選択状態などを受け取るtype、id、name
label入力欄が何の項目かを示すfor
button送信や画面上の操作を実行するtype

formはフォーム全体を囲む

この基本例では、formの開始タグと終了タグの間へ、同じフォームとして送信したいinputやbuttonを書きます。formの中に別のformを入れ子にはできません。

inputは値を受け取る

inputは入力欄を作る要素です。type="text"なら1行の文字入力、type="email"ならメールアドレス入力の用途を示せます。MDNのinput要素の解説にあるように、typeによって見た目と動作が変わり、省略時の既定値はtextです。

labelは入力欄の意味を示す

labelには「お名前」「メールアドレス」のような項目名を書きます。for属性とinputのidを同じ値にすると、両者を関連付けられます。

buttonは送信などの操作を実行する

buttonはクリックできるボタンを作ります。フォームを送信するならtype="submit"、JavaScriptなどで独自の処理を実行するならtype="button"を使います。

HTMLで基本のフォームを書く方法

ここでは、テキストエディターでHTMLファイルを編集します。開始タグと終了タグの書き方が分かれば進められます。名前とメールアドレスの2項目を使い、入力画面とブラウザー側のチェックを確認しましょう。

STEP
formで全体を囲む

HTMLのbody内に、formの開始タグと終了タグを書きます。以下のSTEP1・2は構造を理解するための途中のコードです。すぐに試す場合は、STEP3の完成コードを使ってください。

<form>
</form>
STEP
labelとinputを追加する

項目ごとにlabelとinputを置きます。labelのforとinputのidは、同じ文字列にします。

<form>
  <p>
    <label for="name">お名前</label>
    <input type="text" id="name" name="name">
  </p>

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

pは1項目を段落としてまとめるための一例です。レイアウトだけを目的にする場合は、構造に合う要素を選び、最終的な並び方はCSSで調整します。

STEP
buttonを追加する

type="submit"のボタンと、必須入力を表すrequiredを追加します。下がHTMLファイル全体の完成コードです。/contactは送信先を説明するための仮のURLで、受け取り処理は用意していません。練習では、次のSTEPで示す未入力・形式違いの確認まで行います。

<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>フォームの練習</title>
</head>
<body>
  <form action="/contact" method="post">
    <p>
      <label for="name">お名前(必須)</label>
      <input type="text" id="name"
             name="name" required>
    </p>
    <p>
      <label for="email">メールアドレス(必須)</label>
      <input type="email" id="email"
             name="email" required>
    </p>
    <button type="submit">送信する</button>
  </form>
</body>
</html>

ブラウザーでは「お名前(必須)」「メールアドレス(必須)」と入力欄、その下に送信ボタンが表示されます。CSSで装飾していないため、枠やボタンの見た目はブラウザーによって異なります。

STEP
保存してブラウザーで確認する
  1. STEP3の完成コードだけを新しいファイルへ貼り付け、文字コードUTF-8、ファイル名form-practice.htmlで保存します。末尾が.txtになっていないか確認し、そのファイルをブラウザーで開きます。
  2. 「メールアドレス(必須)」の文字をクリックします。メール入力欄にカーソルが移れば、forとidの関連付けはできています。
  3. 何も入力せず「送信する」を押します。お名前欄に入力を促す案内が出て、ページが移動しなければ、requiredが働いています。
  4. お名前に「練習」、メールアドレスにabcを入れて、もう一度ボタンを押します。メール形式の案内が出て送信されなければ、type="email"のチェックを確認できました。
  5. 確認後は入力内容を消して終了します。有効なメールアドレスを入れて送信しても、この練習用の仮URLではメールの到着や受付完了を確認できません。

案内の文言はブラウザーによって異なります。コードを直したときは、ファイルを保存してからページを再読み込みし、該当する動作だけをもう一度確かめてください。

HOAI Point

入力画面の確認と、送信先で受け取る処理の確認を分けましょう。ラベルの連動と入力チェックができたら、この練習は完了です。メール送信の確認は、受け取り処理を用意してから行います。

formのaction・methodの書き方

formでは、主にactionで送信先、methodで送信方法を指定します。

<form action="/contact" method="post">
  <!-- 入力項目 -->
</form>

actionはデータの送信先を指定する

actionには、フォームデータを受け取るURLを書きます。/contactのような相対的な指定も、https://example.com/contactのような完全URLも使えます。パスの基準が分からない場合は、HTMLの相対パスと絶対パスの違いも確認してください。

methodはGETまたはPOSTを指定する

基本的な送信方法はgetとpostです。

methodデータの主な送られ方向いている例
getURLの末尾へクエリとして付くサイト内検索、絞り込み
postリクエスト本文に入る問い合わせ、登録フォーム

methodを省略した場合はgetとして扱われます。ただし、postを選べば自動的に安全になるわけではありません。HTTPS、入力値の検証、保存方法などは送信先側でも設計します。

検索条件のようにURLへ残したい情報はGET、問い合わせ内容のように送信処理へ渡す情報はPOSTを基本に検討します。

inputのtype・id・nameの書き方

inputは属性の組み合わせで用途が決まります。初心者が最初に覚えたいのはtype・id・nameです。

typeは入力欄の種類を決める

よく使うtypeは次のとおりです。

type用途例
text1行の文字入力氏名、会社名
emailメールアドレス入力連絡先メール
password入力文字を隠すパスワード
checkbox複数選択や同意興味のある項目、規約同意
radio一つだけ選択連絡方法、プラン
submitフォーム送信送信ボタン

送信ボタンはinput type="submit"でも作れますが、表示する文字や要素を柔軟に扱いやすいbuttonを使う方法も覚えておくと便利です。

idはページ内で要素を識別する

idはページ内で要素を識別する値です。labelのforから入力欄を指すときにも使います。同じページ内で重複しない値にします。

nameは送信データの項目名になる

nameは、送信データに付く項目名です。例えば、次の入力欄にhoai@example.comと入力すると、項目名emailと入力値hoai@example.comが組になります。ここでは、送信前の関係をemail=hoai@example.comと表しています。実際の送信時には、送信形式に応じて文字が符号化されます。

<input type="email" id="email" name="email">

入力欄が画面に表示されていても、nameがなければ通常のフォーム送信データにはその値が含まれません。

type="text"やtype="email"にHTMLで書くvalue属性は、最初に表示する値です。利用者が書き換えた後に送られるのは現在の入力値なので、HTMLに書いた初期値と分けて考えましょう。

labelのforとinputのidを関連付ける

labelとinputを関連付ける代表的な方法は、forとidに同じ値を書くことです。

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

MDNのlabel要素の解説でも、明示的な関連付けではinputのidと同じ値をlabelのforへ指定すると説明されています。

ラベルをクリックして入力欄を選べる

正しく関連付けると、ラベルの文字をクリックしたときに対応する入力欄へフォーカスが移ります。チェックボックスやラジオボタンでは、文字部分も選択に使えるため操作しやすくなります。

この例では、forとidの一致によって、どの項目名がどの入力欄に対応するかを伝えます。

for・idとnameは役割が異なる

forとidは、画面上でラベルと入力欄を結び付けます。一方、nameは送信先へ渡すデータの項目名です。

forとidは同じ値でラベルと入力欄を結び、nameは現在の入力値に付く送信項目名になる図
HOAI Point

forとidは「どのラベルがどの入力欄か」、nameは「送信先で何という項目か」と分けて覚えると、同じ値を機械的に書くのではなく役割から判断できます。

buttonのtypeを使い分ける

buttonのtypeには、主にsubmit・button・resetがあります。

type動作主な用途
submitフォームを送信する送信、登録、検索
buttonそれだけでは送信しないJavaScriptで開閉・追加などを行う
reset入力内容を初期値へ戻す限定的なリセット操作
<button type="submit">送信する</button>
<button type="button">入力欄を追加する</button>

MDNのbutton要素の解説では、フォームに関連付いたbuttonはtypeを指定しないとsubmitとして扱われること、送信しないボタンにはtype="button"を指定することが示されています。

フォーム内のbuttonは、送信させたいかどうかを判断してtypeを明示します。

HOAI Point

入力欄の表示切り替えなど、送信しない操作ボタンにはtype=”button”を明記して意図しない送信を防ぐのが安全です。

入力しやすいフォームにする基本

正しく送信できるだけでなく、何を入力すればよいかが分かり、キーボードや読み上げソフトでも操作しやすい形を目指します。

placeholderだけで項目名を済ませない

placeholderは入力例や補足に使えますが、入力を始めると見えなくなります。項目名はlabelで示し、placeholderは補助として使います。

入力後に項目名が消えるplaceholderだけの欄と、メールアドレスというlabelが残る欄の比較図
入力後の表示の要点を整理した図解です。
<label for="email">メールアドレス</label>
<input
  type="email"
  id="email"
  name="email"
  placeholder="name@example.com"
>

requiredは必須入力を示す

requiredを付けると、その入力欄を空のまま送信しようとしたときに、ブラウザの入力チェックが働きます。

<input type="text" id="name" name="name" required>

ただし、ブラウザ側のチェックだけに頼らず、送信先側でも入力値を検証します。

複数の選択肢はfieldsetとlegendでまとめる

ラジオボタンやチェックボックスが一つの質問に属する場合は、fieldsetでまとめ、legendで質問名を示せます。次は2項目の入力例から、連絡方法を選ぶ例への発展です。ここでは、labelでinputを囲む別の関連付け方を使っています。

<fieldset>
  <legend>希望する連絡方法</legend>

  <label>
    <input type="radio" name="contact" value="email">
    メール
  </label>

  <label>
    <input type="radio" name="contact" value="phone">
    電話
  </label>
</fieldset>

フォームが動かないときの確認ポイント

うまく動かないときは、自分の症状に合う項目から確認します。直した後は保存・再読み込みし、その症状が解消すれば確認を終えて構いません。

入力欄の一部が送信対象にならない

この基本例では、一緒に送信したい入力欄と送信ボタンを、同じform内へ置きます。終了タグが途中に入っていないか、別のformを入れ子にしていないかを確認します。送信先を用意した段階で、必要な項目が一緒に届けば修正できています。

ラベルを押しても入力欄へ移動しない

labelのforと入力欄のidを、大文字小文字やハイフンも含めて一致させます。同じidをほかの入力欄に使っていないかも確認し、ラベルを押して狙った欄にカーソルが移れば完了です。

<!-- 一致している例 -->
<label for="user-email">メールアドレス</label>
<input id="user-email" name="email" type="email">

入力した値が送信先で見つからない

入力欄のnameが空になっていないか、送信先が受け取る項目名と一致するかを確認します。disabledで無効にした欄や、未選択のチェックボックス・ラジオボタンは送信されません。受け取り処理で、期待した項目名と値を確認できれば完了です。

ボタンを押しても送信が始まらない

ブラウザーが入力を促している場合は、必須項目やメール形式を直します。案内が出ない場合は、送信ボタンがtype="submit"か確認してください。反対に、送信したくない操作にはtype="button"を指定します。送信先を用意した後で、意図した動作になるか確かめます。

送信後にエラーが出る・メールが届かない

actionのURLと、そのURLで受け取る処理を確認します。練習コードの/contactは仮の指定なので、エラーになっても入力欄の書き方が原因とは限りません。実用化するときは、受け取り処理の仕様に合わせてactionとmethodを設定し、受付結果・保存内容・メール到着まで確認します。

一度に複数箇所を変えず、症状に関係する箇所を一つずつ直すと、原因を特定しやすくなります。

HTMLフォームでよくある質問

同じページにフォームを2つ置けますか?

置けます。ただし、form同士を入れ子にせず、別々に並べます。入力欄のidはページ全体で重複させず、それぞれのlabelのforを対応する値にします。

buttonとinput type=”submit”はどちらを使えばよいですか?

どちらもフォームを送信できます。文字以外の要素も含めて柔軟に内容を組み立てたい場合はbutton type="submit"が使いやすく、単純な送信ボタンならinput type="submit"でも構いません。

まとめ

HTMLフォームは、form・input・label・buttonの役割を分けて考えると書きやすくなります。

  • formは入力項目を一つの送信単位にまとめる
  • inputは文字や選択状態などの値を受け取る
  • labelは入力欄の意味を示し、forとidで関連付ける
  • nameは送信データの項目名になる
  • buttonはtypeで送信するかどうかを明示する
  • メール送信や保存には、HTMLとは別に受け取り処理が必要

まずは完成コードを保存してブラウザーで開き、ラベルのクリックと未入力・メール形式のチェックを試してみましょう。入力画面を確認できたら、必要な入力欄や送信先の設定へ進めます。

目的に合わせて次の内容を学ぶ

入力欄の種類や初期値を詳しく知りたい場合は、inputの解説へ進んでください。

入力画面を作れたら、送信先と送信方法を確認しましょう。受け取り側に合わせて設定する考え方を解説しています。

この記事を書いた人

横畑デザイン事務所代表。Webデザイナー・プログラミング講師として、WordPressを中心としたWebサイトの制作・運用と個別指導に携わっています。実際の制作や指導で培った知識と経験をもとに、Web制作やAI活用について、初心者が迷わず一歩を踏み出せる情報を分かりやすく発信しています。

目次